Ok, entonces el gráfico muestra una medida del costo de insertar n
elementos en su árbol, donde el eje x es cuántos elementos hemos insertado, y el eje y es el tiempo total.
Llamemos a la función que suma el tiempo que se tarda en insertar n elementos en el árbol f(n)
.
Entonces podemos obtener una idea aproximada de lo que f
podría ser:
f(1) < k*log(1) for some constant k.
f(2) < k*log(1) + k*log(2) for some constant k
...
f(n) < k * [log(1) + log(2) + ... + log(n)] for some constant k.
Debido a cómo funcionan los registros, podemos colapsar log(1) + ... + log(n)
:
f(n) < k * [log(1*2*3*...*n)] for some constant k
f(n) < k * log(n!) for some constant k
Podemos echar un vistazo a Wikipedia para ver un graph de como se ve log(n!)
. Eche un vistazo al gráfico en el artículo. Debería verte bastante familiar.:)
Es decir, creo que has hecho esto por casualidad:
for n in (5000, 50000, 500000):
startTime = ...
## .. make a fresh tree
## insert n elements into the tree
stopTime = ...
## record the tuple (n, stopTime - startTime) for plotting
y se representa el tiempo total para construir el árbol de tamaño n, en lugar del costo individual de la inserción de un elemento en un árbol de tamaño n:
for n in range(50000):
startTime = ...
## insert an element into the tree
stopTime = ...
## record the tuple (n, stopTime - startTime) for plotting
Chris Taylor señala en los comentarios que si se trazan f(n)/n
, verá un gráfico de registro. Eso es porque una aproximación bastante ajustada a log(n!)
es n*log(n)
(vea la página de Wikipedia). Así podemos volver a nuestro límite:
f(n) < k * log(n!) for some constant k
y obtenemos:
f(n) < k * n * log(n) for some constant k
y ahora es debería ser más fácil de ver que si se divide f(n)
por n
, su gráfico será acotado superiormente por la forma de un logaritmo.
Por favor, publique su código. –
http://paste.pocoo.org/show/559501/ – Zack