Existe-t-il une structure de données qui prend un tableau non ordonné de éléments, effectue un prétraitement dans et répond aux requêtes: existe-t-il un élément dans la liste, chaque requête au pire moment ?O ( n ) x O ( log n )
Je pense vraiment qu'il n'y en a pas, donc la preuve qu'il n'y en a pas est également la bienvenue.
ds.data-structures
sorting
Chi-Lan
la source
la source
Réponses:
Voici une preuve que c'est impossible. Supposons que vous puissiez construire une telle structure de données. Construit le. Choisissez ensuite éléments au hasard dans la liste, ajoutez à chacun d’eux, où est inférieur à la différence entre deux éléments de la liste, puis exécutez les requêtes pour vérifier si l’un des éléments résultants est correct. est dans la liste. Vous avez déjà effectué requêtes.e e O ( n )n / logn ε ε O ( n )
Je voudrais affirmer que les comparaisons que vous avez effectuées sont suffisantes pour dire si un élément de la liste d'origine est plus petit ou plus grand que tout nouvel élément . Supposons que vous ne puissiez pas dire. Ensuite, puisqu'il s'agit d'un modèle basé sur la comparaison, vous ne pouvez pas savoir si est égal à ou non, ce qui contredit l'hypothèse selon laquelle votre structure de données fonctionne.b a bune b une b
Maintenant, puisque les éléments vous avez choisis étaient aléatoires, vos comparaisons ont avec une probabilité élevée suffisamment d’informations pour diviser la liste initiale en répertorie chacune des tailles de taille . En triant chacune de ces listes, vous obtenez un algorithme de tri temporel aléatoire basé uniquement sur des comparaisons, une contradiction.n / log n O ( log n ) O ( n log log n )n / logn n / logn O ( logn ) O ( n logbûchen )
la source
Je crois qu’il s’agit d’une preuve différente, prouvant l’impossibilité d’une structure temporelle de requêtes , avec un prétraitement O ( n ) .O ( logkn ) O ( n )
Supposons que dans le prétraitement, vous faites des comparaisons , aboutissant à un ordre partiel.O ( n )
Considérons maintenant la taille du plus grand antichain en cela. Puisque ces éléments ne sont pas comparables, pour que nous ayons un algorithme de requête O ( log k n ) , nous devons avoir ce A = O ( log k n ) .UNE O ( logkn ) A = O ( logkn )
Selon le théorème de Dilworth, il existe une partition de taille , en chaînes.UNE
Nous pouvons maintenant compléter l’algorithme pour déterminer les chaînes dans la partition. Nous pouvons déterminer si deux éléments sont comparables en créant un graphe de comparaisons dirigé et en effectuant une analyse d'accessibilité. Cela peut être fait sans comparaison supplémentaire. Il suffit maintenant de forcer brutalement chaque partition possible de taille pour déterminer s’il s’agit d’une partition de chaînes.UNE
Une fois que nous avons les chaînes, nous pouvons les fusionner pour donner un algorithme de comparaison permettant de trier la liste complète.O ( n logbûchen )
la source
Comme le note la réponse de Peter Shor, pour exclure l'appartenance à un modèle basé sur la comparaison, nous devons savoir comment l'élément se compare à chaque membre. Ainsi, en utilisant requêtes aléatoires (le nombre de membres inférieur au non-membre interrogé est aléatoire), nous obtenons des informations Θ ( n log k ) relatives à n valeurs non triées. Par conséquent, pour une constante c > 0 , en utilisant ck < n Θ (nlogk ) n c > 0 pré-traitement, on ne peut pas avoir ≤ ccn journalk coût de la requête. C'est optimal jusqu'à un facteur constant puisque nous pouvons trier les données dans k ′ = k / log k ≤ n / log n compartiments approximativement égaux (chaque compartiment non trié) dans O ( n log k ′ ) = O ( n log k ) temps, ce qui permet à O ( n / k ′ ) le coût de la requête.≤ cn journalk / k k′= k / logk ≤ n / logn O ( n logk′) = O ( nlogk ) O(n/k′)
En particulier, en utilisant le prétraitement , nous ne pouvons pas avoir le coût de la requête o ( n ) . En outre, le prétraitement o ( n log n ) correspond à k dans O ( n ε ) pour chaque ε > 0 et donc pour Ω ( n 1 - ε ), le coût de la requête.O(n) o(n) o(nlogn) k O(nε) ε>0 Ω(n1−ε)
la source