Розгорнуті основні алгоритми


307

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

Я шукаю такі приклади, які відповідають наступним критеріям:

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

  2. Приклад повинен бути конкретним. Будь ласка, дайте посилання на конкретну систему та конкретний алгоритм.
    Наприклад, в "алгоритмі X корисний для обробки зображень" термін "обробка зображення" недостатньо конкретний; у "Пошук Google використовує графічні алгоритми", термін "алгоритми графіків" недостатньо конкретний.

  3. Алгоритм повинен викладатися в типових студентах або докторантурах. класи в алгоритмах або структурах даних. В ідеалі алгоритм висвітлюється в типових підручниках алгоритмів. Наприклад, "відома система X використовує маловідомий алгоритм Y" - це не добре.


Оновлення:

Ще раз дякую за чудові відповіді та посилання! Деякі люди коментують, що важко задовольнити критерії, оскільки основні алгоритми настільки поширені, що важко вказати на конкретне використання. Я бачу складність. Але я вважаю, що варто придумати конкретні приклади, тому що, з мого досвіду, кажу людям: "Дивіться, алгоритми важливі, тому що вони майже всюди !" не працює.


Коментарі не для розширеного обговорення; ця розмова переміщена до чату .
Bjørn Kjos-Hanssen

Відповіді:


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. Деякі частини коду, наприклад, цей драйвер , реалізують власну хеш-функцію.

    хеш-функція за допомогою алгоритму Rotating Hash Rotating Hash

    Кнут, Д. Мистецтво комп’ютерного програмування, Том 3: Сортування та пошук, Розділ 6.4. Аддісон Веслі, 1973р

  10. Таблиці хешу, які використовуються для впровадження входів , перевірки цілісності файлової системи тощо.
  11. Бітові масиви , які використовуються для боротьби з прапорами, перериваннями тощо, представлені в Knuth Vol. 4.

  12. Семафори і прядильні замки

  13. Двійковий пошук використовується для обробки переривань , пошуку кеш-регістрів тощо.

  14. Двійковий пошук з B-деревами

  15. Перший пошук та варіант глибини, що використовуються в конфігурації каталогу .

    Виконує модифіковану першу глибину дерева простору імен, починаючи (і закінчуючи) у вузлі, визначеному start_handle. Функція зворотного виклику викликається кожного разу, коли знайдеться вузол, який відповідає параметру типу. Якщо функція зворотного дзвінка повертає ненульове значення, пошук негайно припиняється, і це значення повертається абоненту.

  16. Перший пошук ширини використовується для перевірки правильності блокування під час виконання.

  17. Сортування об'єднань у пов'язаних списках використовується для збору сміття , управління файловою системою тощо.

  18. Сорт бульбашок дивовижно реалізований і в бібліотеці драйверів.

  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, Introcution Stein to Algorithms, 2nd Edition, 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

    Примітка: Оскільки Боєр-Мур (BM) здійснює пошук відповідностей справа наліво, все ще можливо, що відповідність може бути поширена на декілька блоків, у такому випадку цей алгоритм не знайде збігу.

    Якщо ви готові переконатися, що подібне ніколи не відбудеться, використовуйте натомість реалізацію Knuth-Pratt-Morris (KMP). На закінчення виберіть правильний алгоритм пошуку рядків залежно від вашого параметра.

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

Структури даних та алгоритми у веб-переглядачі Chromium

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

  1. Splay дерева .

    Дерево також параметризується політикою розподілу (Allocator). Політика використовується для розподілу списків у вільному магазині C або зоні; див. зона.h.

  2. Діаграми Voronoi використовуються в демонстраційній версії.
  3. Вкладка на основі алгоритму Брезена .
Також є такі структури даних та алгоритми у сторонній код, що входить до коду Chromium.

  1. Двійкові дерева
  2. Червоно-чорні дерева

    Висновок Джуліана Уокера

    Червоні чорні дерева - цікаві звірі. Вважається, що вони простіші за дерева AVL (їх прямий конкурент), і, на перший погляд, це здається, тому що вставка - вітер. Однак, коли людина починає грати з алгоритмом видалення, червоні чорні дерева стають дуже хитрими. Однак противага цій додатковій складності полягає в тому, що і вставка, і видалення можуть бути реалізовані за допомогою алгоритму одного проходу, зверху вниз. Такого не стосується дерев AVL, де тільки алгоритм вставки можна записувати зверху вниз. Для видалення з дерева AVL необхідний алгоритм знизу вгору.

    ...

    Червоні чорні дерева популярні, оскільки більшість структур даних з примхливою назвою. Наприклад, у Java та C ++ структури бібліотечних карт зазвичай реалізовані з червоним чорним деревом. Червоні чорні дерева також по швидкості порівнянні з деревами AVL. Хоча баланс не настільки хороший, робота, необхідна для підтримання рівноваги, зазвичай краща в червоному чорному дереві. Навколо плаває кілька помилок, але здебільшого галас щодо червоних чорних дерев є точним.

  3. Дерева AVL
  4. Для стиснення використовується відповідність рядків Рабіна-Карпа .
  5. Обчисліть суфікси автомата .
  6. Фільтр Bloom реалізований компанією 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. Адаптивний керуючий кеш-пам'ять використовується в деяких контролерах зберігання IBM і використовувався в PostgreSQL, хоча лише коротко через проблеми з патентами .
  7. Алгоритм розподілу пам'яті Бадді , який обговорюється Кнутом в TAOCP Vol. 1 використовується в ядрі Linux, а одночасний розподільник jemalloc, який використовується FreeBSD та у facebook .

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

  1. grep and awk обидва реалізують побудову НФА Томпсона-Макнафтона-Ямади з регулярних виразів, що, очевидно, навіть перемагає реалізацію Perl .
  2. tsort реалізує топологічний сорт.
  3. fgrep реалізує алгоритм відповідності рядків Aho-Corasick.
  4. GNU grep , реалізує алгоритм Бойєра-Мура за словами автора Майка Хаертеля.
  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. Виправлення помилок Reed-Solomon реалізовано в ядрі Linux , компакт-дисках, зчитувачах штрих-кодів і поєднується з згорткою для передачі зображення від Voyager.

Навчання на основі конфлікту

Починаючи з 2000 року, час роботи розв'язувачів SAT на промислових орієнтирах (як правило, з апаратної індустрії, хоча використовуються й інші джерела) щороку скорочується майже експоненціально. Дуже важливою частиною цієї розробки є алгоритм навчання конфліктних керованих пропозицій , який поєднує алгоритм булевого обмеження обмежень в оригінальній статті Девіса Логмана та Лоуленда з технікою клаузального навчання, що виникла в програмі обмежень та дослідженні штучного інтелекту. Для конкретного промислового моделювання SAT вважається легкою проблемою ( див. Цю дискусію). Для мене це одна з найбільших історій успіху останнім часом, оскільки вона поєднує в собі алгоритмічний прогрес, розповсюджений протягом кількох років, розумні інженерні ідеї, експериментальну оцінку та узгоджені спільні зусилля для вирішення проблеми. Стаття про CACM Маліка і Чжан - це добре прочитане. Цей алгоритм викладають у багатьох університетах (я відвідував чотири, де це було), але, як правило, у класі логіки чи формальних методів.

Застосування розв'язувачів SAT безліч. IBM, Intel та багато інших компаній мають власні реалізації SAT-рішень. Менеджер пакунків у OpenSUSE також використовує SAT-рішення.


5
@HuckBennett, CDCL - алгоритм, параметризований евристикою, але сам по собі не є евристичним. У найгіршому випадку експоненціальна поведінка, але це нетривіально. Більше того, ми не можемо зробити кращого, і це найкраще, що ми можемо зробити на практиці, тому я думаю, що всі комп'ютерні фахівці повинні знати про це! Що стосується LRU, FIFO тощо, вони є евристикою, але, як і у ARC, для впровадження можуть знадобитися розумні алгоритми або структури даних.
Vijay D

9
Чи не застосував би такий коментар до Simplex: спочатку недостатньо зрозумілий і пізніше виявлений експоненціальний, але працює на практиці і набагато пізніше виявляється складність полінома згладжена? CDCL цікавий для аналізу алгоритмів, тому що вам потрібно пройти складність доказів, щоб отримати сімейства формул, що демонструють гіршу поведінку випадку, а також показати, що це може бути експоненціально більш лаконічним, ніж деякі варіанти роздільної здатності. Існують різні розширення, такі як розрив симетрії та техніка автаркії, для яких такий аналіз ще є відкритим.
Vijay D

28
Це скарб для студента
neo1691

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

4
Новини та хакерські програми
Vijay D

40

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

Ми уявляємо "випадкового серфера", який починається з якоїсь веб-сторінки, і кілька разів натискаємо випадкове посилання, щоб перенести його на нову сторінку. Питання полягає в тому, "Яку частку часу серфер витратить на кожну сторінку?" Чим більше часу серфер проводить на сторінці, тим важливішою вважається сторінка.

M

Mkπ0kπ0M


7
Я не думаю, що це типовий матеріал алгоритмів.
Ману

14
До речі, я вперше дізнався про PageRank в класі алгоритмів. Насправді, я думаю, професор вибрав це, тому що це був приємний приклад "алгоритмів, які використовуються на практиці". Якщо обмежити приклади матеріалом типу "перша половина CLRS", список прикладів буде або занадто довгим, або занадто тривіальним - кваксор, B-дерева та алгоритм Діккстри є всюдисущими.
Гек Беннетт

2
Ми навчаємо PageRank магістрантам.
Аарон Рот

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

2
Я дізнався PageRank як бакалавр у факультативі.
Vijay D

33

Я б зазначив широко використовуване програмне забезпечення CPLEX (або подібне) впровадження методу / алгоритму Simplex для вирішення задач лінійного програмування. Це (?) Алгоритм, який найчастіше використовується в економіці та дослідженні операцій.

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

Алгоритм Simplex також має великий вплив в теорії; див., наприклад, (Поліномальна) Гіршева конституція .

Я здогадуюсь про типового бакалавра або доктора наук. Клас алгоритмів має справу з алгоритмом Simplex (включаючи основні алгоритми з лінійної алгебри, наприклад, метод усунення Гаусса).

(Інші успішні алгоритми, включаючи Quicksort для сортування, перелічені в Алгоритмах із Книги .)


"дослідження економіки та операцій" недостатньо конкретно. CPLEX - це не той тип прикладу, якого я шукав, оскільки це лише реалізація алгоритму; було б інакше, якби, скажімо, компілятор gcc використовував метод симплекс.
Ману

12
Я думаю, що "проблеми лінійного програмування" є досить специфічними, коли ми говоримо про економіку та АБО. Також CPLEX мав на увазі алгоритм, що лежить в основі реалізації.
vb le

16
"Сьогодні більшість великих фірм використовують лінійне програмування для цінової продукції та управління ланцюгами поставок. Транспортні фірми використовують її для вибору найдешевшого способу консолідації, координації та маршрутного перевезення багатьох товарів від глобально розподілених постачальників на далекі ринки з урахуванням обмежень потужностей. Нафта промисловість використовує його для розвідки, змішування, планування виробництва та розподілу. Залізо та металургійна промисловість використовує його для оцінки залізних руд, вивчення додавання коксових печей та відбору продуктів ... " news.stanford.edu/news/2005/may25/ dantzigobit-052505.html
Ніколов

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

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

30

Наскільки я розумію, Національна програма співставлення резидентів довгий час була лише прямим застосуванням алгоритму Гейла-Шеплі для стабільної проблеми шлюбу. З тих пір вона була трохи оновлена, щоб обробити деякі додаткові деталі, такі як призначення подружжя (він же "проблема двох тіл") тощо


Я не впевнений, що стабільний шлюб є ​​типовим матеріалом алгоритмів.
Ману

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

10
Швидкий пошук виявляє, що він виявився в CS70 Berkeley , MIT''s 6.042 , UMD's CMSC451 тощо ...
mhum

1
Цікаво, що коли ви додаєте до спільних доручень, проблема стає NP-повною: arxiv.org/abs/1308.4534 . Однак на практиці це, мабуть, не викликає особливих проблем: en.wikipedia.org/wiki/…
Джошуа Грохов

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

24

Якщо ви також включаєте матеріали на рівні доктора наук, багато (більшість?) Випускників програм CS включають певний курс теорії кодування. Якщо у вас є курс теорії кодування, ви обов'язково покриєте код Рід-Соломона, який є невід'ємним елементом роботи компактних дисків та кодування Хаффмана, що використовується у форматах файлів JPEG, MP3 та ZIP. Залежно від спрямованості курсу, ви також можете охопити Lempel-Ziv, який використовується у форматі GIF. Особисто я отримав Лемпель-Зів на курсі бакалаврських алгоритмів, але думаю, що це може бути нетипово.


1
І я отримав лекцію про кодування Хаффмана як нижчу програму, яка була потрібна для проекту.
Брайан S

Хаффман знаходиться в одній з перших глав CLRS, тому його обов'язково слід кваліфікувати
Сашо Ніколов

21

GNU 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" та "родичі") починають з'являтися на курсах "великих даних" або "data data". Наприклад, я навчаю фільтри розквітання у своєму класі алгоритмів.
Суреш Венкат

Як особистий досвід, LSH не оцінював нас на екземплярі "великих даних" (100 млн. Предметів).
лінзоїд

1
@lynxoid - це окрема дискусія / питання :). Є достатньо прикладів того, як це працює, я вважаю, що це стосується цього конкретного питання.
Суреш Венкат

18

ε

Деякі приклади промислового використання цих структур даних:

  • Система Sawzall від Google для неструктурованого аналізу даних використовує Count Sketch для реалізації функції "найпопулярніших елементів"
  • Система "потокової бази даних" Gigascope AT&T для моніторингу мережевого трафіку реалізує ескіз CountMin.
  • Система безперервного моніторингу Sprint (CMON) реалізує 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 GRIGо

15

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

З Вікіпедії: "Алгоритм Вітербі був запропонований Ендрю Вітербі в 1967 році як алгоритм декодування згорткових кодів по галасливим цифровим каналам зв'язку. [1] Алгоритм знайшов універсальне застосування в розшифровці згорткових кодів, що використовуються як в цифровій стільникові CDMA, так і в GSM, комутовані модеми, супутникові, глибококосмічні комунікації та бездротові локальні мережі 802.11. Зараз він також широко використовується для розпізнавання мовлення, синтезу мови, виявлення ключових слів, обчислювальної лінгвістики та біоінформатики. Наприклад, у мовленні до тексту (мова розпізнавання), акустичний сигнал трактується як спостережувана послідовність подій, а рядок тексту вважається "прихованою причиною" акустичного сигналу. Алгоритм Вітербі знаходить найбільш ймовірний рядок тексту, заданий акустичним сигналом ".


13
  1. A * використовується у багатьох пристроях особистого навігації (так само GPS-пристроїв)
  2. A * дуже чітко визначений і реалізований досить просто.
  3. * Не зовсім тривіально, але це не потребує доктора наук. щоб зрозуміти це.

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

@BrianS Чи знаєте ви приклади алгоритмів накладання маршрутів, які використовуються в 3D-іграх, зокрема ворогів NPC в іграх (наприклад, npc Shooter) Я пам'ятаю, як читав щось на зразок ... ділення карти на шестикутні сектори і використовую це як вузол, а не квадрати , і це дозволило плавніше рух.
Goodwine

@Goodwine, Вибачте, я не маю жодних реальних прикладів алгоритмів накладання маршрутів у 3D-іграх. Мій особистий досвід був із середовищем, схожим на "кубик" (карта, зроблена з кубів, на яких стоять символи - в основному 2D, незважаючи на 3D-рендерінг) та манекенів, що використовуються для тестування персонажів гравця на.
Брайан Ш

12

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


Я буду дивитись, але це не схоже на матеріал типових алгоритмів.
Ману

8
Гм, рандомізоване округлення, як правило, викладається на курсах алгоритмів рівня докторантури, ні?
Чандра Чекурі

2
Чому просто рандомізоване округлення? Сандєєв Арора, Елад Хазан та Сатьєйн Кале вважають, що навіть багатомобільний метод оновлення ваг є достатньо базовим, щоб навчати його на рівні УГ :) "Ми вважаємо, що наш мета алгоритм та його аналіз досить прості та корисні, що їх слід розглядати як основний інструмент" навчали всіх алгоритмів студентів разом з діленням і перемогою, динамічним програмуванням, випадковим вибіркою тощо. " (пор. cs.princeton.edu/~arora/pubs/MWsurvey.pdf ).
Jagadish


10

Я досить здивований, що з усіма придуманими вище алгоритмами ніхто не згадував про шановну сімейство алгоритмів стиснення Лемпель-Зів (винайдений у 1977/78 рр.).

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

Оновлення

Мабуть, це було згадано коротко.


10

Синхронна декомпозиція величини (SVD) має міцний зв'язок із статистичним факторним аналізом або аналізом основних компонентів і зрозуміла в межах лінійної алгебри або ступеня базової лінійної алгебри та має багато важливих теоретичних властивостей. він також грає роль в алгоритмах стиснення зображення. він відіграв ключовий елемент у виграшному конкурсі на призовому конкурсі Netflix $ 1 млн. (одному з найбільших у світі змагань з передачі даних в історії) і зараз реалізується на їхньому сайті для прогнозування рейтингів користувачів. Відомо також, що вона дуже пов'язана з самоорганізуючими нейробними мережами Геббіана, які беруть початок в біологічній теорії.

Існує певний зв’язок і з градієнтним спуском, який широко застосовується в машинному навчанні та штучних нейронних мережах і як дуже універсально застосовувана методика оптимізації. У цьому випадку метод Ньютона є базовою формою 2d. існує алгоритм спуску градієнта для отримання SVD.


10

Пошук ейлерового шляху лежить в основі складання геному - завдання, яке зазвичай виконується при роботі з повноцінними геномами (в галузі біоінформатики, медицини, судової медицини, екології).

ОНОВЛЕННЯ Забули це очевидне: UPS, FedEx, USPS повинні вирішувати великі випадки проблеми продавця подорожі щовечора. Економить на них багато часу та грошей, щоб відправити водіїв за оптимальним маршрутом.

UPDATE2 Проблема з набором вершин зворотного зв’язку використовується для вирішення тупикових ситуацій у багатьох ОС.


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

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

Я впевнений, що упаковка також важлива.
лінзоїд

9

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


8

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

  • Дев'ять алгоритмів, які змінили майбутнє: геніальні ідеї, які керують сучасними комп’ютерами MacCormick

    • індексація пошукових систем
    • Pagerank
    • криптографія відкритого ключа
    • виправлення помилок кодів
    • розпізнавання образів
    • стиснення даних
    • бази даних
    • цифрові підписи
    • теорія обчислюваності
  • ще одне посилання дещо схоже, але більш теоретичне, The Best of the 20th Century: Editors Name Top 10 Algorithms Cipra / SIAM.

    • Метод Монте-Карло
    • симплексний алгоритм
    • Ітерація підпростору Крилова
    • декомпозиційне обчислення матриці
    • Укладач Fortran
    • QR-матричний алгоритм
    • швидкий кіркот
    • FFT
    • виявлення цілого відношення
    • швидкий багатополюсний алгоритм

Другий випуск - це спочатку з січня / лютого 2000 року випуск Computing in Science & Engineering, спільна публікація Американського інституту фізики та 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

Я колись допоміг перенести алгоритм FFT на іншу мову системи.

Алгоритм використовувався для визначення перерв лінії в коаксіальній доставці кабельного телебачення / Інтернету / телефону. В основному технік вимагає надсилання сигналу до коробки клієнта, в той же час вони піднімають в режимі реального часу показ статистики для конкретного замовника, такого як QoS, dB, .... Технік може використовувати дані та графік, щоб визначити в декількох футах між будинком та полюсом, де існував частковий перерва (або кілька перерв, як мені сказали).

Як було сказано вище, FFT широко використовується, але це було одним з найбільш кричущих і очевидних (з точки зору того, чому і як) я бачив на практиці.

Вибачте, що мені довелося підтримувати це на високому рівні.


5

Лінійний алгоритм Брезенхема - єдиний найкорисніший алгоритм, який я натрапив. Легко зрозуміти, що Ive використовував його для безлічі застосувань: від малювання ліній до складного сплайнера для двигуна 3d-лиття до складного багатокутника, а також для складного використання анімації та масштабування.



2

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

Спектральна кластеризація - це елегантний алгоритм кластеризації, відомий як алгоритм нормованих обрізів, запроваджений Джанбо Ши та Джітендра Малік для сегментації зображень. Він також добре розвинений в додатках кластеризації даних, що є хорошим перетином між двома громадами.


-2

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

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

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


-3

Код Rosetta перераховує застосовані алгоритми за допомогою програми програмування (692) та мови програмування (518) з Semantic MediaWiki.


Як це приклад "основних алгоритмів ... розгорнутих у комерційному, державному чи широко використовуваному програмному / апаратному забезпеченні"?
Девід Річербі

Було б корисно перехресне посилання на реалізацію кожного з відмінних алгоритмів, перелічених у інших відповідях тут, на URI-адреси Wikipedia / DBpedia. Немає URI Вікіпедії / DBpedia для всіх цих алгоритмів; але є сторінки коду Rosetta.
Уес Тернер

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

Питання задає приклади основних алгоритмів, які використовуються у значних частинах програмного забезпечення. "Ось веб-сайт з алгоритмами, реалізованими мільйонами мов" зовсім не відповідає на це питання. Насправді це абсолютно протилежне тому, що питання шукає.
Девід Річербі

Тим не менш, корисна, контекстуально відповідна посилання.
Уес Тернер

-5

можливо, всі основні / бажані алгоритми, що цікавлять цю аудиторію, були згадані в цей момент. однак, ще кілька заслуговують згадки за повноту. & деякий аналіз того, що вважається важливим алгоритмом, є релевантним тут.

у сферах CS & IT, здається, явище, помічене давно в AI, під назвою "переміщення топових цілей" . Це психологічне явище, де поле просувається відносно швидко, але люди швидко подумки налаштовуються на "нове нормальне" і сприймають реальний або навіть проривний прогрес як мирський або не примітний у ретроспективі, після того, як вони виконані, тобто зменшені або мінімізовані. це сильно зафіксоване в цьому питанні тим, що алгоритми переходять від НДДКР до "розгортання". Цитуючи автора питання в наступних коментарях:

Насправді, незначна частка всього написаного коду реалізує все, що цікаво з алгоритмічної точки зору.

але це проблематично і, в основному, переопределення слова "алгоритм", орієнтованого на TCS. мабуть, цікаві алгоритми розроблені. чи означає це, що якщо проблема зводиться до вдосконаленого алгоритму, вона вже не буде "цікавою"? і «просунутий» - це явно рухома мета. тому існує спосіб визначення "алгоритмів" вузько чи широко . Схоже, визначення TCS змінюється в контексті, але зауважте, навіть у TCS спостерігається тенденція до широкого визначення, наприклад, у так званому "алгоритмічному об'єктиві" .

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

Інтернет / WWW підтримується багатьма складними алгоритмами. в Інтернеті є складні алгоритми маршрутизації, вбудовані в маршрутизатори (знову живлення багатомільярдних корпорацій, таких як Cisco). там застосовується деяка передова теорія, наприклад, в алгоритмах маршрутизації . ці алгоритми були предметом нових, передових / передових досліджень десятиліть тому, проте тепер настільки добре налаштованих і добре зрозумілих, що це дещо непомітно.

ми не повинні так швидко забувати, що десятиліття тому провідні дослідники навіть не були впевнені, чи працює Інтернет в Інтернеті чи це можливо (що спостерігається в ранніх дослідженнях комутації пакетів, нова кардинальна модель дизайну, що відходить від попередньої комутації схем), і ще кілька років тому були побоювання, що в якийсь момент воно не вдасться до масштабу і почне виходити з ладу через величезні обсяги шипів.

також використовується складне виявлення / виправлення помилок . Інтернет , ймовірно , самий великий, самий відмовостійка система коли - небудь побудованих людьми, по- , як і раніше росте.

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

відносно новий CSS має різні принципи, подібні до програмування OOP, такі як повторне використання та успадкування. Якщо говорити про набір тексту, TeX - це важлива, внутрішньо складна наукова система набору тексту (не така вже й інша, ніж мова програмування), винайдена Кнутом, яка тепер може бути розміщена на веб-сторінках (і використовується, можливо, в сотнях тисяч наукових робіт або більше).

ще одна відносно нова область побудови алгоритмів в Інтернеті, яка все ще з'являється, та заснована на колективному інтелекті . Програмне забезпечення stackexchange саме по собі є прикладом складної системи колективного інтелекту. соціальні мережі також демонструють основні риси колективного інтелекту, і функції постійно додаються для підвищення цього інтелекту (наприклад, у фейсбуці "Любить" лише кілька років). область рейтингових систем базується на алгоритмах спільної фільтрації та все ще розвивається на основі нових досліджень та застосувань.

Отже, коротко кажучи, усі революційні успіхи, що трансформують щоденний людський досвід, насправді значно виходять за рамки лише «польових цілей». як зазначено в заголовку питання, всі основні алгоритми розгорнуті . тепер настільки всюдисущий і невидимий, що є чимось на зразок ІТ-виразу, "частиною сантехніки".


до цього можна додати багато цитат. тут один , щоб почати: DARPA і інтернет революція по Waldrop
ВЗН

чергова рефлексия про Інтернет-оптимізацію, біографія Денні Левіна , співзасновника акамаї, "генія, який перетворив Інтернет"
vzn

-8

Надзвичайно вдалий (апаратний) алгоритм - це скидання при включенні.

Без системи, за якою комп'ютер перебуває у відомому стані, коли застосовується живлення, більше нічого не відбувається .

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

Наступного разу, коли ви опинитесь у отворі для поливу програмістів та комп'ютерних працівників, підніміть склянку вишневої соди до скидання.


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