Je suis coincé sur ce problème:
Étant donné un tableau des premiers nombres naturels permutés de façon aléatoire, un tableau est construit, de telle sorte que est le nombre d'éléments de à qui sont plus petits que . n B B ( k ) A ( 1 ) A ( k - 1 ) A ( k )
i) Étant donné pouvez-vous trouver en temps ? ii) Étant donné pouvez-vous trouver en temps ?B O ( n ) B A O ( n )
Ici, . Pour un exemple concret: | A 8 4 3 1 7 2 9 6 5 B 0 0 0 0 3 1 6 4 4 |
Quelqu'un peut-il m'aider? Merci.
Réponses:
L'algorithme naïf pour déterminer partir de :AB UNE
Cet algorithme compare à tous les autres ( fois), à autres, etc. donc le nombre total de comparaisons est . Mais ce n'est pas le mieux que nous puissions faire. Par exemple, en regardant , nous n'avons pas à faire de comparaisons! car il s'agit des premiers nombres naturels, et il est garanti (quelle que soit la permutation) que les nombres naturels inférieurs seront là. Et ? Au lieu de vérifier à , nous pourrions simplement vérifier . C'est:n - 1 A ( 2 ) n - 2 ( n - 1 ) ( n - 2 )A ( 1 ) n - 1 A ( 2 ) n - 2 B(n)B(n)=A(n)-1nn-1B(n-1)A(1)A(n-2)A(n)( n - 1 ) ( n - 2 )2 B ( n ) B ( n ) = A ( n ) - 1 n n−1 B(n−1) A(1) A(n−2) A(n)
Cela prendrait étapes, qui est toujours . Notez également qu'en construisant partir de , si alors . O(n2)ABB(n)=A(n)-1A(n)=B(n)+12×(n2−1)(n2−2)2=(n−2)(n−4)4 O(n2) A B B(n)=A(n)−1 A(n)=B(n)+1
Mais maintenant pour plus de finesse. Si nous avons droit à un espace supplémentaire ou à un tri sur place, nous pouvons trier les chiffres en les comparant. Par exemple:
Au lieu de les vérifier tous (ou de les vérifier dans l'ordre), nous pourrions utiliser la recherche binaire pour déterminer chaque . Cependant, le tri prend encore du temps .B(k) O(nlogn)
la source
Plutôt que de déterminer chaque un à la fois, nous pouvons être tournés vers l'avenir et ne parcourir chaque numéro de qu'une seule fois ! Mais nous utiliserons espace:B(k) A n
Nous pourrions gagner encore plus de temps en ne mettant pas à jour ceux qui ont déjà été déterminés (c'est-à-dire qu'il est inutile de mettre à jour après la première étape), mais dans le pire des cas, nous devons encore mettre à jour fois8 (n)(n+2)2
la source
I et II peuvent être résolus en utilisant #next_greater_element que j'ai expliqué ici . mais c'est un peu plus difficile que le problème, mais avant la solution, vous devez apprendre le prochain élément plus important:
la deuxième partie est également similaire en notant que nous pouvons obtenir la valeur de l'élément le plus à droite dans EDIT: ma solution est fausse il semble qu'elle n'a pas de solutiono ( n )O(1) o(n)
la source