2016-05-02 15 views
3

ich einen einfachen Test laufen zu überwachen, wie lange dauert es, zu sortieren, setzen Sie in eine Liste mit der bisect BibliothekPython-Halbierung ist O (n^2)?

import numpy as np 
import bisect 

def get_time(N): 
    myl = [] 
    a = time.time() 
    for i in np.arange(N): 
     bisect.insort_left(myl, random.randint(0,1000000)) 
    b = time.time() 
    return (b-a) 

So nenne ich dies mit:

t_dict = {} 
for N in [1000,5000,10000,50000,100000,200000,300000,400000,500000]: 
    t_dict[N] = get_time(N) 

und plotten die Ergebnisse:

enter image description here

ich vermutete, hätte/gehofft, dass insort wo A lle maximal O(nlog(n)) sein. Aus der Dokumentation liest man:

"Denken Sie daran, dass die O (Log n) Suche von der langsamen O (n) -Einfügung Schritt dominiert wird."

Was fehlt mir hier?

EDIT: Mir fehlte etwas sehr offensichtlich. Wie auch immer, ich möchte die Frage mit der gleichen Sache aktualisieren SortedList mit aus dem Paket SortedContainers:

enter image description here

sehr schnell stuff!

+0

'bisect' ist O (logN), ** Einfügung in eine Liste ** auf der anderen Seite ist O (N). –

Antwort

6

bisect ist O (logN). Jedoch ist Einfügen in eine Liste O (N). Du machst das N mal.

Vom bisect.insort_left() documentation:

Beachten Sie, dass der O (log n) Suche ist dominiert durch die langsame O (n) Insertionsschritt.

So Insertion noch O (N), die O (logN) Suchzeit ist (asymptotisch sprechend) unbedeutend im Vergleich zu dem. Also insgesamt, nehmen Ihre zeitgesteuerten Tests N mal O (N) == O (N^2) Zeit.

+0

Ja, aber die Handlung ist keine Linie, oder? – elelias

+0

Ich verlinkte den gleichen Kommentar aus der Dokumentation übrigens :) – elelias

+1

@elelias Sie wiederholen eine O (N) -Einfügung N-mal. Das macht den Gesamtprozess O (N^2) –