Voici un problème bien connu.
Étant donné un tableau d'entiers positifs, affichez le plus petit entier positif ne figurant pas dans le tableau.
Le problème peut être résolu dans l' espace et le temps : lire le tableau, garder une trace dans l' espace que soient produits, rechercher le plus petit élément.
J'ai remarqué que vous pouvez échanger de l'espace contre du temps. Si vous avez mémoire uniquement, vous pouvez le faire enkrounds et obtenir le tempsO(kn). Dans un cas particulier, il existe évidemment un algorithme à temps quadratique à espace constant.
Ma question est:
Est-ce le compromis optimal, c'est-à-dire que le ? En général, comment prouver un tel type de bornes?
Supposons un modèle RAM, avec arithmétique bornée et accès aléatoire aux tableaux dans O (1).
Inspiration pour ce problème: compromis temps-espace pour les palindromes dans le modèle à une bande (voir par exemple ici ).
Réponses:
Cela peut être fait enO(nlogn) opérations de mots et O(1) mots de mémoire (respectivement O(nlog2n) temps et O(logn) mémoire n ) dans le modèle RAM au niveau des bits). En effet, la solution sera basée sur l'observation suivante.
Disons qu'il y an0 pairs et n1 nombres impairs dans la plage [1,n+1] (donc n0≈n1 et n0+n1=n+1 ). Alors il y a b∈{0,1} tel qu'il y ait au plus nb−1 valeurs avec parité b en entrée. En effet, sinon il y a au moins pair et au moins nn0 n1 valeurs impaires en entrée, ce qui signifie qu'il y a au moinsn0+n1=n+1 valeurs en entrée, contradiction (il n'y en a quen ). Cela signifie que nous pouvons continuer à rechercher le nombre manquant uniquement parmi les nombres pairs ou impairs. Le même algorithme peut également être appliqué à des bits supérieurs de notation binaire.
Donc, notre algorithme ressemblera à ça:
Supposons que nous avons déjà maintenant qu'il n'y a quex valeurs en entrée avec le reste modulo 2b égal à r∈[0,2b) mais qu'il y a au moins x+1 nombres dans la plage [1,n+1] qui ont reste r modulo 2b (au départ on sait que pour b=0,r=0 ).
Disons qu'il y ax0 valeurs dans l'entrée avec le reste r modulo 2b+1 et x1 valeurs dans l'entrée avec le reste r+2b modulo 2b+1 (nous pouvons trouver ces nombres en un seul passage à travers l'entrée). Clairement, x0+x1=x . De plus, comme il y a au moins x+1 nombres en entrée avec le reste r modulo 2b , au moins une des paires(r,b+1),(r+2b,b+1) satisfait aux exigences de l'étape1 .
Nous avons trouvé le nombre manquant lorsque2b⩾n+1 : il n'y a qu'un seul nombre dans la plage [1,n+1] qui peut avoir le reste r modulo 2b ( r lui-même s'il est dans la plage), donc il y a à la plupart des valeurs nulles dans l'entrée qui ont un tel reste. Il manque donc r .
De toute évidence, l'algorithme s'arrête enO(logn) étapes, chacun d'eux a besoin de O(n) temps (passage unique sur le tableau d'entrée). De plus, seuls O(1) mots de mémoire sont nécessaires.
la source
Si je comprends vos définitions, cela peut se faire en temps linéaire avec un espace constant. C'est évidemment la borne la plus basse, car nous devons au moins lire l'intégralité de l'entrée.
La réponse donnée dans cette question est satisfaisante.
Il est impossible d'exécuter cela avec moins de temps ou d'espace, et l'ajout de temps ou d'espace supplémentaire est inutile, il n'y a donc pas de compromis espace-temps ici. (Observez que , donc le compromis que vous avez observé ne tient pas asymptotiquement, en tout cas.)n=O(n/k)
En termes de votre question générale, je ne connais pas de bons théorèmes qui vous aideront à prouver les compromis espace-temps. Cette question semble indiquer qu'il n'y a pas de réponse facile (connue). Fondamentalement:
est inconnue, et une réponse forte résoudrait beaucoup de problèmes ouverts (notamment sur SC), ce qui implique qu'aucune solution facile n'existe.
EDIT: Ok, avec répétition (mais je suppose toujours qu'avec une entrée de taille le nombre maximum possible est n + 1 ).n n+1
Observez que notre algorithme doit pouvoir différencier au moins réponses possibles. Supposons qu'à chaque passage dans les données, nous puissions obtenir au plus k éléments de données. Ensuite, nous aurons besoin de n / k passes pour différencier toutes les réponses. En supposant que k = n / s alors nous courons en nn k n/k k=n/s temps. Je pense donc que cela prouve ce que vous voulez.nn/sn=sn
La difficulté est de montrer qu'à chaque fois, nous n'obtenons que bits. Si vous supposez que notre seule opération légale est =, alors nous sommes bons. Cependant, si vous autorisez des opérations plus complexes, vous pourrez obtenir plus d'informations.k
la source