Время поиска двоичного дерева поиска

Кто-нибудь знает, как определить время поиска для дерева двоичного поиска (т.е. наихудшего, наилучшего случая и среднего случая)?

Ответ 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).