Considérez le problème suivant:
Entrée : liste des entiers
Objectif : déterminer s'il existe un entier qui figure dans les deux listes.
Supposons que les deux listes soient de taille . Existe-t-il un algorithme déterministe à temps linéaire pour ce problème? En d'autres termes, pouvez-vous résoudre ce problème en temps déterministe, sans utiliser le hasard?
Malheureusement, vous ne pouvez pas supposer que les éléments de la liste sont tous petits.
Je peux voir comment le résoudre dans le temps prévu utilisant un algorithme aléatoire: choisissez au hasard une fonction de hachage 2 universelle , stockez les éléments de dans une table de hachage (en utilisant comme fonction de hachage), puis recherchez chaque élément de pour voir s'il est dans la table de hachage. Le temps d'exécution prévu sera . Cependant, je ne vois pas comment trouver un algorithme déterministe avec un temps d'exécution . Si vous essayez de dérandomiser cela et de corriger une seule fonction de hachage spécifique, il existera une entrée dans le pire des cas qui entraînera l'exécution de cette procédure danstemps. Le meilleur algorithme déterministe que je puisse trouver consiste à trier les valeurs, mais ce ne sera pas du temps linéaire. Pouvons-nous atteindre un temps de fonctionnement linéaire?
De plus, je peux voir comment le résoudre en temps linéaire si vous supposez que tous les éléments de la liste sont des entiers dans la plage (en gros, trier le comptage) - mais je suis intéressé par ce qui se passe en général cas où nous ne pouvons pas supposer cela.
Si la réponse dépend du modèle de calcul, le modèle RAM me vient à l'esprit, mais je serais intéressé par les résultats de tout modèle de calcul raisonnable. Je connais les limites inférieures de pour les algorithmes d'arbre de décision pour l'unicité des éléments , mais ce n'est pas définitif, car parfois nous pouvons trouver des algorithmes à temps linéaire même lorsqu'il existe un lié dans le modèle d'arbre de décision.
Réponses:
Vous pouvez résoudre le problème en temps linéaire si vous avez suffisamment de mémoire pour avoir un bit pour chaque valeur possible dans X et Y. Cela n'impose aucune restriction de l'ordre de X et Y.
la source
Puisque vous dites que les deux listes contiennent des entiers, je suppose que nous pouvons exécuter un tri radix sur les deux listes, puis faire une recherche linéaire en comparant les deux listes pour des éléments équivalents.
la source
Pourquoi ne pas insérer les entiers de chaque liste dans un simple tri au niveau du bit? Ne serait-ce pas optimal, dans le sens où il s'agit de , où ¯ m est la taille moyenne des bits des entiers; en particulier, je ne vois pas comment vous pouvez faire mieux, car simplement * la lecture * des deux listes prendrait ce temps.O(n⋅m¯¯¯¯¯) m¯¯¯¯¯
la source
la source