Когда использовать трепан

Может ли кто-нибудь привести реальные примеры того, когда лучшим способом хранения ваших данных является treap?

Я хочу понять, в каких ситуациях трэп будет лучше, чем кучи и древовидные структуры.

Если это возможно, приведите несколько примеров из реальных ситуаций.

Я пытался найти случаи использования треппов здесь и путем поиска в Google, но ничего не нашел.

Спасибо.

6 ответов

Если значения хеш-функции используются в качестве приоритетов, трепа предоставляют уникальное представление контента.

Рассмотрим набор порядка элементов, реализованный в виде AVL-дерева или rb-дерева. Вставка предметов в разных порядках, как правило, заканчивается деревьями различной формы (хотя все они сбалансированы). Для данного контента треп всегда будет иметь одинаковую форму независимо от истории.

Я видел две причины, почему уникальное представление может быть полезным:

  1. Причины безопасности. Трепа не может содержать информацию об истории.
  2. Эффективное совместное использование поддерева. Самые быстрые алгоритмы для операций над множествами, которые я видел, используют трепы.

Я не могу предоставить вам никаких реальных примеров. Но я использую трепы для решения некоторых проблем в соревнованиях по программированию:

На самом деле это не настоящие проблемы, но они имеют смысл.

Вы можете использовать его как реализацию карты на основе дерева. В зависимости от приложения, это может быть быстрее. Пару лет назад я сам реализовал Treap и Skip list (на Java) для развлечения и провел базовый сравнительный анализ, сравнивая их с TreeMap, и Treap оказался самым быстрым. Вы можете увидеть результаты здесь.

Одним из его главных преимуществ является то, что его очень легко реализовать, по сравнению, например, с красно-черными деревьями. Однако, насколько я помню, он не имеет гарантированных затрат на свои операции (поиск - O(log n) с high вероятность), по сравнению с красно-черными деревьями, что означает, что вы не сможете использовать его в критически важных для безопасности приложениях, где требуется конкретный срок.

Treaps - это отличный вариант сбалансированного бинарного дерева поиска. Существует множество алгоритмов для балансировки бинарных деревьев, но большинство из них - ужасные вещи с тоннами особых случаев, которые нужно обрабатывать. С другой стороны, очень легко кодировать Treaps. При некотором использовании случайности у нас есть BBT, который, как ожидается, будет иметь логарифмическую высоту. Вот некоторые хорошие проблемы, которые нужно решить с помощью треппов: http://www.spoj.com/problems/QMAX3VN/ (простой уровень) http://www.spoj.com/problems/GSS6/ (средний уровень)

Допустим, у вас есть компания, и вы хотите создать инструмент инвентаризации:

  • Уметь (эффективно) искать товары по названию, чтобы вы могли обновлять ассортимент.

  • Получите в любое время продукт с наименьшим количеством товаров на складе, чтобы вы могли спланировать свой следующий заказ.

Один из способов удовлетворить эти требования может заключаться в использовании двух разных структур данных: одной для эффективного поиска по имени, например, хэш-таблицы, и очереди с приоритетами для получения элемента, который необходимо срочно пополнить. Вам необходимо согласовать эти две структуры данных, и вам потребуется более чем в два раза больше памяти. если мы отсортируем список записей по имени, нам нужно просканировать весь список, чтобы найти заданное значение для другого критерия, в данном случае количества на складе. Кроме того, если мы используем минимальную кучу с более редкими продуктами наверху, нам потребуется линейное время для сканирования всей кучи в поисках продукта для обновления.

Treap

Treap - это смесь дерева и кучи. Идея состоит в том, чтобы наложить ограничения BST на имена и ограничения кучи на количество.

Названия продуктов рассматриваются как ключи двоичного дерева поиска.

Объемы запасов, напротив, рассматриваются как приоритеты кучи, поэтому они определяют частичное упорядочение сверху вниз. Для приоритетов, как и для всех куч, у нас есть частичный порядок, что означает, что только узлы на одном пути от корня до листьев упорядочиваются в соответствии с их приоритетом. На изображении выше вы можете видеть, что дочерние узлы всегда имеют большее количество запасов, чем их родительские, но нет никакого упорядочивания между братьями и сестрами.

Любое поддерево в Treap также является Treap (т.е. удовлетворяет правилу BST, а также правилу минимальной или максимальной кучи). Благодаря этому свойству упорядоченный список можно легко разделить, или несколько упорядоченных списков можно легко объединить с помощью Treaps, чем с помощью дерева RB. Реализация проще. Дизайн тоже проще.

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