web-dev-qa-db-fra.com

comment appliquer la recherche binaire O (log n) sur une liste chaînée triée?

Récemment, je suis tombé sur une question intéressante sur la liste chaînée. Une liste triée de liens simples est donnée et nous devons rechercher un élément de cette liste. 

La complexité temporelle ne devrait pas dépasser O(log n). Il semble que nous devions appliquer la recherche binaire sur cette liste chaînée. Comment? Comme la liste chaînée ne fournit pas d'accès aléatoire si nous essayons d'appliquer un algorithme de recherche binaire, il atteindra O(n) car nous devons trouver la longueur de la liste et aller au milieu.

Des idées? 

34
u449355

Ce n’est certainement pas possible avec une simple liste à liens simples.

Preuve d'esquisse: pour examiner le dernier nœud d'une liste à lien unique, nous devons exécuter les opérations n-1 consistant à suivre un pointeur "suivant" [preuve par induction sur le fait qu'il n'y a qu'une seule référence au nœud k+1th et kth node, et il faut une opération pour le suivre]. Pour certaines entrées, il est nécessaire d’examiner le dernier nœud (en particulier si l’élément recherché est supérieur ou égal à sa valeur). Par conséquent, pour certaines entrées, le temps requis est proportionnel à n.

Vous avez besoin de plus de temps ou d'une structure de données différente.

Notez que vous pouvez le faire dans O (log n) comparaisons avec une recherche binaire. Cela prendra juste plus de time que cela, donc ce fait n’a d’intérêt que si les comparaisons sont beaucoup plus chères que le parcours de liste.

38
Steve Jessop

Vous devez utiliser sauter la liste . Ce n'est pas possible avec une liste chaînée normale (et je veux vraiment savoir si cela est possible avec une liste normale). 

29
taskinoor

Dans la liste chaînée, la recherche binaire peut ne pas aboutir à une complexité de O (log n) mais peut être réduite au minimum en utilisant la méthode du double pointeur comme décrit ici dans ce travail de recherche: http://www.ijcsit.com/docs /Volume%205/vol5issue02/ijcsit20140502215.pdf

2
sundar

Comme indiqué, ceci n’est généralement pas possible. Toutefois, dans un langage comme C, si les nœuds de la liste sont alloués de manière contiguë, il serait possible de traiter la structure comme un tableau de nœuds. 

Évidemment, il ne s’agit que d’une réponse à une question piège, mais le problème reste toujours une question impossible.

0
Marcin