Які причини вивчати різні алгоритми / структури даних, що відповідають одній цілі?


91

Мене цікавить це питання ще з часів студентства. Це загальне питання, але я докладно поясню приклади нижче.

Я бачив багато алгоритмів - наприклад, для проблем з максимальним потоком я знаю близько 3 алгоритмів, які можуть вирішити проблему: Ford-Fulkerson, Edmonds-Karp & Dinic, причому Dinic має найкращу складність.

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

Що мене бентежить: чи є причини, чому ми повинні їх знати? Чому б не просто навчитися та ознайомитись із найкращою складністю?

Я знаю, що найкраще, якщо ми їх усіх знаємо, я просто хочу знати, чи є якісь "більш вагомі" причини, як-от деякі проблеми / алгоритми можна вирішити лише за допомогою A, але не B і т.д.


17
Як я завжди кажу: ці (як правило) не "найкращі". Після того, як ви чітко визначите, що ви маєте на увазі під «кращим», відповідь стає очевидною.
Рафаель

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

@Sam З мого досвіду я вважав, що на лекціях чи в деяких підручниках вони є інформативними, впроваджують багато алгоритмів, аналіз тощо, але не так багато практичних випадків або зразкових сценаріїв, які A перевершать B. Вони можуть охопити жанр алгоритмів від A до Z та деякі проблеми домашнього завдання, але для мене вони можуть вирішити лише A, або лише Z, і т. д., таким чином, задається питання.
шиле

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

1
Ми фактично запропонували сайт StackExchange, щоб спеціально допомогти з такими питаннями CS-освіти. Приходьте, підтримайте нас тут: area51.stackexchange.com/proposals/92460/…
vk2015

Відповіді:


121

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

Візьмемо сортування як приклад, оскільки всі знайомі зі стандартними алгоритмами сортування.

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

По-друге, завжди є шанс опинитися в ситуації, коли ви програмуєте в умовах дивних обмежень. Мені колись довелося зробити видобуток з чисельних розмірів зі скромного розміру (1000 або більше) колекцій зразків якомога швидше, але це було на невеликому мікроконтролері, який мав дуже мало запасної пам’яті для читання-запису, що виключало більшість алгоритми сортування. Сорт Shell був найкращим компромісом, оскільки він був субквадратичним і не потребував додаткової пам'яті.O(nlogn)

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

Розглянемо, наприклад, якусь 3D-візуалізацію чи відеоігри на сучасній відеокарті, де ви хочете намалювати предмети в порядку від найближчого до камери до найдальшого з камери з міркувань продуктивності, але якщо ви не отримаєте точне замовлення, апаратне забезпечення подбає про нього. Якщо ви пересуваєтеся в 3D-середовищі, відносний порядок об'єктів не буде сильно змінюватися між кадрами, тому виконання одного проходу міхура кожен кадр може бути розумним компромісом. (Джерело двигуна Valve робить це для ефектів частинок.)

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

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


7
Чудова відповідь із чудовими прикладами! Не знав, що навіть бульбашковий прохід має своє практичне використання в реальному світі ...
shole

1
@shole Я не маю багато досвіду в ігровому бізнесі, але все вищезазначене важливо в різній мірі. (Очевидно, що алгоритми, структури даних та математика, які вам потрібні для ігор, ймовірно, відрізняються від необхідних для баз даних чи біоінформатики чи того, що у вас є.) Якби я був на вас, я б пішов сюди і почав дивитися: handmadehero. org Також, можливо, варто ховатися на gamedev.stackexchange.com
Псевдонім

1
Ефективність кешу - це великий фактор, який сильно недосліджений ("стіна пам'яті" google).
Рафаель

6
Обережно, Quicksort набагато швидше в середньому, ніж Heapsort, але Heapsort є більш послідовним (його дисперсія триває менше, а гірший - набагато краще). І стрибки Хепсорта в масиві проти лінійних сканів Квіксорта зліва та направо роблять величезну різницю, коли кеш / пейджінг вступає в гру.
vonbrand

1
@shole Який розвиток ігор ти цікавиш? Існує щонайменше два дуже різних підполя, 3D-графіка та геймплей (що включає AI). Я маю досвід роботи лише з графікою, але можу сказати, що структури даних та математика є надзвичайно важливими для графіки та алгоритмів, а також меншою мірою. Якщо ви використовуєте двигун, більшість із цих матеріалів, звичайно, буде опікуватися, але ви все одно повинні зрозуміти основні математики тривимірної геометрії.
садок

51

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

Деякі приклади:

  • Mergesort стабільний там, де його немає.
  • Двійкові пошукові дерева дають вам ітерацію порядку, а хештелі - ні.
  • Bellman-Ford може впоратися з негативними вагами, Dijkstra не може.

Існують також дидактичні міркування :

  • Наскільки легко зрозуміти більш задіяне рішення перед більш простими? (Дерева AVL (та їх аналіз) без BST; Dinic без Ford-Fulkerson; ...)
  • Чи бачите ви однакові принципи та зразки, коли ви піддаєтесь вирішенню лише одного рішення на проблему порівняно з багатьма рішеннями?
  • Чи виставлення лише одного рішення на кожну проблему забезпечує достатню підготовку (до майстерності)?
  • Чи повинні ви знати ширину рішень, які були знайдені (щоб запобігти вам винаходити колесо знову і знову¹)?
  • Якщо ви піддаєтесь лише одному вирішенню кожної проблеми, чи зрозумієте ви інші рішення, які ви знайдете в дикій природі (скажімо, в реальній бібліотеці програмування)?

  1. Це те , що ми бачимо багато з типів программаторов , які не мають багатий CS набору інструментів в їх розпорядженні.

4
+1 за включення дидактичних підстав! Що стосується декількох обґрунтувань (особливо другого та третього), бачення того, як алгоритми та структури даних розробляються та оптимізуються, вчить методам розробки та оптимізації та розумінню компромісів (навчання не лише "що", а й "як" і "чому" ).
Пол А. Клейтон

2
Ще одне врахування полягає в тому, що аналіз різних альтернатив пропонує приклади корисних інструментів для аналізу нових алгоритмів для, можливо, незвичних налаштувань.
vonbrand

1
Хороший момент, @vonbrand. Аналіз амортизованої складності був винайдений для розуміння поведінки грізних дерев, але хитрі дерева рідко використовуються на практиці. Ну, не так, якби опублікували дерева. Ядро Windows NT чудово використовує дерева splay для реалізації карт віртуальної пам’яті, але воно не змінює порядок у кожному пошуку.
Псевдонім

1
@vonbrand Так. Я б зрозумів, як хтось, здебільшого, зацікавлений у розмірності інструментарію для класу алгоритмів, але з цієї причини насміхається.
Рафаель

7

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

Для розуміння алгоритмів / структур даних, які використовуються, дуже корисно знати велику кількість алгоритмів / структур даних, включаючи параметри, які вже не вважаються "сучасними".

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

Це те, що відрізняє когось, хто вивчав інформатику, від того, хто щойно навчився програмувати. У більшості робіт, над якими я працював, був час, коли вивчав інформатику, я міг вирішити проблему, яку програміст, який навчався «книгам», не міг, але 95% часу я виявив, що вивчаючи інформатику не давав мені переваги над іншими досвідченими програмістами .


якщо 95% речей, які ви намагаєтеся вирішити, не стосуються машинного навчання. Я не можу зрозуміти, як нормальний програміст навіть може мати правильний шанс спробувати будь-яку з проблем, з якими стикаються реальні проблеми ML.
Буратіно

3
Мета: отримати роботу з кращою ставкою, ніж 5%.
Рафаель

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

5

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

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


5
Ця відповідь лише повторює бали від старих.
Рафаель

1

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

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

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