Стратегия создания BBST, когда мы знаем, что большинство вставок в порядке?

У меня есть ситуация, когда мне нужно сбалансированное бинарное дерево поиска. Я использовал дерево AVL, но оно требует много поворотов для создания высоты баланса при вставке. Я заметил, что большинство входов уже в порядке. Например: 8 9 10 11 12 13 2 14 15 16 17 4 18 19 20 и т. Д. Есть ли лучшая стратегия создания BBST, когда мы знаем, что большинство входов уже в порядке?

3 ответа

Решение

Запустите сортировку вставкой, которая имеет хорошую производительность для уже отсортированных или почти отсортированных массивов (она имеет производительность O(n + d), где d количество инверсий). Конечно, вы не захотите делать это, если массив вообще не отсортирован, и в этом случае потребуется O(n2), в отличие от других алгоритмов сортировки, которые принимают O(n log n),

После запуска вы можете построить BST вO(n):

Если бы вам пришлось выбрать элемент массива в качестве корня сбалансированного BST, какой элемент вы бы выбрали? Корнем сбалансированного BST должен быть средний элемент из отсортированного массива.

Вы должны выбрать средний элемент из отсортированного массива в каждой итерации. Затем вы создаете узел в дереве, инициализированный этим элементом. После того, как элемент выбран, что осталось? Не могли бы вы определить подзадачи в рамках проблемы?

Осталось два массива - один слева и один справа. Эти два массива являются подзадачами исходной задачи, поскольку оба они отсортированы. Кроме того, они являются поддеревьями левого и правого дочернего узла текущего узла.

Сортировать входы, используя сортировку вставкой; обычно это алгоритм O(n^2), но O(n), если вход почти отсортирован. Затем поместите средний элемент ввода в корень дерева, рекурсивно поместите средний элемент левой половины ввода в корень левого поддерева корня, а средний элемент правой половины ввода - в поле. корень правого поддерева корня и т. д., пока весь ввод не будет в дереве.

Предположим, что arr - почти отсортированный массив, тогда вы можете сделать следующее, чтобы получить из него хорошее сбалансированное дерево:-

make_tree(BST,arr,high,low) {

  if(high>=low) {

      mid = (high+low)/2;
      BST.insert(arr[mid]);
      make_tree(BST,arr,mid-1,low);
      make_tree(BST,arr,high,mid+1);
  }

}

make_tree(BST,arr,N-1,0);

Объяснение:- Поскольку массив почти отсортирован, мы делим его на равные половины, средняя сложность вставки по времени O(logN) и, следовательно, сложность времени O(nlogn)

Другие вопросы по тегам