2012-07-13 14 views
16
int currentMinIndex = 0; 

for (int front = 0; front < intArray.length; front++) 
{ 
    currentMinIndex = front; 

    for (int i = front; i < intArray.length; i++) 
    { 
     if (intArray[i] < intArray[currentMinIndex]) 
     { 
      currentMinIndex = i; 
     } 
    } 

    int tmp = intArray[front]; 
    intArray[front] = intArray[currentMinIndex]; 
    intArray[currentMinIndex] = tmp; 
} 

Il ciclo interno sta iterando: n + (n-1) + (n-2) + (n-3) + ... + 1 volte.Perché bubble sort O (n^2)?

Il ciclo esterno sta iterando: n volte.

in modo da ottenere n * (la somma dei numeri da 1 a n)

non è che n * (n * (n + 1)/2) = n * ((n^2) + n/2)

Quale sarebbe (n^3) + (n^2)/2 = O (n^3)?

Sono positivo, sto sbagliando. Perché non è O (n^3)?

+0

Si sta contando il 'n' esterno due volte. Il tuo ciclo interno stesso è O (n). –

+8

Non per nitpick ma l'algoritmo che mostri è un [Selection sort] (http://en.wikipedia.org/wiki/Selection_sort) non un [Bubble sort] (http://en.wikipedia.org/wiki/Bubble_sort) –

+1

La scorsa settimana, ho scritto un articolo sulla complessità asintotica e per coincidenza, io uso bubble sort come esempio. Dagli un colpo :-) (http://en.algoritmy.net/article/44682/Asymptotic-complexity). Il tuo errore è, come è stato correttamente detto da Henk, che il ciclo interno è O (n). O (n^2) - la somma dell'ordine aritmetico è la complessità di entrambi i cicli insieme. – malejpavouk

risposta

22

Sei corretto che il ciclo esterno itera su n volte e il ciclo interno itera anche n volte, ma stai contando due volte il lavoro. Se si conta il totale del lavoro svolto sommando il lavoro svolto per ogni iterazione del ciclo di primo livello si ottiene che la prima iterazione non funziona, la seconda n - 1, la terza n - 2, ecc., Dal momento che l'ith l'iterazione del ciclo di livello superiore ha il ciclo interno che esegue il lavoro n - i.

In alternativa, è possibile eseguire il conteggio del lavoro svolto moltiplicando la quantità di lavoro eseguita dal ciclo interno per il numero totale di volte in cui il ciclo viene eseguito. Il ciclo interno esegue O (n) su ogni iterazione e il ciclo esterno esegue le iterazioni O (n), quindi il lavoro totale è O (n).

Si sta commettendo un errore cercando di combinare queste due strategie. È vero che il ciclo esterno non funziona la prima volta, quindi n - 1, quindi n - 2, ecc. Tuttavia, non si moltiplica questo lavoro per n per ottenere il totale. Questo conterebbe ogni iterazione n volte. Invece, puoi semplicemente sommarli insieme.

Spero che questo aiuti!

+1

Grazie mille. Vedo cosa stavo facendo ora sbagliato – ordinary

+2

Potrebbe essere utile aggiungere che Big O descrive la frequenza _ di crescita di un algoritmo proporzionale alla dimensione degli input che non è necessariamente la stessa cosa della quantità esatta di iterazioni eseguite per l'algoritmo da eseguire. –

+0

Sarebbe corretto dire che BubbleSort completa (n-1) * (n-1) iterazioni? quindi N^2 iterazioni. Questa è la complessità del tempo. Ho ragione nell'assumere questo? – user3396486

1

I itera anello interno di n volte (nel caso peggiore):

for(int i = front; i < intArray.length; i++) 

itera ciclo esterno n volte:

for(int front = 0; front < intArray.length; front++) 

Pertanto O (n^2)

6

tuo interno loop iterating, IN TOTAL, come hai detto n + (n-1) + (n-2) + (n-3) + ... + 1 volte. Quindi è O (n + (n-1) + (n-2) + (n-3) + ... + 1) = O (n (n + 1)/2) = O (n^2)

+0

Ah ho appena avuto il momento Aha. ty. – ordinary

+1

Risolvi (n * (n + 1))/2 per n = 5 e ottieni 15, non 5^2 = 25. Non lo stesso. – ruralcoder

1

Come è fondamentalmente calcolare N ...

  • Ogni riga: 1
  • Ogni loop * N

    numeri Così si inizia ad aggiungere arrivare al tuo primo loop ora avete N + 1, vai avanti e alla fine ottieni N * N o N^2 per il tempo più un certo numero. Tirando fuori il numero come è generalmente insignificante rispetto a N.

Praticamente N è una rappresentazione di tutti gli elementi del tipo ad anello di come 1,2,3 ... N. Quindi rappresenta semplicemente un numero non quante volte un loop, loop.

-1

Solo per il gusto di avere una versione Python di bubble sort ...

def bubble_sort(input): 
    n = len(input) 
    iterations = 0 
    for i in xrange(n, 1, -1): 
     for j in range(0, i - 1): 
      iterations += 1 
      if input[j] > input[j+1]: 
       input[j],input[j+1] = input[j+1],input[j] 

    print iterations 
    return input 

Le iterazioni sono state aggiunte al ciclo interno per contare le iterazioni totali. Niente a che fare con il bubble sort.

Passando un array di 5 elementi, il risultato è 15 iterazioni non 25. Anche quando pre-ordinato, risulta anche in 15 iterazioni. Ma la complessità deve anche tener conto del confronto e dello scambio.

1
k=1(sigma k)n = n(n+1)/2 
because: 
    s = 1 + 2 + ... + (n-1) + n 
    s = n + (n-1) + ... + 2  + 1 
+) 
=================================== 
    2s = n*(n+1) 
    s = n(n+1)/2 
in bubble sort, 
(n-1) + (n-2) + ... + 1 + 0 times compares 
which means, k=0(sigma k)n-1 
, k=0(sigma k)n-1 equals [k=1(sigma k)n] - n 
therefore, n(n+1)/2 - n = n(n-1)/2 
which is 1/2(n^2-n) => O(1/2(n^2-n)) 
in big O notation, we remove constant, so 
O(n^2-n) 
n^2 is larger than n 
O(n^2)