Considere un montón binario que contiene n números (la raíz almacena el mayor número). Le dan un número entero positivo k < n y un número x. Debe determinar si el k-ésimo elemento más grande del montón es mayor que xo no. Su algoritmo debe tomar el tiempo O (k). Puede utilizar O (k) almacenamiento extracómo determinar si el elemento kth más grande del montón es mayor que x
Respuesta
Dfs simples pueden hacerlo, tenemos un contador configurado en cero. Comience desde la raíz y en cada iteración verifique el valor del nodo si es mayor que x, luego aumente el contador y ejecute el algoritmo para los nodos secundarios. Cuando el contador es mayor o igual a k, el algoritmo estará terminado, también, si no hay un nodo para verificar, el algoritmo devuelve falso. El código es simple. El tiempo de ejecución es O (k) porque como máximo comprobarás k nodo y cada iteración es O (1).
El pseudo-código tiene el siguiente aspecto.
void CheckNode(Node node,int k, int x, ref int counter)
{
if (node.value > x)
{
counter++;
if (counter >= k)
return;
CheckNode(node.Left, k, x, ref counter);
CheckNode(node.Right,k, x, ref counter);
}
}
usarlo:
counter = 0;
CheckNode(root,index,val,counter);
if (counter >= index)
return true;
return false;
si node.value < x todos los valores de los niños son más pequeños que X y no hay necesidad de comprobar.
Como @Eric Mickelsen mencionó en los comentarios el peor caso, el tiempo de ejecución es exactamente 2k-1 (k> 0) de la siguiente manera.
El número de nodos visitados con valores mayores que x será como máximo de k. Cada nodo visitado con un valor menor que x debe ser un elemento secundario de un nodo visitado con un valor mayor que x. Sin embargo, dado que cada nodo visitado, excepto que la raíz debe tener un padre con un valor mayor que x, , el número de nodos de valor menor que x visitado debe ser como máximo ((k-1) * 2) - (k-1) = k-1, ya que k-1 de los (k-1) * 2 niños tienen valores mayor que x. Esto significa que visitamos k nodos mayores que xy k-1 menor que x, que es 2k-1.
* "y ejecutar algoritmo para nodos secundarios" * Este es el problema. ¿Cómo se elige, con qué niño empezar? Tenga en cuenta que no es un árbol binario ordenado, es solo un montón. –
@Nikita Rybak, ambos niños. ver el código –
@Saeed No, para comenzar. En tu código, estás atravesando el montón de izquierda a derecha. ¡Pero los niños no están ordenados! 'node.left' puede ser menor y mayor que' node.right'. [Hay una imagen] (http://en.wikipedia.org/wiki/Binary_heap) del montón binario. –
public class KSmallest2 {
private MinPQ<Integer> minHeap;
private int x;
private int k;
private int count = 0;
public KSmallest2(String filename, int x, int k) {
this.x = x;
this.k = k;
minHeap = new MinPQ<>();
try {
Scanner in = new Scanner(new File(filename));
while (in.hasNext()) {
minHeap.insert(in.nextInt());
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
public boolean check(int index) {
if (index > minHeap.size()) {
return false;
}
if (minHeap.getByIndex(index) < x) {
count++;
if (count >= k) {
return true;
}
return check(2 * index) ||
check(2 * index + 1);
}
return false;
}
public static void main(String[] args) {
KSmallest2 ks = new KSmallest2("src/main/resources/minheap.txt", 18, 5);
System.out.println(ks.minHeap);
System.out.println(ks.check(1));
}
}
- 1. Calcular el entero más pequeño con k bits conjunto que es mayor que otro entero x?
- 2. Comparar si BigDecimal es mayor que cero
- 3. ¿Es x + = 1 más eficiente que x = x + 1?
- 4. ¿Cómo comprobar si RUBY_VERSION es mayor que cierta versión?
- 5. ¿Cómo hacer que div se fije en altura pero crece si el contenido es más grande que la altura?
- 6. Python: eliminar elemento del montón
- 7. Dado un vector a = [1,2, 3,2, 4, 5] y un elemento x = 3 En el vector a, ¿cómo encontrar la entrada exacta que es más grande que x?
- 8. Dado un vector a = [1,2, 3,2, 4, 5] y un elemento x = 3 En el vector a, ¿cómo encontrar la entrada exacta que es más grande que x?
- 9. jQuery - Detecta si la altura del elemento es mayor que la altura de la ventana y haz algo al respecto
- 10. Encuentra el elemento más grande y el segundo más grande en un rango
- 11. ¿Qué es más grande que un doble?
- 12. ¿Una función es más grande que una matriz?
- 13. ¿Es posible determinar si el texto en un dbEdit es más largo que lo visible?
- 14. Algoritmo para encontrar el número primo más grande más pequeño que x
- 15. Encuentra el valor más grande más pequeño que x en una matriz ordenada
- 16. cómo elegir el tamaño del montón JVM?
- 17. ¿Cómo puedo determinar programáticamente cómo colocar cajas más pequeñas en un paquete más grande?
- 18. ¿Encuentra la potencia más grande de dos menos que el número X?
- 19. Cómo maximizar el bloque contiguo más grande de memoria en el montón de objetos grandes
- 20. la construcción de secuencias que crea una secuencia vacía si es más bajo es mayor que el límite superior
- 21. ¿Cómo configuro el ancho de QComboBox para que se ajuste al elemento más grande?
- 22. C++ ordenando los números del más pequeño al más grande
- 23. cómo liberar std :: vector si no hay memoria del montón
- 24. ¿000,000,000.00 es mayor que cero?
- 25. Comprobando si un NSDate es mayor que otro
- 26. ¿Evita que el relleno haga que el elemento sea más grande?
- 27. Cómo limitar el tamaño del montón?
- 28. ¿Cómo verificar Perl si el permiso de archivo es mayor que 755?
- 29. Cómo determinar si KeyCode es carácter imprimible
- 30. ¿El montón es realmente un montón?
-1: se trata de un problema interesante, pero este es el camino equivocado para publicar una pregunta. Por favor no copie una tarea textualmente aquí. –