Pregunta

¿Qué tipo de matemática usas para atravesar el montón 4 cuando usas una matriz para almacenar todos los elementos? Específicamente, ¿cómo encuentra el índice de un nodo principal en una hoja específica?

Digamos que tengo la siguiente matriz:

0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | ... etc.

con el montón entonces construido a partir de eso con 1 siendo la raíz, 2..5 sus hijos, 6..9 hijos de 2, etc.

¿Cuál es exactamente la matemática que necesito si necesito encontrar (por ejemplo) el padre de 6?

¿Fue útil?

Solución

Para buscar el padre de cualquier hijo (que no sea 1, que no tiene padre):

parent = int((child + 2) / 4)

Para encontrar el primer y último hijo de un padre:

child_first = parent * 4 - 2
child_last  = parent * 4 + 1

Puede ver esto en funcionamiento ya que, en cada nivel, agrega cuatro veces más elementos que en el nivel anterior:

  1           (   1)
  2 thru    5 (   4)
  6 thru   21 (  16)
 22 thru   85 (  64)
 86 thru  341 ( 256)
342 thru 1365 (1024)

Level 1:
1 -> 2 3 4 5

Level 2:
2 ->  6  7  8  9
3 -> 10 11 12 13
4 -> 14 15 16 17
5 -> 18 19 20 21

Level 3:
 6 -> 22 23 24 25
 7 -> 26 27 28 29
 8 -> 30 31 32 33
 9 -> 34 35 36 37
10 -> 38 39 40 41
11 -> 42 43 44 45
12 -> 46 47 48 49
13 -> 50 51 52 53
14 -> 54 55 56 57
15 -> 58 59 60 61
16 -> 62 63 64 65
17 -> 66 67 68 69
18 -> 70 71 72 73
19 -> 74 75 76 77
20 -> 78 79 80 81
21 -> 82 83 84 85

& nbsp;

Level 4:
 22 ->  86  87  88  89
 23 ->  90  91  92  93
 24 ->  94  95  96  97
 25 ->  98  99 100 101
 : : : :
 82 -> 326 327 328 329
 83 -> 330 331 332 333
 84 -> 334 335 336 337
 85 -> 338 339 340 341

Ejemplos son:

parent of 342 = int(344/4) = 86 (same for 343,344,345).
parent of 346 = int(348/4) = 87 (same for 347,348,349).
first child of 21 = 21 * 4 - 2 = 82
last  child of 21 = 21 * 4 + 1 = 85

Otros consejos

Primero una simple observación. La raíz está en 1 , por lo que todos los niños comienzan en 2 . Antes del índice i hay vértices i-1 (recuerde, ¡el índice 0 no es un vértice!) En el montón, cada uno tiene 4 hijos exactamente. Entonces i th los niños estarán en 2 + 4 * (i-1) a 2 + 4 * i-1 por ejemplo, los hijos de 1 son 2 + 4 * 0 = 2 a 2 + 4 * 0 + 3 = 5 .

def son_(i):
    return range(2+4*(i-1),2+4*i)
for i in range(1,10): print i,son_(i)

salida

1 [2, 3, 4, 5]
2 [6, 7, 8, 9]
3 [10, 11, 12, 13]
4 [14, 15, 16, 17]
5 [18, 19, 20, 21]
6 [22, 23, 24, 25]
7 [26, 27, 28, 29]
8 [30, 31, 32, 33]
9 [34, 35, 36, 37]

Sin agujeros, ver.

Si first_son (i) = 2 + 4i y last_son (i) = 2 + 4i + 3 = 4 (i + 1) +1, tenemos ese padre (n) = floor ((n-2) / 4 ) +1. (el +1 es hacer que la matriz comience en 1)

Probemos que:

def father_(n):
    return (n-2)/4+1
for i in range(2,20): print i,father_(i)

Salida:

2 1
3 1
4 1
5 1
6 2
7 2
8 2
9 2
10 3
11 3
12 3
13 3
14 4
15 4
16 4
17 4
18 5
19 5

Necesita división y multiplicación de enteros. Por ejemplo, el padre de 6 es 1 + ((6-1) / 4) = 2 . El padre de 5 es 1 + ((5-1) / 4) = 2 . El padre de 10 es 1 + ((10-1) / 4) = 3 , etc. Los hijos de 2 son 2 + 4 * (2-1) .. (2 + 4 * (3-1)) - 1 = 6..9 .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top