Усовершенствованные структуры данных на практике

Этот код работает тоже:

$("input[reference=12345].myclass").css('border', '#000 solid 1px');
45
задан Juliet 24 December 2008 в 01:49
поделиться

14 ответов

Некоторые примеры. Они неопределенны, потому что они были работой для работодателей:

  • А "куча" для получения вершины N приводит к поиску стиля Google. (Запускающийся от кандидатов в индексе, пройдите их всех линейно, отсеяв их через минимальную "кучу" макс. размера N.) Это было для поискового изображением прототипа.

  • фильтры Цветка сокращают размер определенных данных о том, что миллионы пользователей видели вниз к сумме, это поместится в существующие серверы (все это должно было быть в RAM для скорости); для первоначального проекта были бы нужны много новых серверов только для той базы данных.

  • А представление треугольной антенной решетки разделило на два размер плотной симметричной антенной решетки для механизма рекомендации (RAM снова по той же причине).

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

  • приложение для выбора АЗС согласно времени диска для людей в окружении использовало кратчайший путь Dijkstra с приоритетными очередями. Другая работа GIS использовала в своих интересах деревья квадрантов и индексы Morton.

Знание, что находится там на земле структур данных, пригождается - "недели в лаборатории, может сохранить Вас часы в библиотеке". Случай фильтра цветка только стоил из-за масштаба: если бы проблема подошла при запуске вместо Yahoo, я использовал бы простую хеш-таблицу. Другие примеры я думаю, разумны где угодно (хотя в наше время Вы, менее вероятно, кодируете их сами).

29
ответ дан Darius Bacon 23 September 2019 в 10:49
поделиться

B-деревья находятся в базах данных.

R-деревья для географических поисков (например, если у меня есть 10 000 форм каждый с ограничительной рамкой, рассеянной вокруг 2-D плоскости, какая из этих форм пересекает произвольную ограничительную рамку B?)

двухсторонние очереди из формы в C++ STL growable векторы (более эффективный памятью, чем связанные списки и постоянно-разовый, чтобы "посмотреть" произвольные элементы в середине). Насколько я могу помнить, я никогда не привык двухстороннюю очередь для ее полного объема (вставьте/удалите от обоих концов), но это является достаточно общим, что можно использовать его в качестве стека (вставьте/удалите от одного конца), или очередь (вставляют в один конец, удаляют из другого), и также имейте высокоэффективный доступ для просмотра произвольных элементов в середине.

я только что закончил читать Дженерики Java и Наборы - часть "дженериков" повреждает мою голову, но часть наборов была полезным & они указывают на некоторые различия между списками пропуска и деревьями (оба могут реализовать карты/наборы): списки пропуска дают Вам встроенное постоянное повторение времени от одного элемента до следующего (деревья являются O (зарегистрируйте n)), и намного более просты для реализации алгоритмов без блокировок в многопоточных ситуациях.

Приоритетные очереди используются для планирования среди прочего (вот веб-страница , который кратко обсуждает приложение); "куча" обычно используется для реализации их. Я также нашел, что пирамидальная сортировка (для меня, по крайней мере) является самой легкой из O (n, регистрируют n), виды, чтобы понять и реализовать.

12
ответ дан Jason S 23 September 2019 в 10:49
поделиться

Это зависит на уровне абстракции, в которой Вы работаете.

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

я думаю, смотрите ли Вы вниз на более низкий код уровня, Вы будете видеть больше "экзотических" структур данных.

4
ответ дан John Sonmez 23 September 2019 в 10:49
поделиться

Я думаю, что Вы видите, что необычные структуры данных использовали большинство некоторые высокоуровневые алгоритмы. Основной пример, который приходит на ум для меня*, который использует График и Приоритетную Очередь, реализованную "кучей".

2
ответ дан 23 September 2019 в 10:49
поделиться

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

2
ответ дан RossFabricant 23 September 2019 в 10:49
поделиться

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

1
ответ дан kemiller2002 23 September 2019 в 10:49
поделиться

Я просто нашел использование для графиков путем выяснения вопрос на stackoverflow:)

1
ответ дан Community 23 September 2019 в 10:49
поделиться

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

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

0
ответ дан Daniel Papasian 23 September 2019 в 10:49
поделиться

Я часто использую наборы, отсортированные наборы (всегда сохраняют их элементы в отсортированном порядке и поддерживают быструю вставку элемента), и ленивые списки.

0
ответ дан Jules 23 September 2019 в 10:49
поделиться

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

0
ответ дан Peter Oehlert 23 September 2019 в 10:49
поделиться

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

Много структур данных ( косые деревья приходят на ум) интересны для их оптимального поведения при определенных обстоятельствах ( временная местность ссылки в случае косых деревьев), таким образом, они главным образом важны для использования в этих случаях. При большинстве обстоятельств реальная выгода практического знания этих структур данных должна быть в состоянии нанять их при правильных обстоятельствах с разумным пониманием их поведения.

Берут сортировку, например:

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

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

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

8
ответ дан ConcernedOfTunbridgeWells 23 September 2019 в 10:49
поделиться

Сбалансированные деревья (красно-черные и т. Д.) Обычно используются при реализации абстрактного типа данных.

Есть только относительно небольшое количество абстрактных типов данных, например,

  • список
  • карта
  • упорядоченная карта
  • мульти-карта
  • упорядоченная мульти-карта
  • очередь приоритетов (которая очень похожа на упорядоченную мульти-карту)

Аналогично, набор выглядит очень похоже на карту, но вам не нужны значения, только ключи.

Я нахожу большинство из них время от времени полезными; очередь приоритетов - это очень полезная структура данных, которая имеет приложения во всех видах алгоритмов (например, планирование, поиск путей и т. д.).

Вы сказали «Словарь», вы, вероятно, имели в виду карту или упорядоченную карту.

] Некоторые карты неупорядочены (обычно реализованы в виде хеша) - это полезное подмножество упорядоченной карты.

0
ответ дан 26 November 2019 в 21:24
поделиться

Кучи Фибоначчи используются для эффективных реализаций алгоритма Дейкстры .

2
ответ дан 26 November 2019 в 21:24
поделиться
Другие вопросы по тегам:

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