Каковы менее известные, но полезные структуры данных?

Была та же проблема. Это сделало трюк для меня:

$MyFile | Out-File -Encoding Oem $MyPath

При открытии файла с кодом Visual Studio или Notepad ++ он отображается как UTF-8

796
задан 13 revs, 7 users 30% 23 May 2017 в 11:47
поделиться

58 ответов

Как насчет косые деревья ?

кроме того, Chris Okasaki чисто функциональные структуры данных приходят на ум.

31
ответ дан 2 revs 23 May 2017 в 21:47
поделиться

< zvrba> деревья Emde-удавов Фургона

я думаю, что было бы полезно знать , почему они прохладны. В целом вопрос, "почему" является самым важным для выяснения ;)

Мой ответ, состоит в том, что они дают Вам O (журнал регистрируют n), словари с {1.. n} ключи, независимые от того, сколько из ключей используется. Точно так же, как повторено сокращение вдвое дает Вам O (зарегистрируйте n), что повторный sqrting дает Вам O (журнал регистрируют n), который является тем, что происходит в vEB дереве.

32
ответ дан Jonas Kölker 23 May 2017 в 21:47
поделиться
  • 1
    Я думаю, что соединение ветвления рассматривает рекурсивный случай по-другому, они должны украсть более новые задачи в рекурсивных случаях. – user 26 June 2013 в 15:56

Попытки , также известный как деревья префикса или разрядные критикой деревья , существовали больше 40 лет, но все еще относительно неизвестны. Очень прохладное использование попыток описано в" МУСОР - динамический LC-trie и структура данных хеша ", который комбинирует trie с хеш-функцией.

271
ответ дан 2 revs, 2 users 91% 23 May 2017 в 21:47
поделиться
  • 1
    Я думаю, что существует только несколько вариантов использования для этого шаблона. Я могу думать о только одном, и это должно помочь другим программистам помнить, что они должны сделать что-то с классом, который они пишут. Ограничение на этот шаблон подобно тому из классов случая: Вы не можете расшириться StrictSelf с другим StrictSelf. Обязательное переопределение эти Self тип было бы несовместимым. – EECOLOR 18 February 2013 в 02:38

Вот некоторые:

  • Суффиксные попытки. Полезный почти для всех видов поиска строки ( http://en.wikipedia.org/wiki/Suffix_trie#Functionality ). См. также суффиксные массивы; они не совсем с такой скоростью, как суффиксные деревья, но намного меньший.

  • Косые деревья (как упомянуто выше). Причина они прохладны, является трехкратной:

    • Они являются маленькими: Вам только нужны левые и правые указатели как Вы, делают в любом двоичном дереве (никакая информация цвета узла или размера не должна храниться)
    • , Их (сравнительно) очень легко реализовать
    • , Они предлагают оптимальную амортизируемую сложность для большого количества "измерительных критериев" (зарегистрируйте n время поиска, будучи тем, которое все знают). См. http://en.wikipedia.org/wiki/Splay_tree#Performance_theorems
  • заказанный "куче" деревья поиска: Вы храните набор (ключ, prio) пары в дереве, таком, что это - дерево поиска относительно ключей, и заказанный "куче" относительно приоритетов. Можно показать, что такое дерево имеет уникальную форму (и оно не всегда полностью упаковывало up-and-to-the-left). Со случайными приоритетами это дает Вам, ожидал O (зарегистрируйте n), время поиска, IIRC.

  • ниша А каждый - списки смежности для неориентированных плоских графиков с O (1) соседние запросы. Это не так структура данных как конкретный способ организовать существующую структуру данных. Вот то, как Вы делаете это: каждый плоский график имеет узел с градусом самое большее 6. Выберите такой узел, поместите его соседей в его соседний список, удалите его из графика и рекурсивно вызовите, пока график не пуст. При предоставлении пары (u, v) ищите Вас в соседнем списке v и для v в соседнем списке u. У обоих есть размер самое большее 6, таким образом, это - O (1).

вышеупомянутым алгоритмом, если Вы и v - соседи, у Вас не будет и u в списке v и v в списке u. При необходимости в этом просто добавьте пропавших соседей каждого узла соседнего списка того узла, но сохраните, сколько из соседнего списка необходимо просмотреть для быстрого поиска.

69
ответ дан Jonas Kölker 23 May 2017 в 21:47
поделиться
  • 1
    Бизнес-логика имеет тенденцию быть случайными частями. – Peter Lawrey 15 February 2012 в 02:51

Пространственные Индексы , в особенности R-деревья и KD-деревья , хранят пространственные данные эффективно. Они хороши для географических данных координаты карты и места СБИС и направляют алгоритмы, и иногда для поиска ближайшего соседа.

Битовые массивы биты человека хранилища сжато и позволяют быстрые битовые операции.

92
ответ дан Yuval F 23 May 2017 в 21:47
поделиться
  • 1
    Можно изменить внутренний тип указателя, но меня don' t думают it' s из-за средства удаления. Указатель является " std::remove_reference<D>::type::pointer, если тот тип существует, иначе T*" – Stephen Lin 5 March 2013 в 02:02
  • Kd-деревья , пространственная используемая структура данных (среди других) в режиме реального времени Трассировка лучей, имеют оборотную сторону, что должны быть отсечены треугольники, что крест пересекает различные пробелы. Обычно BVH's быстрее, потому что они более легки.
  • Деревья квадрантов MX-CIF , сохраните ограничительные рамки вместо наборов произвольной точки путем объединения регулярного дерева квадрантов с двоичным деревом на краях четверок.
  • HAMT, иерархическая карта хеша с временами доступа, которые обычно превышают O (1) карты хеша из-за включенных констант.
  • Инвертированный индекс , довольно известный в кругах поисковой системы, потому что это используется для быстрого извлечения документов, связанных с различными критериями поиска.

Большинство, если не все, их документируются на словаре NIST Алгоритмов и Структур данных

18
ответ дан 3 revs, 2 users 55% 23 May 2017 в 21:47
поделиться

фильтр Цветка : Битовый массив м биты, первоначально весь набор к 0.

Для добавления объекта Вы выполняете его до К хеш-функции, которые дадут Вам К индексы в массиве, который Вы затем устанавливаете на 1.

, Чтобы проверить, находится ли объект в наборе, вычислите К индексы и проверка, если они все установлены на 1.

, Конечно, это дает некоторую вероятность ложных положительных сторон (согласно Википедии, которая это о 0.61^ (m/n), где n является количеством вставленных объектов). Ложные отрицательные стороны не возможны.

Удаление объекта невозможно, но можно реализовать фильтр цветка подсчета , представленный массивом ints и инкремента/декремента.

231
ответ дан 2 revs, 2 users 95% 23 May 2017 в 21:47
поделиться
  • 1
    @sehe: Я был ленив и просто левый Maxim' s улучшение комментариев. I' ve добавил его в ответ теперь, Спасибо! – Bill 21 October 2011 в 02:11

деревья Emde-удавов Фургона . У меня есть даже C++ реализация из него, поскольку до 2^20 целые числа.

14
ответ дан zvrba 23 May 2017 в 21:47
поделиться
  • 1
    @the_mandrill: " doesn' t взаимное исключение разблокированы перед возвратом value' s копируют constructor" Конечно, это разблокировано перед этим. Все, что Вы защищаете, является созданием ссылки. Возврат копией в этом сценарии. – sbi 3 November 2009 в 01:05

Соединяющаяся "куча" является типом структуры данных "кучи" с относительно простой реализацией и превосходной практической амортизируемой производительностью.

10
ответ дан Marko Tintor 23 May 2017 в 21:47
поделиться

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

4
ответ дан mdm 23 May 2017 в 21:47
поделиться
  • 1
    Каждый подкласс должен был бы обеспечить их собственное copy метод (т.е. это будет абстрактный метод, пока реальный класс не реализовал его), поскольку только конкретные подклассы знают то, что является типом возврата " copy" из объекта. Это не кажется мне как принудительное требование; на самом деле Java делает это в Cloneable ( docs.oracle.com/javase/1.4.2/docs/api/java/lang/Cloneable.html ), но небезопасным с точки зрения типов способом и, если метод не переопределяется, отражение использования. CA#Self не обязательно CA; поэтому, я не мог получить доступ CA - определенные методы и поля в скопированных экземплярах. – Rui Gonçalves 7 February 2013 в 02:14

Мне нравится treaps - за простую, все же эффективную идею наложить структуру "кучи" со случайным приоритетом над деревом двоичного поиска для балансировки его.

7
ответ дан Rafał Dowgird 23 May 2017 в 21:47
поделиться
  • 1
    @Red: Это может содержать средство удаления, но то средство удаления не имеет никакого влияния вообще по эти pointer тип. Присоединитесь ко мне в Lounge< C ++> чат-комната для большего количества информации. – Xeo 5 March 2013 в 06:30
  • Бинарная схема принятия решений (моя очень любимая структура данных, хорошая для представления булевых уравнений и решения их. Эффективный для большой партии вещей)
  • "куча" (дерево, где родитель узла всегда поддерживает некоторое отношение к детям узла, например, родитель узла всегда больше, чем каждый из, его - дети (макс. "куча"))
  • Приоритетные Очереди (действительно просто минимальная "куча" и макс. "куча", хорошая для того, чтобы поддержать порядок большого количества элементов там, например, объект с самым высоким значением, как предполагается, удален сначала)
  • Хеш-таблицы, (со всеми видами стратегий поиска, и переполнение блока, обрабатывающее)
  • Сбалансированные деревья двоичного поиска (Каждый из них, имеют их собственные преимущества)
    • RB-деревья (в целом хороший, при вставке, поиск, удалении и итерации заказанным способом)
    • Avl-деревья (быстрее для поиска, чем RB, но в других отношениях очень похожий на RB)
    • Косые деревья (быстрее для поиска, когда недавно используемые узлы, вероятно, будут снова использованы)
    • дерево Fusion (Использование быстрого умножения для получения еще лучших времен поиска)
    • B+Trees (Используемый для индексации в базах данных и файловых системах, очень эффективных, когда задержка к чтению-записи из/в индекс будет значительной).
  • Пространственные индексы (Превосходный для запросов для того, являются ли точки/круги/прямоугольники/строки/кубы в непосредственной близости от или содержавший друг в друге)
    • дерево BSP
    • Дерево квадрантов
    • Дерево октантов
    • дерево Диапазона
    • Партии подобных но немного отличающихся деревьев и различные размеры
  • деревья Интервала (хорошее открытие перекрывающиеся интервалы, линейные)
  • Графики
    • список смежности (в основном список краев)
    • матрица смежности (таблица, представляющая ориентированные ребра графика с единственным битом на край. Очень быстро для обхода графика)

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

1
ответ дан Zuu 23 May 2017 в 21:47
поделиться

Любой с опытом в 3D рендеринге должен быть знаком с деревья BSP . Обычно это - метод путем структурирования 3D сцены, чтобы быть управляемым для рендеринга знания координат камеры и переноса.

Двоичное разделение пространства (BSP) является методом для того, чтобы рекурсивно подразделить пространство на выпуклые наборы гиперплоскостями. Это подразделение дает начало представлению сцены посредством древовидной структуры данных, известной как дерево BSP.

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

Первоначально, этот подход был предложен в 3D компьютерной графике для увеличения эффективности рендеринга. Некоторые другие приложения включают работающие геометрические операции с формами (конструктивная стереометрия) в CAD, обнаружении коллизий в робототехнике и 3D компьютерных играх и других компьютерных приложениях, которые включают обработку сложных пространственных сцен.

44
ответ дан spoulson 23 May 2017 в 21:47
поделиться
  • 1
    BTW: Какой Скорпион, заключенный в кавычки из jsr166 веб-сайта, является также частью официальной документации JDK 7, таким образом, мне кажется более уместным отослать людей к docs.oracle.com/javase/7/docs/api/java/util/concurrent/… вместо этого. – Holger Peine 14 February 2012 в 15:18

списки Пропуска круты.

Википедия
список пропуска А является вероятностной структурой данных, на основе нескольких параллельных, отсортированных связанных списков, с эффективностью, сопоставимой с деревом двоичного поиска (порядок, регистрируют n среднее время для большинства операций).

Они могут использоваться в качестве альтернативы сбалансированным деревьям (использующий probalistic балансировка, а не строгое осуществление балансировки). Их легко реализовать и быстрее, чем говорят, красно-черное дерево. Я думаю, что они должны быть в каждой пользе программистами toolchest.

, Если Вы хотите получить всестороннее введение в списки пропуска, вот ссылка на видео из Введения MIT в лекцию Алгоритмов по ним.

кроме того, здесь апплет Java, демонстрирующий Списки Пропуска визуально.

128
ответ дан 3 revs 23 May 2017 в 21:47
поделиться
  • 1
    @Stephen: D тип средства удаления, и если это определяет вложенный pointer тип, что каждый используется. – Xeo 4 March 2013 в 15:03

Я думаю , Непересекающийся Набор довольно изящен для случаев, когда необходимо разделить набор объектов в отличные наборы и членство в запросе. Хорошая реализация Объединения и Находит операционный результат в амортизируемых затратах, которые являются эффективно постоянными (инверсия Функции Ackermnan, если я вспоминаю свой класс структур данных правильно).

55
ответ дан Dana 23 May 2017 в 21:47
поделиться
  • 1
    Дифференцирование между " concurrent" и " parallel" Jon Harrop в ссылка ясно записана. Однако я думаю что Ваше предложение " ветвление/соединение для параллели, в то время как ThreadPoolExecutor для concurrent" допустимо, но только один среди нескольких аспектов ответа на OP. Когда Вы хотите собрать результаты некоторых задач, как только все они закончены, вместо того, чтобы использовать соединение () Вы могли также сделать это с ThreadPoolExecutor и например, CountDownLatch. – Holger Peine 14 February 2012 в 15:36

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

140
ответ дан 2 revs 23 May 2017 в 21:47
поделиться
  • 1
    Один вариант использования для броска на unique_ptr разыменовывает, тип пользовательского указателя, который бросает на пустой указатель, разыменовывают. – Howard Hinnant 9 February 2014 в 00:19

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

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

8
ответ дан 2 revs 23 May 2017 в 21:47
поделиться
  • 1
    @TonyTheLion: Независимо от того, что Вы определяете его, чтобы быть..., это может привести к указателю или объекту, если это приведет к объекту, [то 110] будет обращен что так, чтобы a->b был переведен в ((a.operator->())->operator->())b, если вторая оценка также не приводит к неуказательному, в этом случае... – David Rodríguez - dribeas 4 March 2013 в 14:52

Бинарная схема принятия решений является одной из моих любимых структур данных или на самом деле Уменьшенной заказанной бинарной схемой принятия решений (ROBDD).

Подобные структуры могут, например, использоваться для:

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

, что много проблем могут быть представлены как булево выражение. Например, решение suduku может быть выражено как булево выражение. И создание BDD для того булева выражения сразу приведет к решению (решениям).

8
ответ дан Zuu 23 May 2017 в 21:47
поделиться
  • 1
    @R.MartinhoFernandes: Нет, не действительно. Контракт требует, чтобы он не бросал, и компилятор генерирует код, который захватывает исключение и вызовы std::terminate(). Результатом вызывания функции, которая является nothrow, никогда не будет исключение. – David Rodríguez - dribeas 4 March 2013 в 14:53

деревья Huffman - используемый для сжатия.

43
ответ дан Lurker Indeed 23 May 2017 в 21:47
поделиться
  • 1
    @PeterLawrey я обновил ответ для содержания некоторых ссылок как ссылок. – Scorpion 14 February 2012 в 12:48

Круговой или кольцевой буфер - используемый для потоковой передачи, среди прочего.

34
ответ дан cdonner 23 May 2017 в 21:47
поделиться
  • 1
    Должен быть добавлен что " deque" многие люди говорят о, не известная реализация интерфейс Deque . Это - массив. Посмотрите исходный код ForkJoinWorkerThread. У него есть поле ForkJoinTask<?>[] queue значения по умолчанию пакета, к которому получают доступ. – Martin Andersson 3 December 2013 в 18:14

Интересный вариант хеш-таблицы называется Cuckoo Hashing . Он использует несколько хеш-функций вместо одной, чтобы иметь дело с хеш-коллизиями. Конфликты разрешаются путем удаления старого объекта из местоположения, указанного первичным хешем, и его перемещения в место, указанное альтернативной хеш-функцией. Cuckoo Hashing позволяет более эффективно использовать пространство памяти, поскольку вы можете увеличить коэффициент загрузки до 91% с помощью всего 3 хеш-функций и при этом иметь хорошее время доступа.

29
ответ дан 22 November 2019 в 21:19
поделиться

Кучи Фибоначчи

Они используются в некоторых из самых быстрых известных алгоритмов (асимптотически) для множества проблем, связанных с графами, таких как проблема кратчайшего пути. Алгоритм Дейкстры работает за время O (E log V) со стандартными двоичными кучами; использование кучи Фибоначчи улучшает это до O (E + V log V), что является огромным ускорением для плотных графов. К сожалению, у них высокий постоянный коэффициент, что часто делает их непрактичными на практике.

52
ответ дан 22 November 2019 в 21:19
поделиться

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

Вот несколько ссылок
http://www.cl.cam.ac.uk/research/srg/netos/lock-free/
http://www.research.ibm.com/people/ m / michael / podc-1996.pdf [Ссылки на PDF]
http://www.boyet.com/Articles/LockfreeStack.html

(часто провокационный) блог Майка Эктона содержит некоторые отличные статьи по безблокировочному дизайну и подходам

65
ответ дан 22 November 2019 в 21:19
поделиться

Я удивлен, никто не упомянул деревьев Merkle (т.е. хеш деревьев ).

Используется во многих случаях (P2P-программы, цифровые подписи), где вы хотите проверить хеш целого файла, когда у вас есть только часть файла, доступного вам.

33
ответ дан 22 November 2019 в 21:19
поделиться

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

Согласно исходной статье :

Наши функциональные деревья на 2-3 пальца являются примером общей методики проектирования, представленной Окасаки (1998), называемой неявным рекурсивным замедлением . Мы уже отметили, что эти деревья являются расширением его неявной структуры двухсторонней очереди, заменяя пары на 2-3 узла, чтобы обеспечить гибкость, необходимую для эффективного объединения и разделения.

Дерево пальцев может быть параметризовано моноидом , и использование разных моноидов приведет к разному поведению дерева. Это позволяет Finger Trees имитировать другие структуры данных.

38
ответ дан 22 November 2019 в 21:19
поделиться

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

12
ответ дан 22 November 2019 в 21:19
поделиться

На самом деле это не структура данных; больше способ оптимизировать динамически выделяемые массивы, но буферные буферы , используемые в Emacs, - это круто.

17
ответ дан 22 November 2019 в 21:19
поделиться

Красно-черные деревья, наклоняющиеся влево . Существенно упрощенная реализация красно-черных деревьев Робертом Седжвиком, опубликованная в 2008 году (~ половина строк кода для реализации). Если вам когда-либо приходилось ломать голову над реализацией красно-черного дерева, прочтите об этом варианте.

Очень похоже (если не идентично) на деревья Андерссона.

23
ответ дан 22 November 2019 в 21:19
поделиться

Zippers - производные структур данных, которые изменяют структуру, чтобы иметь естественное понятие «курсор» - текущее местоположение. Они действительно полезны, поскольку гарантируют, что индикаторы не могут быть вне пределов своих возможностей, например. в оконном менеджере xmonad , чтобы отслеживать, какое окно сфокусировано.

Удивительно, но вы можете получить их, применяя методы исчисления к типу исходной структуры данных!

87
ответ дан 22 November 2019 в 21:19
поделиться

Вложенные наборы удобны для представления деревьев в реляционных базах данных и выполнения запросов к ним. Например, ActiveRecord (ORM Ruby on Rails по умолчанию) поставляется с очень простым подключаемым модулем вложенного набора , который упрощает работу с деревьями.

13
ответ дан 22 November 2019 в 21:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: