M-way дерево - это древовидная структура, которая имеет m
значения и m + 1
ссылки.
Бинарное дерево - это особый случай m-way дерева с m
, равным единице, что означает только одно значение на узел и две ссылки (вы перемещаетесь вниз по левой или правой ссылке). Вот пример двоичного дерева, которое показывает это:
+----+
| 20 |
+----+
/ \
+----+ +----+
| 14 | | 23 |
+----+ +----+
У m-way дерева может быть более одного значения на узел, но теория все та же. Вы выбираете, к какой ссылке переходить, основываясь на значениях, и есть m + 1
возможных вариантов. Дерево m-way (где m
равно 2) может выглядеть так:
+----+----+
| 17 | 30 |
+----+----+
______/ | \______
/ | \
+----+----+ +----+----+ +----+----+
| 11 | 15 | | 19 | 28 | | 33 | 34 |
+----+----+ +----+----+ +----+----+
Эти m-way деревья часто используются в ситуациях, когда вы можете разместить более одного значения в эффективном блоке. Под эффективностью я имею в виду тот, который можно эффективно читать и записывать, например, дисковый блок, сектор, кластер или цилиндр, в зависимости от того, как работает ваша подсистема хранения.
Например, скажем, что:
- блок диска составляет 512 байт;
- значения в вашем дереве занимают 122 байта; и
- ссылки занимают 4 байта.
В этой ситуации вы можете разместить 4 значения в блоке диска, рассчитанном следующим образом:
numvals = int ((blocksize - linksize) / (valuesize + linksize))
= int (( 512 - 4 ) / ( 122 + 4 ))
= int ( 508 / 126 )
= int ( 4.0317 )
= 4
Это дает вам четыре значения и пять ссылок на общую сумму 508 байт:
4 * 122 = 488
5 * 4 = 20
---
508
Хотя есть некоторые потери (в данном случае четыре байта), это имеет преимущество в хранении целого числа значений в каждом эффективно извлекаемом блоке.