Évaluation de la complexité temporelle moyenne d'un algorithme deort de bulles donné.


11

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:

i=0n(j=0n(i+1)O(1)+O(1))=O(n22+n2)=O(n2)

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é.


6
vous devez d'abord définir ce que signifie moyenne. Puisque l'algorithme est déterministe, vous devez supposer une sorte de distribution sur les entrées.
Suresh

@Sim Pouvez-vous montrer comment vous avez calculé la complexité temporelle la plus défavorable? Ensuite, nous pourrions avoir une idée de ce que vous entendez par complexité moyenne dans votre cas.
0x0

Je veux dire le temps moyen dans le sens du temps le plus probable nécessaire (ou en d'autres termes la version mathématique «pure» de: la moyenne de tous les temps observés faisant une analyse statistique). Par exemple, quicksort a une moyenne de nlogn même si son pire cas est n ^ 2.
Sim

1
@Sim Dans le cas du tri moyen des bulles, cas moyen = pire complexité du temps, ce qui signifie que la complexité moyenne du temps est également n2
0x0

3
Il y a une différence. quicksort est en moyenne "sur le choix des lancers de pièces lors du choix d'un pivot" qui n'a rien à voir avec les données. Alors que vous sous-entendez que vous voulez faire la moyenne "sur toutes les entrées", ce qui suppose (par exemple) que vous vous attendez à ce que chaque ordre de l'entrée se produise avec la même probabilité. c'est raisonnable, mais cela devrait être indiqué explicitement.
Suresh

Réponses:


9

nn!1n

n!

(xi)inddxiimaxi(max(1,ixi))

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 ddcdd

1n! d=0n dcd

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»


Si vous considérez une distribution normale, existe-t-il un moyen d'approximer ? cd
Sim

Vous pouvez direcar vous pouvez mêler n'importe où toutes les permutations de [ , .., ] et ajouter à la fin mais c'est petit pour prouver en moyenne. 2 d 1cd(n+1d)(d1)!2d1n²
jmad

19

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<jA[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 .PR(P)PP=2,1,3,4R(P)=4,3,1,2

Pour chaque paire d'indices il y a une inversion dans exactement l'un de ou .(i,j)PR(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(n1)/2

n(n1)4

cela évalue la quantité d'inversions. mais que diriez-vous du nombre de comparaisons qui dépend du moment où la pause est introduite
Sim

Vous obtenez une comparaison par échange et, surtout, un échange peut réduire le nombre d'inversions d'au plus un.
jmad

toutes les comparaisons n'entraînent pas un échange, si la clause if est fausse, aucune inversion n'est effectuée.
Sim

@rgrig Si vous fournissez un contre-exemple, je corrigerai ma réponse.
Joe

@Joe: J'ai supprimé mon commentaire. C'était faux.
rgrig

2

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(n1)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)


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.