Considere o seguinte problema:
Entrada : lista de números inteiros
Objetivo : determine se existe um número inteiro nas duas listas.
Suponha que ambas as listas sejam do tamanho n . Existe um algoritmo determinístico de tempo linear para esse problema? Em outras palavras, você pode resolver esse problema em O ( n ) tempo deterministicamente, sem usar aleatoriedade?
Infelizmente, você não pode assumir que os elementos da lista são todos pequenos.
Eu posso ver como resolvê-lo no tempo esperado de usando um algoritmo aleatório: escolha aleatoriamente uma função hash 2 universal h , armazene os elementos de X em uma hashtable (usando h como função hash) e, em seguida, procure cada elemento de Y para ver se está na hashtable. O tempo de execução esperado será O ( n ) . No entanto, não consigo ver como encontrar um algoritmo determinístico com O ( n ) tempo de execução. Se você tentar des randomizar isso e corrigir uma única função hash específica, haverá uma entrada no pior caso que fará com que este procedimento seja executado em tempo. O melhor algoritmo determinístico que posso encontrar envolve a classificação dos valores, mas isso não será em tempo linear. Podemos obter tempo de execução linear?
Além disso, eu posso ver como resolvê-lo em tempo linear se você assumir que todos os elementos da lista são números inteiros no intervalo (basicamente, faça a contagem de classificação) - mas estou interessado no que acontece no geral caso em que não podemos assumir isso.
Se a resposta depende do modelo de computação, o modelo de RAM é lembrado, mas eu estaria interessado nos resultados de qualquer modelo razoável de computação. Estou ciente de limites inferiores para algoritmos de árvore de decisão para exclusividade do elemento , mas isso não é definitivo, pois às vezes podemos encontrar algoritmos de tempo linear mesmo quando existe um Ω ( n log n ) vinculado em o modelo da árvore de decisão.
Respostas:
Você pode resolver o problema em tempo linear se tiver memória suficiente para ter um pouco para cada valor possível em X e Y. Isso não impõe restrições à ordenação de X e Y.
fonte
Como você está dizendo que as duas listas contêm números inteiros, acho que podemos executar uma classificação radix nas duas listas e, em seguida, fazer uma pesquisa linear comparando as duas listas por itens equivalentes.
fonte
fonte
fonte