Insertar elementos [math] n [/ math] en un montón vacío llevará [math] O (n \ log n) [/ math] tiempo. Sin embargo, si se nos dan los elementos [math] n [/ math] de una vez, podemos construir un montón a partir de ellos en el tiempo [math] O (n) [/ math] usando un algoritmo diferente que insertarlos uno por uno. Asumiendo que estamos construyendo un montón mínimo,
build_heap(int[] array) { for (int i = array.length - 1; i > 0; i--) { bubble_down(array, i); } } bubble_down(int[] array, int index) { int left_index = 2*index; int right_index = left_index + 1; int left = left_index < array.length ? array[left_index] : array[index] + 1; int right = right_index left && right >= left) { swap(array, index, left_index); bubble_down(array, left_index); } else if (array[index] > right && left >= right) { swap(array, index, right_index); bubble_down(array, right_index); } }
construirá un montón en [math] O (n) [/ math] time. Cada uno de los primeros elementos [math] n / 2 [/ math] pasados a bubble_down
no se puede mover hacia abajo, por lo que requieren una llamada de bubble_down
cada uno. Cada uno de los siguientes [math] n / 4 [/ math] elementos pasados a bubble_down
puede moverse hacia abajo como máximo una vez, por lo que contribuyen como máximo a dos llamadas de bubble_down
cada uno. Cada una de las siguientes llamadas [math] n / 8 [/ math] a bubble_down
puede moverse hacia abajo como máximo dos veces, por lo que contribuyen como máximo a tres llamadas de bubble_down
cada una. Etc. En total, a lo sumo
[mates]
\ frac {n} {2} + 2 \ frac {n} {4} + 3 \ frac {n} {8} + \ dots = n \ left (\ sum_ {k = 1} ^ {\ log n} \ frac {k} {2 ^ k} \ right)
[/mates]
[mates]
= 2n – \ log n – 2
[/mates]
- ¿Qué algoritmo es mejor para una variante 4 * 4 * 4 * 4 del último dedo del pie tic-tac considerando un límite de tiempo de 15 segundos?
- Suponiendo que todos estos algoritmos resuelven el mismo tipo de problema, ¿cuál se recomienda? ¿Y por qué?
- ¿Por qué Google todavía muestra el tiempo de búsqueda en la página de resultados?
- ¿Es necesario el conocimiento de algoritmos clásicos para convertirse en un experto en inteligencia artificial?
- ¿Es posible usar Dijkstra por dos costos?
Se realizan llamadas a bubble_down
. Todo lo demás lleva tiempo constante, por lo que build_heap
lleva tiempo [math] O (n) [/ math].