Considérant ce pseudo-code d'une bulle:
FOR i := 0 TO arraylength(list) STEP 1
switched := false
FOR j := 0 TO arraylength(list)-(i+1) STEP 1
IF list[j] > list[j + 1] THEN
switch(list,j,j+1)
switched := true
ENDIF
NEXT
IF switched = false THEN
break
ENDIF
NEXT
Quelles seraient les idées de base que je devrais garder à l'esprit pour évaluer la complexité temporelle moyenne? J'ai déjà accompli le calcul des pires et des meilleurs cas, mais je suis coincé à réfléchir à la façon d'évaluer la complexité moyenne de la boucle interne, pour former l'équation.
L'équation du pire cas est:
dans lequel le sigma intérieur représente la boucle intérieure, et le sigma extérieur représente la boucle extérieure. Je pense que je dois changer les deux sigmas en raison de la clause "if-then-break", qui pourrait affecter le sigma externe mais aussi en raison de la clause if dans la boucle interne, qui affectera les actions effectuées pendant une boucle (4 actions + 1 comparaison si vrai, sinon juste 1 comparaison).
Pour des éclaircissements sur le terme temps moyen: cet algorithme de tri aura besoin de temps différent sur différentes listes (de même longueur), car l'algorithme peut avoir besoin de plus ou moins d'étapes dans / dans les boucles jusqu'à ce que la liste soit complètement en ordre. J'essaie de trouver une méthode mathématique (non statistique) pour évaluer la moyenne de ces rondes nécessaires.
Pour cela, je m'attends à ce que toute commande soit de la même possibilité.
Réponses:
Ensuite, vous faites le calcul: pour chaque trouvez le nombre de listes avec cette distance maximale particulière, alors la valeur attendue de est:c d dd cd d
Et ce sont les pensées de base sans la partie la plus difficile qui trouve . Il existe peut-être une solution plus simple.cd
EDIT: ajouté «attendu»
la source
Rappelons qu'une paire (resp. ) est inversée si et .( i , j ) i < j A [ i ] > A [ j ](A[i],A[j]) (i,j) i<j A[i]>A[j]
En supposant que votre algorithme effectue un swap pour chaque inversion, le temps d'exécution de votre algorithme dépendra du nombre d'inversions.
Le calcul du nombre attendu d'inversions dans une permutation aléatoire uniforme est facile:
Laissez une permutation, et que soit l'inverse de . Par exemple, si alors .P R(P) P P=2,1,3,4 R(P)=4,3,1,2
Pour chaque paire d'indices il y a une inversion dans exactement l'un de ou .(i,j) P R(P)
Étant donné que le nombre total de paires est , et que le nombre total et chaque paire sont inversés dans exactement la moitié des permutations, en supposant que toutes les permutations sont également probables, le nombre attendu d'inversions est:n(n−1)/2
la source
Nombre de swaps <nombre d'itérations (dans les deux scénarios optimisé et simple bulle)
Nombre d'inversions = nombre de swaps.
Par conséquent, nombre d'itérations>n(n−1)4
Ainsi, la complexité moyenne des cas est . Mais, comme le cas moyen ne peut pas dépasser le pire des cas, nous obtenons que c'est ,O ( n 2 )ω(n2) O(n2)
Cela nous donne: Temps moyen =θ(n2)
(Complexité temporelle = nombre d'itérations nbre d'itérations> nbre de swaps)
la source
dans ce document, la complexité temporelle moyenne du tri à bulles a atteint O (nlog (n))! http://algo.inria.fr/flajolet/Publications/ViFl90.pdf
la source