Essa pode ser uma pergunta ridícula, mas é possível ter um problema que realmente fica mais fácil à medida que as entradas aumentam de tamanho? Duvido que quaisquer problemas práticos sejam assim, mas talvez possamos inventar um problema degenerado que possua essa propriedade. Por exemplo, talvez comece a "se resolver" à medida que aumenta, ou se comporta de alguma outra maneira bizarra.
algorithms
asymptotics
dsaxton
fonte
fonte
Respostas:
Não, não é possível: pelo menos, não em um sentido assintótico, onde você exige que o problema continue ficando estritamente mais fácil, para sempre, como .n → ∞
Seja o melhor tempo de execução possível para resolver esse problema, onde é o tamanho da entrada. Observe que o tempo de execução é uma contagem do número de instruções executadas pelo algoritmo, portanto, ele deve ser um número inteiro não negativo. Em outras palavras, para todos os . Agora, se considerarmos uma função , veremos que não existe uma função que diminua estritamente monotonicamente. (Seja o que for , ele deve ser finito, digamos ; mas, como é monotonicamente estritamente decrescente, en T ( n ) ∈ N n T : N → N T ( 0 ) T ( 0 ) = c T T ( c ) ≤ 0 T ( c + 1 ) ≤ - 1 T ( n ) n 0 n ≥ n 0 T ( n )T( N ) n T( n ) ∈ N n T: N → N T( 0 ) T( 0 ) = c T T( C ) ≤ 0 T( c + 1 ) ≤ - 1 , o que é impossível.) Por razões semelhantes, não há função que esteja assintoticamente estritamente diminuindo: podemos provar da mesma forma que não há função de tempo de execução onde exista modo que, para todos os , é monotonicamente estritamente decrescente (qualquer função desse tipo teria que se tornar eventualmente negativa).T( N ) n0 0 n ≥ n0 0 T( N )
Portanto, esse problema não pode existir, pela simples razão de que os tempos de execução precisam ser números inteiros não negativos.
Observe que esta resposta cobre apenas algoritmos determinísticos (ou seja, o pior tempo de execução). Não descarta a possibilidade de algoritmos aleatórios cujo tempo de execução esperado diminui estritamente monotonicamente, para sempre. Não sei se é possível que esse algoritmo exista. Agradeço a Beni Cherniavsky-Paskin por esta observação .
fonte
Embora não seja exatamente uma resposta para sua pergunta, o algoritmo de busca por cordas de Boyer-Moore se aproxima. Como Robert Moore diz em sua página da web sobre o algoritmo,
Em outras palavras, de maneira geral, o algoritmo procura por uma instância de uma cadeia de destino em uma cadeia de origem e por uma cadeia de origem fixa, quanto maior a cadeia de destino, mais rápido o algoritmo é executado.
fonte
Claramente, do ponto de vista puramente matemático, puramente de algoritmo CS, isso é impossível. Mas, na verdade, existem vários exemplos reais de quando o dimensionamento do seu projeto facilita, muitos dos quais não são intuitivos para os usuários finais.
Direções : quanto mais longas as rotas, às vezes elas ficam mais fáceis. Por exemplo, se eu quiser que o Google Maps me forneça instruções para ir para o oeste 3000 milhas, eu poderia dirigir até a costa oeste - e obter instruções de direção de cross-country. Mas se eu quisesse ir 9.000 milhas a oeste, acabaria com instruções significativamente mais simples: pegar um avião de Nova York a Hokkaido. Oferecer-me uma rota de cross-country que incorpore tráfego, estradas, condições meteorológicas etc. é um pouco difícil algoritmicamente, mas dizer-me para embarcar em um avião e procurar voos em um banco de dados é comparativamente mais simples. Gráfico ASCII de dificuldade vs distância:
Renderização : digamos que eu queira renderizar uma face e renderizar 1000 faces; trata-se de um anúncio em outdoor, portanto, as duas imagens finais devem ter 10000 x 5000 x 5000. Renderizar um rosto de forma realista seria difícil - com a resolução de vários milhares de pixels, é necessário usar máquinas realmente poderosas - mas para a multidão de 1000 rostos, cada rosto precisa ter apenas dez pixels de diâmetro e pode ser facilmente clonado! Provavelmente eu poderia render 1000 faces no meu laptop, mas renderizar uma face realista de 10000px levaria muito tempo e máquinas poderosas. Gráfico ASCII de dificuldade vs. objetos renderizados, mostrando como a dificuldade de renderizar n objetos para uma imagem de um tamanho definido diminui rapidamente, mas depois retorna lentamente:
Controle de hardware : muitas coisas com hardware ficam muito mais fáceis. "Mover motor X 1 grau" é difícil e / ou impossível, e você precisa lidar com todos os tipos de coisas com as quais não precisaria lidar com "mover motor X 322 graus".
Tarefas de curta duração: digamos que você queira que o item X esteja ativado por (muito pouco tempo) a cada segundo. Ao aumentar a quantidade de tempo que o X é executado, você precisará de um software menos complexo e de um hardware.
fonte
Existem casos. São os casos em que o critério de sucesso é uma função dos dados, em vez de tentar encontrar uma única resposta. Por exemplo, processos estatísticos cujos resultados são redigidos com intervalos de confiança podem se tornar mais fáceis.
Um caso particular em que estou pensando é em problemas que têm uma transição de comportamentos discretos para comportamentos contínuos, como fluxos de fluidos. Resolver o pequeno problema com um grau de erro pode envolver a modelagem de todas as interações discretas, o que pode exigir um supercomputador. Os comportamentos contínuos geralmente permitem simplificações sem produzir resultados fora de um limite de erro relacionado.
fonte
A questão é interessante e ÚTIL, porque nossa filosofia em informática é resolver problemas, quanto mais lemos, mais difícil é. Mas, de fato, a maioria dos problemas apresentados da maneira típica (difícil) pode ser facilmente representada da maneira "fácil"; mesmo sabendo a resposta da DW (que está errada, considerando que fácil não significa mais rápido, significa "menos lento"; portanto, você não precisa encontrar tempos negativos, mas sim encontrar um tempo assintótico).
O truque para encontrar um é colocar a parte da solução como dicas como uma entrada e considerar a entrada do problema como um parâmetro constante.
Exemplo: Qual é o caminho mais longo entre Londres e Paris, evitando visitar duas vezes uma cidade francesa e uma britânica e não visitar outro país? considerando, você tem que ir a Birmingham antes de Ashford, Orleans antes de Versailles, La Rochelle antes de Limoge, etc ...
É claro que esse problema com entradas longas será mais fácil do que com entradas curtas.
Exemplo de uso: imagine um jogo gerenciado pela máquina, e o IA do computador precisa determinar se ele precisa explorar mais a peça para encontrar mais dicas ou então, se é hora de deduzir qual é a melhor decisão a ser assumida .
fonte
Considere um programa que tenha como entrada o que você sabe sobre uma senha e tente decifrá-la. Eu acho que isso faz o que você quer. Por exemplo:
Devo acrescentar que isso é um truque, pois o problema declarado dessa forma é inverso ao tamanho da entrada. Você pode deixar de fora uma camada de abstração e dizer que o tamanho da entrada é grande para nenhuma entrada (verifique todos os símbolos e comprimentos de palavras) e pequeno se você digitar a senha correta no início.
Então, tudo se resume em quanta abstração você permite.
fonte
De fato, tenho um problema que fica menor à medida que os dados aumentam. Um dos meus aplicativos registra os atributos de um produto específico, como queijo. Os atributos são, por exemplo, CheeseType, Marca, País, Área, MilkType, etc. Todo mês ou mais, recebo uma lista de novos queijos que entraram no mercado durante esse período, juntamente com seus atributos. Agora, esses atributos são digitados à mão por um grupo de humanos. Alguns cometem erros de digitação ou simplesmente não sabem o valor de todos os atributos.
Quando você faz uma pesquisa no meu banco de dados, tento prever, a partir das estatísticas, o sabor do queijo, com base nesses atributos. O que acontece é que, para cada atributo, acabo com uma faixa de valores; alguns são válidos outros são inválidos. Eliminar ou corrigir esses inválidos só é possível se eu tiver dados suficientes. Trata-se de fazer a diferença entre valores reais e ruído, sem eliminar valores raros, mas válidos.
Como você pode imaginar, com baixo volume, o ruído é muito importante para consertar as coisas corretamente. Se você tem 5 instâncias de Cheddar, 1 de Brie, 1 de Bri e 1 de Chedar, como posso saber qual está correto e qual é um erro de digitação? Com mais volume, os erros de digitação tendem a se manter muito baixos, mas os valores raros obtêm alguns incrementos cruciais, fazendo-os escapar do barulho (respaldado pela experiência). Nesse caso, eu poderia imaginar 50000 Cheddar, 3000 Brie, 5 Bri, 15 Chedar, por exemplo.
Então, sim, alguns problemas se resolvem eventualmente, quando você tem dados suficientes.
fonte
Considere o problema NP-completo 3-SAT. Se você continuar aumentando o problema fornecendo entradas do formato x_i = true / false, você acaba convertendo as disjunções individuais em cláusulas de duas variáveis, criando um problema 2-SAT que é decididamente P, ou você simplesmente obtém uma resposta verdadeira / falsa.
No caso em que há redundância nas entradas x_i = true / false (a mesma entrada é fornecida várias vezes ou entradas contraditórias), você pode classificar facilmente as entradas e ignorar os valores redundantes ou relatar um erro se os valores contradizerem.
De qualquer forma, acho que isso representa um problema "realista" que fica mais fácil de resolver à medida que o número de entradas aumenta. O aspecto 'mais fácil' está na conversão de um problema NP-completo em um problema P. Você ainda pode jogar o sistema fornecendo entradas ridículas, de modo que apenas a classificação demore mais do que o bruto forçando o problema.
Agora, um cenário muito interessante seria se estamos dispostos a aceitar T (0) (utilizando a notação de DW na resposta acima) pode ser infinito. Por exemplo, T (0) poderia ser equivalente a resolver o problema de parada de Turing. Se pudéssemos conceber um problema de tal forma que adicionar mais insumos o converta em um problema solucionável, teremos encontrado ouro. Observe que não é suficiente convertê-lo em um problema solucionável assintoticamente - porque isso é tão ruim quanto a força bruta forçar o problema.
fonte
A pergunta é: "é possível ter um problema que realmente fica mais fácil à medida que as entradas aumentam de tamanho?" E se as entradas forem recursos a serem usados pelo algoritmo para trabalhar em um trabalho. É do conhecimento geral que quanto mais recursos, melhor. Abaixo está um exemplo, no qual quanto mais houver funcionários, melhor.
3) Saída:
A saída é o caminho entre as tarefas a serem executadas pelos funcionários. Cada caminho está associado ao número de funcionários que o seguem. Por exemplo:
4) Solução possível:
Uma solução possível é primeiro calcular o caminho mais curto para os nós mais próximos de A. Esse será um caminho direto. Em seguida, calcule recursivamente o caminho a seguir para cada tarefa visitada. O resultado é uma árvore. Por exemplo:
fonte