Основные алгоритмы развернуты


307

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

Я ищу такие примеры, которые удовлетворяют следующим критериям:

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

  2. Пример должен быть конкретным. Пожалуйста, дайте ссылку на конкретную систему и конкретный алгоритм.
    Например, в «алгоритме X полезно для обработки изображений» термин «обработка изображений» недостаточно конкретен; в «поиске Google используются алгоритмы графа» термин «алгоритмы графа» недостаточно конкретен.

  3. Алгоритм должен преподаваться в типичной бакалавриата или Ph.D. классы в алгоритмах или структурах данных. В идеале алгоритм описан в типичных учебниках по алгоритмам. Например, «хорошо известная система X использует малоизвестный алгоритм Y» - это плохо.


Обновить:

Еще раз спасибо за отличные ответы и ссылки! Некоторые люди отмечают, что эти критерии сложно удовлетворить, поскольку основные алгоритмы настолько распространены, что трудно указать на конкретное использование. Я вижу сложность. Но я думаю, что стоит привести конкретные примеры, потому что по моему опыту я говорю людям: «Послушайте, алгоритмы важны, потому что они повсюду !» не работает.


Комментарии не для расширенного обсуждения; этот разговор был перенесен в чат .
Бьёрн Кьос-Ханссен

Ответы:


473

На мой взгляд, алгоритмы, являющиеся основной движущей силой системы, легче найти в курсах, не связанных с алгоритмами, по той же причине теоремы с непосредственным применением легче найти в прикладной математике, чем в курсах чистой математики. Практическая проблема редко имеет точную структуру абстрактной проблемы в лекции. Чтобы спорить, я не вижу причин, по которым модные учебные материалы по алгоритмам, такие как умножение Штрассена, тест простоты AKS или алгоритм Мозера-Тардоса, актуальны для практических задач низкого уровня по реализации видеобазы данных, оптимизирующего компилятора, операционной системы. система контроля перегрузки сети или любая другая система. Ценность этих курсов состоит в том, чтобы узнать, что существуют сложные способы использования структуры проблемы для нахождения эффективных решений. В продвинутых алгоритмах также встречаются простые алгоритмы, анализ которых нетривиален. По этой причине я бы не отказался от простых рандомизированных алгоритмов или PageRank.

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

Основные структуры данных и алгоритмы в ядре Linux

Ссылки на исходный код на github .

  1. Связанный список , двухсвязный список , безсвязанный связанный список .
  2. B + Деревья с комментариями, рассказывающими о том, что вы не можете найти в учебниках.

    Относительно простая реализация B + Tree. Я написал это как учебное упражнение, чтобы понять, как работают деревья B +. Оказалось также полезным.

    ...

    Использовались хитрости, которые обычно не встречаются в учебниках. Самые низкие значения находятся справа, а не слева. Все используемые слоты внутри узла находятся слева, все неиспользуемые слоты содержат значения NUL. Большинство операций просто зацикливаются один раз на всех слотах и ​​заканчиваются на первом NUL.

  3. Сортированные по приоритету списки, используемые для мьютексов , драйверов и т. Д.

  4. Красно-черные деревья будут использоваться для планирования, управления виртуальной памятью, для отслеживания дескрипторов файлов и записей каталогов, и т.д..
  5. Интервальные деревья
  6. Деревья Radix , используются для управления памятью , поиска по NFS и функциональности, связанной с сетью.

    Обычное использование основополагающего дерева - хранить указатели для структурирования страниц;

  7. Приоритетная куча , которая буквально является реализацией учебника, используется в системе контрольной группы .

    Простая только для вставки куча приоритетов со статическим размером, содержащая указатели, на основе CLR, глава 7

  8. Хеш-функции , со ссылкой на Кнута и на статью.

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

    http://www.citi.umich.edu/techreports/reports/citi-tr-00-1.pdf

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

  9. Некоторые части кода, такие как этот драйвер , реализуют свою собственную хэш-функцию.

    хэш-функция с использованием алгоритма вращающегося хэша

    Кнут Д. Искусство программирования. Том 3. Сортировка и поиск, глава 6.4. Аддисон Уэсли, 1973

  10. Хеш-таблицы, используемые для реализации inode , проверки целостности файловой системы и т. Д.
  11. Битовые массивы , которые используются для работы с флагами, прерываниями и т. Д. И представлены в Knuth Vol. 4.

  12. Семафоры и спиновые замки

  13. Бинарный поиск используется для обработки прерываний , поиска в кэше регистров и т. Д.

  14. Бинарный поиск с B-деревьями

  15. Первый поиск глубины и вариант, используемый в конфигурации каталога .

    Выполняет модифицированную прогулку по глубине дерева пространства имен, начиная (и заканчивая) в узле, заданном параметром start_handle. Функция обратного вызова вызывается всякий раз, когда найден узел, соответствующий параметру типа. Если функция обратного вызова возвращает ненулевое значение, поиск немедленно прекращается, и это значение возвращается вызывающей стороне.

  16. Поиск в ширину используется для проверки правильности блокировки во время выполнения.

  17. Сортировка слиянием в связанных списках используется для сбора мусора , управления файловой системой и т. Д.

  18. Bubble sort также великолепно реализован в библиотеке драйверов.

  19. Соответствие строк Кнута-Морриса-Пратта ,

    Реализует алгоритм сравнения строк в линейном времени благодаря Кнуту, Моррису и Пратту [1]. Их алгоритм полностью исключает явное вычисление функции перехода DELTA. Его время совпадения равно O (n), для n - длина (текст), используется только вспомогательная функция PI [1..m], для m - длина (шаблон), предварительно вычисленная из шаблона за время O (m). Массив PI позволяет эффективно вычислять функцию перехода DELTA «на лету» по мере необходимости. Грубо говоря, для любого состояния "q" = 0,1, ..., m и любого символа "a" в SIGMA значение PI ["q"] содержит информацию, которая не зависит от "a" и необходима для вычислить DELTA ("q", "a") 2, Поскольку в массиве PI есть только m записей, а в DELTA - O (m | SIGMA |), мы сохраняем коэффициент | SIGMA | во время предварительной обработки путем вычисления PI, а не DELTA.

    [1] Cormen, Leiserson, Rivest, Stein Введение в алгоритмы, 2-е издание, MIT Press

    [2] См. Конечную теорию автоматизации.

  20. Сопоставление паттерна Бойера-Мура со ссылками и рекомендациями о том, когда отдавать предпочтение альтернативе.

    Реализует алгоритм сравнения строк Бойера-Мура:

    [1] Алгоритм быстрого поиска строк, Р.С. Бойер и Мур. Сообщения Ассоциации вычислительной техники, 20 (10), 1977, с. 762-772. http://www.cs.utexas.edu/users/moore/publications/fstrpos.pdf

    [2] Справочник по алгоритмам точного сопоставления строк, Тьерри Лекрок, 2004 г. http://www-igm.univ-mlv.fr/~lecroq/string/string.pdf

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

    Если вы хотите гарантировать, что такого никогда не произойдет, используйте вместо этого реализацию Кнута-Пратта-Морриса (KMP). В заключение, выберите правильный алгоритм поиска строки в зависимости от ваших настроек.

    Скажем, вы используете инфраструктуру textsearch для фильтрации, NIDS или
    любой другой цели, ориентированной на безопасность, а затем переходите на KMP. В противном случае, если вы действительно заботитесь о производительности, скажем, вы классифицируете пакеты для применения политик качества обслуживания (QoS) и не обращаете внимания на возможные соответствия, распределенные по нескольким фрагментам, тогда переходите к BM.

Структуры данных и алгоритмы в браузере Chromium

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

  1. Splay деревья .

    Дерево также параметризуется политикой выделения (Allocator). Политика используется для размещения списков в бесплатном хранилище или зоне C; см. zone.h.

  2. Диаграммы Вороного используются в демоверсии.
  3. Вкладка на основе алгоритма Брезенхэма .
Существуют также такие структуры данных и алгоритмы в стороннем коде, включенном в код Chromium.

  1. Бинарные деревья
  2. Красно-черные деревья

    Заключение Джулиана Уокера

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

    ...

    Красные черные деревья популярны, как и большинство структур данных с причудливым названием. Например, в Java и C ++ структуры карт библиотеки обычно реализуются с красным черным деревом. Красные черные деревья также сопоставимы по скорости с деревьями AVL. Хотя баланс не так хорош, работа, необходимая для поддержания баланса, обычно лучше в красно-черном дереве. Есть несколько заблуждений, но по большей части шумиха вокруг красно-чёрных деревьев верна.

  3. AVL деревья
  4. Сопоставление строк Рабина-Карпа используется для сжатия.
  5. Вычислить суффиксы автомата .
  6. Фильтр Блума, реализованный Apple Inc.
  7. Алгоритм Брезенхэма .

Языковые библиотеки программирования

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

  1. STL C ++ включает в себя списки, стеки, очереди, карты, векторы и алгоритмы сортировки, поиска и манипуляции кучи .
  2. Java API очень обширный и охватывает гораздо больше.
  3. Библиотека Boost C ++ включает в себя такие алгоритмы, как алгоритмы сравнения строк Бойера-Мура и Кнута-Морриса-Пратта.

Алгоритмы распределения и планирования

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

  1. Наименее недавно использованные могут быть реализованы несколькими способами. Список на основе реализации в ядре Linux.
  2. Другие возможности: «Первый пришел - первым вышел», «Наименее часто используемые» и «Круглый Робин».
  3. Вариант FIFO использовался системой VAX / VMS.
  4. Алгоритм Clock на Ричарда Карра используется для замены страницы кадра в Linux.
  5. Процессор Intel i860 использовал политику случайной замены.
  6. Adaptive Replacement Cache используется в некоторых контроллерах хранения IBM и использовался в PostgreSQL, хотя ненадолго из-за проблем с патентами .
  7. Алгоритм распределения памяти Бадди , который обсуждается Кнутом в TAOCP Vol. 1 используется в ядре Linux, а параллельный распределитель jemalloc используется FreeBSD и в facebook .

Основные утилиты в * nix системах

  1. grep и awk реализуют конструкцию NFAs Томпсона-Макнотона-Ямады из регулярных выражений, которая, очевидно, даже превосходит реализацию Perl .
  2. Цорт реализует топологическую сортировку.
  3. fgrep реализует алгоритм сопоставления строк Aho-Corasick.
  4. GNU grep , реализует алгоритм Бойера-Мура согласно автору Mike Haertel.
  5. crypt (1) в Unix реализовал вариант алгоритма шифрования в машине Enigma.
  6. Unix diff, реализованный Дагом Макиллроем на основе прототипа, написанного совместно с Джеймсом Хентом, работает лучше, чем стандартный алгоритм динамического программирования, используемый для вычисления расстояний Левенштейна. Версия для Linux рассчитывает кратчайшее расстояние редактирования.

Криптографические алгоритмы

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

  1. Деревья Меркля , в частности, вариант Tiger Tree Hash, использовались в одноранговых приложениях, таких как GTK Gnutella и LimeWire .
  2. MD5 используется для предоставления контрольной суммы для пакетов программного обеспечения и для проверки целостности в системах * nix ( реализация Linux ), а также поддерживается в Windows и OS X.
  3. OpenSSL реализует множество криптографических алгоритмов, включая AES, Blowfish, DES, SHA-1, SHA-2, RSA, DES и т. Д.

Составители

  1. Разбор LALR осуществляется с помощью yacc и bison.
  2. Алгоритмы Dominator используются в большинстве оптимизирующих компиляторов на основе формы SSA.
  3. lex и flex компилируют регулярные выражения в NFA.

Сжатие и обработка изображений

  1. Алгоритмы Lempel-Ziv для формата изображений GIF реализованы в программах для работы с изображениями, начиная с утилиты * nix, конвертируемой в сложные программы.
  2. Кодировка длины пробега используется для создания файлов PCX (используемых оригинальной программой Paintbrush), сжатых файлов BMP и файлов TIFF.
  3. Вейвлет-сжатие является основой для JPEG 2000, поэтому все цифровые камеры, которые создают файлы JPEG 2000, будут реализовывать этот алгоритм.
  4. Исправление ошибок Рида-Соломона реализовано в ядре Linux , дисководах для компакт-дисков, считывателях штрих-кодов и было объединено со сверткой для передачи изображений от Voyager.

Конфликтное обучение

Начиная с 2000 года, время работы SAT решателей в промышленных тестах (обычно в аппаратной промышленности, хотя используются и другие источники) сокращалось почти экспоненциально с каждым годом. Очень важной частью этой разработки является алгоритм обучения, основанный на конфликтах, который сочетает алгоритм логического распространения ограничений в оригинальной статье Дэвиса Логемана и Лавленда с техникой обучения предложений, которая возникла в программировании ограничений и исследованиях искусственного интеллекта. Для конкретного промышленного моделирования SAT считается простой проблемой ( см. Это обсуждение). Для меня это одна из величайших историй успеха в последнее время, потому что она сочетает в себе алгоритмические достижения, распространенные в течение нескольких лет, умные инженерные идеи, экспериментальную оценку и совместные совместные усилия по решению проблемы. Статья CACM Маликом и Чжан хорошо читать. Этот алгоритм преподается во многих университетах (я посещал четыре, где это было так), но обычно в классе логики или формальных методов.

Приложения SAT решателей многочисленны. IBM, Intel и многие другие компании имеют свои собственные решения для решения SAT. Менеджер пакетов в OpenSUSE также использует SAT-решатель.


5
@HuckBennett, CDCL - алгоритм, параметризованный эвристикой, но сам по себе он не является эвристическим. Он имеет экспоненциальное поведение в худшем случае, но показать это нетривиально. Более того, мы не можем добиться большего успеха, и это лучшее, что мы можем сделать на практике, поэтому я чувствую, что все компьютерщики должны знать об этом! Что касается LRU, FIFO и т. Д., То они эвристические, но, как и в случае с ARC, для реализации могут потребоваться умные алгоритмы или структуры данных.
Виджай Д

9
Разве такой комментарий не был бы применим к Симплексу: первоначально он не был хорошо понят, а позже показал, что он экспоненциальный, но работает на практике, а гораздо позже показано, что он имеет полиномиальную сглаженную сложность? CDCL интересен для анализа алгоритмов, потому что вам нужно пройти через сложность доказательства, чтобы получить семейства формул, демонстрирующих поведение в худшем случае, а также показать, что он может быть экспоненциально более кратким, чем некоторые варианты разрешения. Существуют различные расширения, такие как нарушение симметрии и методы автаркии, для которых такой анализ все еще открыт.
Виджай Д

28
Это сокровище для студента
neo1691

2
@EmanueleViola, я добавил еще несколько примеров. Пост длинный, поэтому я не хочу его расширять. Возможно, вам следует задать новый вопрос, в частности, о реализации фильтров Dijkstra, Simplex, Bloom как части реальной системы, такой как Linux, Chrome, веб-сервер и т. Д. Я думаю, что вы, скорее всего, получите хорошие ответы, если будете конкретны.
Виджай Д

4
Хакерские новости и р / программирование.
Виджей Д

40

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

Мы представляем себе «случайного серфера», который начинается с какой-то веб-страницы и постоянно щелкает случайную ссылку, чтобы перевести его на новую страницу. Вопрос в том, «Какую часть времени будет проводить серфер на каждой странице?» Чем больше времени серфер проводит на странице, тем более важной считается страница.

M

MКπ0Кπ0M


7
Я не думаю, что это типичный материал алгоритмов.
Ману

14
Между прочим, я впервые узнал о PageRank в классе алгоритмов. На самом деле, я думаю, что профессор выбрал его, потому что это был хороший пример «алгоритмов, используемых на практике». Если вы ограничите примеры материалом типа «первая половина CLRS», список примеров будет либо слишком длинным, либо слишком тривиальным - быстрая сортировка, B-деревья и алгоритм Дейкстры распространены повсеместно.
Гек Беннетт

2
Мы обучаем PageRank магистрантам.
Аарон Рот

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

2
Я изучил PageRank как студент в факультативном.
Виджай Д

33

Я бы упомянул широко используемую программную реализацию CPLEX (или аналогичную) метода / алгоритма Simplex для решения задач линейного программирования. Это (?) Наиболее часто используемый алгоритм в исследованиях экономики и операций.

«Если взять статистику о том, какая математическая проблема использует большую часть компьютерного времени в мире, то (не считая проблем обработки базы данных, таких как сортировка и поиск), ответ, вероятно, будет линейным программированием. (Л. Ловас, новый Алгоритм линейного программирования - лучше или хуже, чем симплекс-метод? Math. Intelligencer 2 (3) (1979/80) 141-146.)

Симплексный алгоритм также имеет большое влияние в теории; см., например, (полиномиальную) гипотезу Гирша .

Я думаю, типичный студент или доктор философии. Класс в алгоритмах имеет дело с алгоритмом Симплекс (включая основные алгоритмы из линейной алгебры, такие как метод исключения Гаусса).

(Другие успешные алгоритмы, включая быструю сортировку, перечислены в разделе «Алгоритмы из книги» .)


«Экономика и исследование операций» недостаточно конкретны. CPLEX - это не тот пример, который я искал, так как это всего лишь реализация алгоритма; было бы иначе, если бы, скажем, компилятор gcc использовал симплекс-метод.
Ману

12
Я думаю, что «проблемы линейного программирования» достаточно специфичны, когда мы говорим об экономике и ИЛИ. Также под CPLEX я имел в виду алгоритм, лежащий в основе реализации.
vb le

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

Благодарю. Но я нахожу цитату ужасно расплывчатой. Я думаю, что если я скажу, что перед классом студентов половина из них заснет ;-) Было бы иначе, если бы мы сказали что-то вроде: UPS использует LP для доставки пакетов следующим образом ... Я не говорю таких примеров найти тривиально, но, учитывая, что «большинство крупных фирм используют LP», я надеюсь, что мы можем хотя бы указать на одну из них .
Ману

10
На мой взгляд, с 2007 года LAX (аэропорт) использует программное обеспечение для решения игр Штакельберга для составления графика работы сотрудников службы безопасности. Решение больших LP является частью всего этого, см., Например, teamcore.usc.edu/ARMOR-LAX . Кроме того, я хотел бы спросить кого-то из вашего отдела исследований операций: у них обычно было бы много военных историй об использовании LP в реальной жизни
Сашо Николов

30

Насколько я понимаю, Национальная программа подбора жильцов долгое время представляла собой прямое применение алгоритма Гейла-Шепли для решения проблемы стабильного брака. С тех пор он был немного обновлен, чтобы обрабатывать некоторые дополнительные детали, такие как супружеские задания («проблема двух тел») и т. Д.


Я не уверен, что стабильный брак является типичным материалом алгоритмов.
Ману

16
Он находится в книге «Разработка алгоритмов Тардоса и Кляйнберга», а также в «Рандомизированных алгоритмах» Мотвани, и обе книги широко используются. Стабильный брак может не преподаваться повсеместно на курсах алгоритмов, но, безусловно, он преподается во многих из них.
Сашо Николов

10
Быстрый поиск показывает, что он обнаружился в CS70 Беркли , MIT 6.042 , CMSC451 UMD и т. Д.
mhum

1
Интересно, что когда вы добавляете супружеские задания, проблема становится NP-полной: arxiv.org/abs/1308.4534 . Однако на практике это, кажется, не вызывает особых проблем: en.wikipedia.org/wiki/…
Джошуа Грохов

2
@EmanueleViola, хотя она может и не освещаться традиционно, ее включение в книгу Кляйнберга / Тардоса сделало ее более популярной (а если и не должно быть!)
Суреш Венкат

24

Если вы также включаете материал уровня PhD, многие (большинство?) Программы для выпускников CS включают некоторый курс по теории кодирования. Если у вас есть курс по теории кодирования, вы обязательно охватите код Рида-Соломона, который является неотъемлемой частью работы компакт-дисков и кодирование Хаффмана, которое используется в форматах JPEG, MP3 и ZIP. В зависимости от ориентации курса, вы можете также покрыть Lempel-Ziv, который используется в формате GIF. Лично я получил Лемпеля-Зива на курсах по алгоритму бакалавриата, но я думаю, что это может быть нетипично.


1
И я получил лекцию о кодировании Хаффмана как старшекурснике, которая была необходима для проекта.
Брайан С

Хаффман входит в одну из первых глав CLRS, поэтому он должен определенно пройти квалификацию
Сашо Николов

21

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

GNU grep uses the well-known Boyer-Moore algorithm, which looks first for the
final letter of the target string, and uses a lookup table to tell it how far
ahead it can skip in the input whenever it finds a non-matching character.

19

В более общем смысле, премия Канеллакиса присуждается АСМ именно за те теоретические открытия, которые оказали большое влияние на практике.

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


Я думаю, что это обучаемо, но не широко преподается.
Ману

3
К сожалению, но это правда. Тем не менее, варианты LSH (такие как набросок Count-min и родственники) начинают появляться в курсах «большие данные» или «интеллектуальный анализ данных». Например, я преподаю фильтры Блума в своем классе алгоритмов.
Суреш Венкат

Как личный опыт, LSH не масштабировался для нас на примере «больших данных» (100 млн. Элементов).
рысь

1
@lynxoid это отдельная дискуссия / вопрос :). Есть достаточно примеров , когда это действительно работает , что я думаю , что это отношение к этому конкретному вопросу.
Суреш Венкат

18

ε

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

  • Система Google Sawzall для анализа неструктурированных данных использует Count Sketch для реализации функции «самых популярных элементов»
  • Система «потоковой базы данных» AT & T Gigascope для мониторинга сетевого трафика реализует эскиз CountMin.
  • Система непрерывного мониторинга (CMON) Sprint реализует CountMin.

Вот также сайт, который собирает информацию о приложениях CountMin.

Что касается преподавания, я знаю, что в Принстоне на базовых курсах дискретной математики преподаются основные приемы рисования. Меня учили эскизу CountMin в моем первом курсе алгоритмов. В любом случае анализ CountMin проще, чем анализ почти любого другого рандомизированного алгоритма: это прямое применение парной независимости и неравенства Маркова. Если это не стандартный материал в большинстве курсов по алгоритмам, я думаю, это по историческим причинам.


1
Прекрасные примеры (хотя и не совсем основной алгоритм прямо сейчас).
Ману

16

В последнее десятилетие алгоритмы использовались для увеличения количества (и качества, я думаю?) Трансплантации почки с помощью различных программ подбора донорских почек. У меня были проблемы с поиском последних новостей по этому поводу, но вот по крайней мере несколько указателей:

  • Совсем недавно, в 2007 году, Альянс за пожертвования в паре использовал алгоритм Абрахама, Блума и Сандхольма . Они могут все еще использовать это, но я не мог узнать, ища онлайн. Хотя этот алгоритм почти наверняка не охвачен «стандартными» курсами, он объединяет несколько фундаментальных идей, которые, безусловно, преподаются на таких курсах, чтобы обеспечить достаточно хороший алгоритм для задачи, которая, как правило, является NP-полной (вариант Cycle Cover ).

  • Национальный реестр почек также использует некоторые стандартные алгоритмы, в том числе (в одной точке) CPLEX. Это привело к фактически выполненной цепочке трансплантаций, связывающей 60 человек .

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


Кроме того, для торговли настольными играми используется более простая версия этих алгоритмов: okasaki.blogspot.co.uk/2008/03/what-heck-is-math-trade.html
Radu GRIGore

15

Алгоритм Витерби, который до сих пор широко используется в распознавании речи и во многих других приложениях: http://en.wikipedia.org/wiki/Viterbi_algorithm Сам алгоритм является базовым динамическим программированием.

Из Википедии: «Алгоритм Витерби был предложен Эндрю Витерби в 1967 году в качестве алгоритма декодирования сверточных кодов по шумным цифровым каналам связи. [1] Алгоритм нашел универсальное применение при декодировании сверточных кодов, используемых как в цифровой сотовой сети CDMA, так и в GSM, коммутируемые модемы, спутниковая связь, связь в дальнем космосе и беспроводные локальные сети 802.11. В настоящее время он также широко используется в распознавании речи, синтезе речи, определении ключевых слов, компьютерной лингвистике и биоинформатике. Например, в преобразовании речи в текст (речь распознавания), акустический сигнал рассматривается как наблюдаемая последовательность событий, а текстовая строка считается «скрытой причиной» акустического сигнала. Алгоритм Витерби находит наиболее вероятную текстовую строку с учетом акустического сигнала ».


13
  1. A * используется во многих персональных навигационных устройствах (также называемых единицами GPS)
  2. A * очень хорошо определен и реализован довольно просто.
  3. A * не совсем тривиально, но это не требует доктора философии. чтобы понять это.

А * также часто преподается в игровом дизайне. Я не думаю, что современные 3D игры обычно используют A * для навигации NPC, но 2D / изометрические игры, как и старые игры, используют алгоритм.
Брайан С

@BrianS Знаете ли вы примеры алгоритмов поиска путей, используемых в 3D-играх, в частности, врагов NPC в играх (таких как стрелялки NPC)? Я помню, что читал что-то вроде ... деления карты на гексагональные сектора и использования этого в качестве узла вместо квадратов и это позволило более плавное движение.
Goodwine

@ Goodwine, Извините, у меня нет реальных примеров алгоритмов поиска пути в 3D играх. Мой личный опыт был связан с "кубическими" средами (карта, созданная из кубов, на которых стоят персонажи - в основном 2D, несмотря на 3D-рендеринг), и с искусственными ИИ, используемыми для тестирования персонажей игроков.
Брайан С

12

Познакомьтесь с проектом Jens Vygen BonnTools для Chip Design. http://www.or.uni-bonn.de/~vygen/projects.html Я слышал некоторые разговоры по этому вопросу, а также посмотрел некоторые из их документов. Они используют рандомизированное округление в стиле Рагхавана-Томпсона, а также метод мультипликативного обновления веса для решения крупномасштабных LP с множественным товарным потоком. Тем не менее, как и в любом большом проекте, им также необходимо выполнить некоторые инженерные работы, но методология в значительной степени основана на известных алгоритмах.


Я посмотрю, но это не похоже на типичный материал алгоритмов.
Ману

8
Хм, рандомизированное округление обычно преподается на курсах алгоритмов уровня PhD, нет?
Чандра Чекури

2
Почему просто рандомизированное округление? Санджив Арора, Эльад Хазан и Сатьен Кале считают, что даже метод обновления мультипликативных весов является достаточно базовым для обучения на уровне UG :) «Мы считаем, что наш мета-алгоритм и его анализ достаточно просты и полезны, поэтому их следует рассматривать как основной инструмент Преподавал всем студентам алгоритмы вместе с принципом «разделяй и властвуй», динамическим программированием, случайной выборкой и тому подобным ». (см. cs.princeton.edu/~arora/pubs/MWsurvey.pdf ).
Джагадиш


10

Я довольно удивлен, что со всеми причудливыми алгоритмами, описанными выше, никто не упомянул почтенное семейство алгоритмов сжатия Лемпеля-Зива (изобретено в 1977/78).

  1. Они используются повсюду - от текста к изображению для потоковой обработки. Вполне возможно, что LZ * является единственным наиболее используемым семейством алгоритмов из существующих.
  2. Сжатие по словарям явилось значительным прорывом в теории сжатия и явным отходом от подхода стиля Шеннона-Фано.
  3. Алгоритмы в семье довольно просты и просты для понимания.

Обновить

Видимо, это было упомянуто уже кратко.


10

Разложение по сингулярным числам (SVD) имеет тесную связь со статистическим факторным анализом или анализом главных компонентов и является приемлемым для студентов линейной алгебры или класса статистики и имеет много важных теоретических свойств. это также играет роль в алгоритмах сжатия изображений. он сыграл ключевую роль в призовых конкурсах на приз $ 1M Netflix (одно из крупнейших в мире соревнований по сбору данных) и теперь используется на их сайте для прогнозирования пользовательских рейтингов. также известно, что он тесно связан с самоорганизующимися нейронными сетями Хебба, которые берут свое начало в биологической теории.

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


10

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

ОБНОВЛЕНИЕ Забудьте об этом очевидном: UPS, FedEx, USPS должны каждую ночь решать большие проблемы с коммивояжером. Экономит много времени и денег для отправки водителей по оптимальному маршруту.

ОБНОВЛЕНИЕ2 Проблема минимального набора вершин обратной связи используется для разрешения взаимоблокировок во многих ОС.


Вы уверены, что TSP - это проблема, которую пытаются решить компании по доставке посылок? Я думал, что более сложная практическая задача - это рюкзак и другие проблемы с упаковкой.
Андрас Саламон

Задания для водителей меняются каждый день (то есть парню из UPS не нужно посещать один и тот же дом каждый день), поэтому маршруты нужно обновлять ежедневно. Это не чистый TSP - существуют дополнительные ограничения, такие как улицы с односторонним движением, отсутствие разворотов, доставка пакетов на одной стороне улицы, но не на другой.
рысь

Я уверен, что упаковка также важна, хотя.
Рысь

9

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


8

Эта относительно новая книга заслуживает рассмотрения в качестве полного / подробного ответа на вопрос в удобной, расширенной / собранной форме и которая может быть использована в качестве дополнительного материала для класса алгоритмов. [некоторые из них уже упоминались; Сильное перекрытие само по себе заметно.]


2-я ссылка вышла в издании Computing in Science & Engineering, опубликованном в январе / феврале 2000 года, в совместной публикации Американского института физики и IEEE Computer Society. составлено приглашенными редакторами Джеком Донгаррой из Университета Теннесси и Национальной лаборатории Ок-Риджа и Фрэнсисом Салливаном из Центра вычислительных наук в Институте оборонного анализа
vzn


6

Думая об очень простых алгоритмах

  1. Генераторы случайных чисел встречаются повсеместно и конкретно во всех играх.
  2. Базы данных состоят из множества алгоритмов, включая B +, хэши, приоритетные очереди, регулярные выражения, криптографию, сортировку и т. Д. Мой друг говорит, что SGBD находятся на вершине вычислительной пищевой цепи.
  3. Сортировка используется везде, например в Excel. Это на самом деле используется все время в реальной жизни, но обычно люди используют специальные алгоритмы
  4. Биты четности используются повсюду
  5. Кодирование Хаффмана в программном обеспечении для сжатия и передачи
  6. Стеки (LIFO) используются повсеместно. Внутри языков программирования, в процессорах и т. Д.

Приятно показать, что они появляются в реальной жизни:

A. Многие группы используют своего рода алгоритм покрывающего дерева для связи путем иерархического разделения телефонных списков между людьми B. Автомобили на перекрестке обычно используют алгоритм циклического перебора (добровольно) C. Большинство мест, например банки и больницы, организовать их клиентов в алгоритме FIFO


4
Сортировка не алгоритм. Это задача, то есть то, что вы хотите выполнить, для чего вы должны разработать (или, на практике, выбрать) алгоритм.
Дэвид Ричерби

Похоже, это не конкретные примеры, как того требует вопрос.
Каве

SGBD == RDBMS FYI для тех, кто не знал.
Автодидакт

6

Увлекательная алгоритмическая проблема возникает в медицинском применении компьютерной томографии. В компьютерной томографии (КТ) тело подвергается воздействию рентгеновских лучей под разными углами. На одном конце сканера расположены рентгеновские передатчики, а на другом - датчики. Из такой серии сканирований изображение реконструируется для изучения врачом!

Проекция фильтруется обратно алгоритм является основой для реконструкции изображения из набора сканирования. Этот алгоритм фактически является формой задачи аппроксимации, в которой "сигнал" дискретизируется ниже частоты Найквиста. Этот алгоритм используется «за кулисами» во всех больницах, и базовая отфильтрованная обратная проекция использует студенческую математику, такую ​​как преобразования Фурье, для достижения теоремы среза Фурье .


6

Пример БПФ

Однажды я помог перенести алгоритм FFT на другой системный язык.

Алгоритм использовался для определения разрывов линий при коаксиальной доставке кабельного телевидения / интернета / телефона. Обычно технический специалист запрашивает сигнал для отправки на ящик клиента, в то же время он отображает статистику по конкретному клиенту в режиме реального времени, такую ​​как QoS, дБ, ... Технический специалист может использовать данные и график, чтобы определить в пределах нескольких футов между домом и полюсом, где существовал частичный разрыв (или несколько разрывов, как мне сказали).

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

Извините, я должен был держать это на высоком уровне.


5

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



2

В Википедии есть приличная коллекция алгоритмов / приложений, более или менее классифицированных в списке . Microsoft предоставляет наиболее цитируемые статьи, но без какого-либо четкого объяснения области информатики или приложения. Существует также хронологический список из различных конференций CS _http: //jeffhuang.com/best_paper_awards.html_, составленный профессором Хуан.

Спектральная кластеризация - это элегантный алгоритм кластеризации, известный как алгоритм нормализованных разрезов , представленный Jianbo Shi и Jitendra Malik для сегментации изображения. Он также был хорошо разработан в приложениях кластеризации данных, являясь хорошим пересечением между двумя сообществами.


-2

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

  • алгоритмы физического моделирования . в основном с использованием законов Ньютона, но с использованием других законов (таких как динамика жидкости). используется в самых разных приложениях, начиная от инженерных приложений, видеоигр и иногда до фильмов. это также отвечает за значительное повышение безопасности, эффективности или надежности, например, автомобилей и самолетов, посредством виртуальных / испытательных конструкций, подвергающихся моделируемым нагрузкам. основная связанная область текущих исследований в области биоинформатики, имеющая огромное значение для биологии, например, разработка лекарств, профилактика заболеваний и т. д .: прогнозирование складывания белка / структуры . Также отметим, что в этом году Нобелевская премия по химии была присуждена за химическое моделирование Карплюсу, Левитту, Варшелю. Алгоритмы физического моделирования активно используются, обеспечении безопасности / испытаний ядерного оружиянапример, в лабораториях Лос-Аламоса.

  • алгоритмы трассировки лучей / CGI . это началось как тема исследования всего несколько десятилетий назад [друг получил степень магистра в области алгоритмов трассировки лучей в CS], но стало очень распространенным, например, в играх и бизнесе по созданию фильмов, достигая необычайного уровня правдоподобия, который ответственен за большое количество спецэффекты в кино. в эти отрасли вложены буквально миллиарды долларов и они основаны на этих алгоритмах, и целые крупные корпорации используют их, например Pixar . в основном первоначально использовавшаяся, например, в фантастических фильмах, эта техника сейчас настолько широко распространена, что обычно используется даже в «типичных» фильмах. например недавно Великий Гэтсби в значительной степени полагались на эффекты CGI для создания убедительных или стилизованных окружений, ретуширования фильма / персонажей и т. д.


-3

Код Rosetta перечисляет применяемые алгоритмы с помощью Задачи программирования (692) и Языка программирования (518) с Semantic MediaWiki.


Как это пример «основных алгоритмов ... развернутых в коммерческом, правительственном или широко используемом программно-аппаратном обеспечении»?
Дэвид Ричерби

Было бы полезно дать перекрестную ссылку на реализацию каждого из превосходных алгоритмов, перечисленных в других ответах здесь, на URI Википедии / DBpedia. Для всех этих алгоритмов не существует URI Википедии / DBpedia; но есть кодовые страницы Розетты.
Уэс Тернер

bigocheatsheet.com также перечисляет сложность Big-O и ссылки на статьи в Википедии для нескольких алгоритмов.
Уэс Тернер

В вопросе приводятся примеры основных алгоритмов, используемых в значительных частях программного обеспечения. «Вот сайт с алгоритмами, реализованными на миллионе языков», на этот вопрос вообще нет ответа. На самом деле, это полная противоположность тому, что ищет вопрос.
Дэвид Ричерби

Тем не менее, полезная, контекстуально значимая ссылка.
Уэс Тернер

-5

возможно, все основные / предпочтительные алгоритмы, представляющие интерес для этой аудитории, уже упоминались. однако, еще несколько заслуживают упоминания для полноты. И здесь важен некоторый анализ того, что считается значимым алгоритмом.

в областях CS & IT, по-видимому, давно было замечено явление в искусственном интеллекте, которое называется «перемещение ворот» . Это психологический феномен, когда поле продвигается относительно быстро, но люди быстро мысленно приспосабливаются к «новому нормальному состоянию» и воспринимают реальные или даже прорывные достижения как обыденные или непримечательные в ретроспективе, после того, как достигнуты, то есть преуменьшены или сведены к минимуму. в этом вопросе это отражается в том, как алгоритмы переходят от НИОКР к «развертыванию». цитируя автора вопроса в последующих комментариях:

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

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

иногда самые вездесущие алгоритмы также игнорируются! Интернет и WWW - это большая среда / почти экология для алгоритмов. еще сравнительно молодой, всего лишь около двух десятилетий (изобретенный в 1991 году), за короткий промежуток времени он значительно вырос и экспоненциально вырос. Рост сайта WWW, вероятно, даже опередил знаменитый экспоненциальный закон Мура.

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

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

он также использует сложное обнаружение / исправление ошибок . Интернет, вероятно, самая большая, самая отказоустойчивая система, когда-либо созданная людьми, которая продолжает развиваться.

Далее, есть веские основания утверждать, что алгоритмы, питающие WWW, являются передовыми. HTTP и веб-серверы хорошо настроены / оптимизированы, а также используют расширенные протоколы безопасности / шифрования (HTTPS). логика рендеринга веб-страницы стала чрезвычайно продвинутой в HTML5 и CSS3 наряду с языком программирования Javascript .

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

еще одна относительно новая область построения алгоритмов в Интернете, все еще появляющаяся, основанная на коллективном интеллекте . Программное обеспечение stackexchange само по себе является примером сложной системы коллективного интеллекта. Социальные сети также демонстрируют ключевые особенности коллективного интеллекта, и его возможности постоянно добавляются для увеличения этого интеллекта (например, «лайкам» на Facebook всего несколько лет). область рейтинговых систем основана на алгоритмах совместной фильтрации и все еще развивается на основе новых исследований и приложений.

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


много цитат может быть добавлено к этому. вот для начала: DARPA и интернет-революция от Waldrop
Waldrop vzn

другая ссылка на оптимизацию интернета, биография Дэнни Левина , соучредителя akamai, «гения, который
изменил

-8

Удивительно успешным (аппаратным) алгоритмом является сброс при включении питания.

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

Сброс при включении питания - это то, почему все работает с процессором, считается ли оно встроенным или нет.

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


5
Сброс при включении питания не является алгоритмом. Это задача, то есть то, что вы хотите выполнить, для чего вы должны разработать алгоритм.
Дэвид Ричерби
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.