Кто-нибудь знает, как определить время поиска для дерева двоичного поиска (т.е. наихудшего, наилучшего случая и среднего случая)?
Время поиска двоичного дерева поиска
Ответ 1
Для дерева без самобалансировки (возможно, но необычного для дерева поиска) наихудшим случаем является O (n), что для вырожденного двоичного дерева (связанный список).
В этом случае вам нужно искать в среднем половину списка перед поиском нужного элемента.
Наилучшим случаем является O (log 2 n) для идеально сбалансированного дерева, поскольку вы сокращаете пространство поиска пополам для каждого уровня дерева.
Средний случай находится где-то между этими двумя и полностью зависит от данных: -)
Поскольку вам редко удается управлять последовательностью, в которую данные вставляются в дерево, обычно балансирующие деревья обычно предпочтительнее, поскольку они добавляют небольшое количество времени для каждой вставки или удаления, что значительно ускоряет поиск. Их худший случай намного лучше, чем несбалансированные деревья.
8
_______/ \_______
/ \
4 12
__/ \__ __/ \__
/ \ / \
2 6 10 14
/ \ / \ / \ / \
1 3 5 7 9 11 13 15
В этом идеально сбалансированном дереве вы можете увидеть, что вы получаете 2 n -1 узлов для каждого уровня n
. Это означает, что для 15 узлов вам не нужно искать более четырех узлов, чтобы найти его (например, найти 13
, вы выполните поиск 8
, 12
, 14
и 13
). То, откуда появляется запись log 2 n.
Вырожденное неуравновешенное дерево, как уже было сказано, является связанным списком. Если ваши данные поступают последовательно, и вы вставили их в несбалансированное двоичное дерево, вы получите:
1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8 -> 9 -+
|
+------------------------------------------+
|
+-> 10 -> 11 -> 12 -> 13 -> 14 -> 15
Чтобы найти 13
в этом случае, вам нужно будет искать 1
, 2
, 3
, 4
, 5
, 6
, 7
, 8
, 9
, 10
, 11
, 12
и 13
, поэтому O (n).
Ответ 2
Возможно, вы хотите пометить это как "домашнюю работу". Здесь хорошая отправная точка: http://en.wikipedia.org/wiki/Binary_search_tree
В общем случае сбалансированное двоичное дерево поиска имеет наихудший поиск O (log n), лучший случай O (1) (когда искомое значение является корнем) и средний случай O (log n) (листья содержат экспоненциально больше значений, чем их родители).
Самый худший случай является самым интересным и легко увидеть, признав, что первый уровень двоичного дерева имеет 1 node, второй - 2, третий - 4 и т.д. Таким образом, количество узлов в двоичном древе глубины n равно 2 ^ n - 1. Математическим обратным к экспоненциальной функции является логарифм, таким образом: O (log n).
Несбалансированное дерево может быть таким же плохим, как связанный список, и может иметь следующую форму:
1
/ \
2
/ \
3
/ \
4
/ \
В этой ситуации наихудшим временем доступа является O (n).
Ответ 3
Наилучшим случаем является O (1). первым элементом может быть тот элемент, который вы ищете. худшим случаем является O (n), то есть в перекошенном дереве, а средний случай - O (lg n).