Para poder explicar o problema P vs NP a não matemáticos, eu gostaria de ter um exemplo pedagógico de quando a busca por força bruta pode ser evitada. Idealmente, o problema deve ser imediatamente compreensível e o truque não deve ser muito fácil nem muito difícil.
O melhor que eu vim até agora é
SUBSET_PRODUCT_IS_ZERO
O problema é fácil de entender (dado um conjunto de números inteiros, um subconjunto com o produto 0 pode ser formado?), Mas o truque é muito fácil (verifique se 0 está entre os números fornecidos, ou seja, não é necessário examinar muitos subconjuntos).
Alguma sugestão?
Respostas:
Eu recomendo Jenga !
Supondo que você tenha dois jogadores perfeitamente lógicos, sóbrios e hábeis, o Jenga é um jogo para dois jogadores com informações perfeitas, como Damas ou Go. Suponha que o jogo comece com uma pilha de tijolos , com 3 tijolos em cada nível. Na maior parte do jogo, cada jogador tem escolhas em cada turno para o próximo movimento e, na ausência de erros estúpidos, o número de turnos é sempre entre e . Tão grosseiramente, a árvore do jogo possui estados. Se você explorou a árvore do jogo com força bruta, pode gastar um tempo exponencial para encontrar uma jogada vencedora ou convencer-se de que não pode vencer.Θ ( N ) N 6 N N Θ ( N )3 N Θ ( N) N 6 N NΘ ( N)
Mas, de fato, Uri Zwick provou em 2005 que você pode jogar Jenga perfeitamente, acompanhando apenas três números inteiros, usando um conjunto simples de regras que você pode encaixar facilmente em um cartão de visita. Os três números que você precisa são
De fato, na maioria das vezes, você só precisa se lembrar de e vez de e . Aqui está a estratégia completa para ganhar:n mod 3 m mod 3 n m
Aqui II significa que você deve mover o tijolo do meio de qualquer camada 3 no topo, II- significa que você deve mover um tijolo de lado de uma camada 3 para o topo, -I- significa que você deve mover o tijolo do lado de uma camada 2 para o topo, e o bob-omb significa que você deve pensar na morte e ficar triste e tal . Se houver mais de um movimento sugerido em uma caixa, você poderá escolher qualquer um deles. É trivial executar essa estratégia no tempo se você já conhece o tempo triplo , ou no tempo se não conhece .O ( 1 ) ( m , n , t ) O ( N)
Moral: Jenga só é divertido se todos forem desajeitados e / ou bêbados.
fonte
Um caixa deve devolver centavos de alteração a um cliente. Dadas as moedas que ela tem disponíveis, ela pode fazê-lo e como?x
Existem duas variantes do problema:
A variante fácil pode ser resolvida com um algoritmo ganancioso. O mais difícil requer programação dinâmica.
Na verdade, a maneira de apresentar isso é propor a solução de força bruta, fazer com que as pessoas entendam que é muito ineficiente e, em seguida, perguntar-lhes o que os caixas fazem, primeiro pela variante fácil e depois pela difícil. Você deve ter alguns exemplos disponíveis que vão de fácil a desagradável.
fonte
Acho que encontrei um exemplo útil!
Talvez eu estivesse um pouco vago, mas estava procurando um problema que atendesse às seguintes especificações:
Para o Ciclo Euleriano, é fácil explicar que é uma condição necessária para que cada nó tenha um grau uniforme, mas não é tão fácil explicar por que é uma condição suficiente.
Este é o problema que, até agora, acho que melhor atende à especificação acima:
FORM_TARGET_SET_WITH_UNIONS
Coleção de conjuntosC= { S1, S2, . . . , Sn}
Conjunto de metasT
Pergunta: É possível formar o conjunto de destino tomando a união de alguns dos conjuntos em ?T C
Algoritmo óbvio, mas ineficaz:
Algoritmo melhor
Há também o problema da irmã
FORM_TARGET_SET_WITH_INTERSECTIONS
para o qual o melhor algoritmo é
Como você pode ver, eu estava procurando por algo realmente simples (quase tão simples quanto SUBSET_PRODUCT_IS_ZERO).
O problema também pode ser contrastado com SUBSET SUM e SUBSET PRODUCT, que são NP completos, mas similares em sua formulação. Em todos esses problemas, é apresentado um conjunto de objetos e perguntado se uma operação em uma seleção desses objetos pode produzir o resultado desejado.
fonte