Зародыш этого вопроса возник из обсуждения, которое я вел с парой коллег-разработчиков из отрасли.
Оказывается, что во многих местах руководители проектов настороженно относятся к сложным структурам данных и обычно настаивают на том, что существует "из коробки" из стандартной библиотеки / пакетов. Общая идея, похоже, состоит в том, чтобы использовать комбинацию из того, что уже доступно, если производительность серьезно не ограничена. Это помогает сохранять простоту кодовой базы, что для недипломатического означало бы: «у нас высокий уровень истощения, а новые, которые мы нанимаем, могут быть не такими уж хорошими».
Так что нет никакого фильтра Блума, пропускающих списков или сплайнов для вас. Итак, вот вопрос (снова): Какова самая сложная структура данных, которую вы делали или использовали в офисе?
Помогает понять, насколько хорошее / сложное программное обеспечение реального мира.
источник
Ответы:
Использовать пропустить списки для поиска. Там, где я работаю, есть стандартная реализация, и всем рекомендуется ее использовать. Использовали попытки Патриции для эффективного хранения и извлечения IP-адресов. Снова реализация уже присутствовала.
источник
Я разработчик Java. Java Collection Framework может решить мои 90% проблем со структурой данных, остальные 10% требуют усилий. Я думаю, что если вы действительно понимаете сложную стандартную библиотеку, написанную экспертами, вы найдете, что они помогают в большинстве случаев.
Сложные структуры данных трудно поддерживать в реальном мире. Чтобы не испортить код, я разделю проблему на несколько меньших. Каждая небольшая проблема может быть решена с помощью Java Collection Framework . Возможно, решение не самое умное (оно требует больше памяти и медленнее), но оно работает и легко обслуживается. Это компромисс.
Если мне нужно написать сложную структуру данных, я заберу учебник :)
источник
Самой сложной структурой данных, которую я использовал на работе, было три. Однако это было двадцать лет назад.
Проблема разработки промышленного программного обеспечения состоит в том, что большинство промышленных программистов не являются выпускниками компьютерных наук (CompSci); поэтому методы, которые средний выпускник CompSci считает само собой разумеющимся, считаются слишком сложными для программистов, работающих с хлебом и маслом.
Отсутствие общих знаний CompSci в отрасли является серьезной проблемой. Например, я потерял счет количества знакомых мне разработчиков программного обеспечения, которые не понимают таких выражений, как! (A! = 5 && b! = 3) и a == 5 || b == 3 логически эквивалентны. Любой, кто знает, как применять теорему Деморгана, может признать, что эти выражения логически эквивалентны. Большинство не выпускников CompSci никогда не слышали о теореме Деморгана. Если кто-то просматривает какую-либо существенную кодовую базу, он найдет много вхождений выражений, которые отрицают отрицательные логические подвыражения. Читаемость кода, содержащего отрицательные логические подвыражения, почти всегда улучшается путем преобразования этих выражений в их неотрицательную форму.
источник
Однажды я написал очередь календаря (O (1) очередь приоритетов) для имитации на основе событий, в которой профилирование показало, что существующая куча является узким местом.
Я также выпустил продукт, который содержал конечный автомат с примерно 80000 состояниями - код для его генерации был, по меньшей мере, немного сложным.
источник
Давным-давно, в галактике ... Работал в команде, которая использовала "буфферы дружбы" Кнута в ОСРВ на ассемблере.
Кроме того, Игра жизни Конвея с 256 поколениями для мира 1024 x 1024.
источник
На самом деле ничего особенного не использовалось, с нуля это был бы двусвязный список .
Не очень интересно, я использовал другие структуры. Но твой вопрос ответил с нуля.
источник
std::list
, и в этом нет ничего сложного: / я считаю, что красно-черное дерево / дерево AVL намного сложнее, со всеми этими условиями восстановления баланса!Дерево хеш-таблиц, содержащих общие списки финансовых данных - даже не спрашивайте. Иногда я хотел бы быть ковбоем. Ах, простая жизнь под звездами ...
источник
Мне пришлось с нуля написать кольцевую структуру двойного связанного списка для алгоритма « Танцующие ссылки» для решателя судоку. Это было похоже на разработку кубика Рубика. Вся структура представляла собой список списков - каждый узел указывал на четыре других.
источник
Однажды я использовал дерево длины взвешенного пути для специализированного кэша. Это было весело. Также написал свои собственные процедуры управления кучей для
malloc()
замены, но многие люди сделали это.источник
Если подумать, то самая «сложная» структура данных, которую я сделал с нуля, - это моделирование сети элементов, основанной на двусвязных списках. Но это было годы назад, когда я занимался программированием на системном уровне.
В наши дни я едва ли создаю какие-либо причудливые структуры данных. Большая часть этого происходит в базе данных, где вы решаете, что положить в таблицу, может быть, какое-то предварительно вычисленное значение, возможно, идентификатор некоторой связанной записи для быстрого поиска, чтобы избежать ненужного поиска.
Я лично считаю, что стоящая перед нами задача определяет средства. Зачем стремиться использовать какую-то экзотическую структуру данных, если она бесполезна? И если я могу сказать, что в большинстве практических прикладных программ нет необходимости изобретать велосипед.
источник
Считается ли приоритетная очередь? Это встречается практически в каждом приложении, написанном в реальном времени. Только недавно она стала частью стандартной библиотеки Java (Java 1.5).
Кроме этого, я не могу придумать ничего сложного, что я действительно хотел, чтобы я не смог вытащить из библиотеки. Я бы не позволил этому остановить меня, но я бы спросил, почему мне нужна структура данных, слишком экзотическая для библиотек. Я бы определенно искал существующую реализацию с открытым исходным кодом для trie, фильтра Блума или списка пропусков, прежде чем пытаться написать его сам.
В целом я согласен с вашим менеджером в том, что затраты на создание и поддержание настраиваемой структуры данных, слишком эзотерической, чтобы не существовало никакой версии библиотеки, скорее всего, перевесят любую выгоду в производительности, получаемую от нее. Я бы хотел, чтобы вы через профилирование показали, что простые библиотечные структуры приводят к значительному снижению производительности, прежде чем я позволю вам продолжить и оптимизировать их с помощью чего-то фантастического. Потому что, как правило, покупать процессорные циклы дешевле, чем инженерные.
источник