Plus à cette question sur le comptage d'inversion , j'ai trouvé un article qui prouve une limite inférieure sur la complexité de l'espace pour tous les algorithmes de streaming (exacts) . J'ai affirmé que cette limite s'étend à tous les algorithmes de temps linéaire. C'est un peu audacieux car en général, un algorithme de temps linéaire peut sauter à volonté (accès aléatoire) qu'un algorithme de streaming ne peut pas; il doit enquêter sur les éléments dans l'ordre. Je peux effectuer plusieurs passes, mais seulement constamment plusieurs (pour une exécution linéaire).
Par conséquent ma question:
Chaque algorithme de temps linéaire peut-il être exprimé comme un algorithme de streaming avec constamment de nombreuses passes?
L'accès aléatoire semble empêcher une (simple) construction de prouver une réponse positive, mais je n'ai pas non plus été en mesure de trouver un contre-exemple.
Selon le modèle de la machine, l'accès aléatoire peut même ne pas être un problème, au niveau de l'exécution. Je serais intéressé par les réponses pour ces modèles:
- Machine de Turing, entrée plate
- RAM, entrée sous forme de tableau
- RAM, entrée sous forme de liste chaînée
Réponses:
Pour que les algorithmes de streaming soient significatifs, ils doivent travailler avec une quantité d'espace de travail beaucoup plus petite que l'entrée elle-même. Par exemple, si vous autorisez la même quantité d'espace de travail que l'entrée, vous pouvez déclarer trivialement n'importe quel algorithme comme un «algorithme de streaming en un seul passage» qui copie d'abord l'entrée dans l'espace de travail en un seul passage, puis utilise uniquement le travail espace.
Je pense qu'il est typique de restreindre l'espace de travail à tout au plus polylogarithmique dans la taille d'entrée lorsque l'on parle d'algorithmes de streaming. Dans cette hypothèse, la sélection médiane n'a pas d'algorithme de diffusion en continu O (1) par le résultat de Munro et Paterson [MP80]: tout algorithme de diffusion en continu P pour la sélection médiane sur N éléments doit stocker Ω ( N 1 / P ) éléments. D'autre part, la sélection médiane a un algorithme déterministe de temps linéaire bien connu [BFPRT73].
[BFPRT73] Manuel Blum, Robert W. Floyd, Vaughan Pratt, Ronald L. Rivest et Robert E. Tarjan. Limites de temps pour la sélection. Journal of Computer and System Sciences , 7 (4): 448–461, août 1973. DOI: 10.1016 / S0022-0000 (73) 80033-9
[MP80] J. Ian Munro et Mike S. Paterson. Sélection et tri avec stockage limité. Informatique théorique , 12 (3): 315–323, novembre 1980. DOI: 10.1016 / 0304-3975 (80) 90061-4
la source
Dans le modèle de streaming, vous êtes uniquement autorisé à stocker des données supplémentaires constantes ou poly-logarithmiques lors de la numérisation via l'entrée. Si vous envisagez un algorithme de temps linéaire
qui suit le paradigme diviser pour régner , vous devez stocker plus d'informations et / ou vous devez parcourir vos données autant de fois que la profondeur de la récursivité.
Un exemple est l' algorithme DC3 pour construire le tableau de suffixes d'un texte (donné comme tableau dans le modèle RAM). Afin de construire un tableau de suffixes, vous regroupez les caractères en triplets, vous obtenez donc un texte avec de nouveaux super-caractères . Vous pouvez le faire avec un décalage de 0 , 1 , 2 , ce qui donne trois nouveaux textes T 1 , T 2 , T 3 . Fait intéressant, vous pouvez calculer le tableau de suffixes si vous avez le tableau de suffixes de T 1 ⋅ T 2 en temps linéaire. D'où l'algorithme a besoinT 0,1,2 T1,T2,T3 T1⋅T2
temps. Cette récursivité résout clairement àt(n)=O(n) . Je ne vois pas comment cela peut être transformé en un algorithme de streaming.
Un autre exemple bien connu est l' algorithme classique de sélection en temps linéaire.
la source
J'interprète votre question comme suit. Fixons un problème de calcul . Nous définissons:P
Je pense donc que vous demandez quelle est la différence entre et SR(P) .S(P)
la source
Même dans la définition la plus simple d '"algorithme de streaming" (un algorithme qui, après chaque itération incrémentielle sur la source, entraîne la connaissance immédiate de la prochaine partie incrémentielle du résultat), je peux penser à quelques algorithmes linéaires qui ne le font pas se comporter de cette façon. Les algorithmes de hachage sont importants; FNV-1a est linéaire par rapport au nombre d'octets dans la source, mais nous ne connaissons aucune partie du hachage final tant que la source complète n'a pas été traitée.
RadixSort aka BucketSort est O (N) (techniquement O (NlogM) où M est la valeur maximale dans les N éléments, qui est considérée comme petite), et doit fonctionner dans son intégralité pour garantir que chaque élément individuel est à sa place finale.
Pour être un algorithme de "streaming", au plus simple, un algorithme doit avoir les deux propriétés suivantes, dont aucune n'est expressément limitée dans le temps:
Par conséquent, la principale classe d'algorithmes qui diffusent est celle des algorithmes qui effectuent des "projections" (transformations incrémentielles d'une entrée vers X> 0 sorties).
la source