Який взаємозв'язок між структурами даних та алгоритмами? [зачинено]


13

Я шукав хороший онлайн-курс в структурах даних, але виявив, що Google також повертає результати для курсів алгоритмів, де написано такі речі, як:

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

і

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

і

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

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

EDIT: Для тих, хто голосує, щоб закрити це питання, ви можете, будь ласка, сказати мені, чому і, можливо, як вдосконалити це? Навчитися ставити правильні запитання - це частина навчального процесу.


17
Структура даних є статичною і не може нічого робити. Алгоритм - це лише набір інструкцій для виконання деяких даних. Без одного інше марно. Разом вони роблять комп’ютерні програми. Вони обидва фундаментальні.
Фоші

2
@Phoshi Неправильно. Структура даних тісно пов'язана з алгоритмами, що управляють даними. Тож тісно пов'язані ці алгоритми вважаються частиною структури даних. Наприклад, структура даних Lined List повідомляє вам про збереження даних, а також про те, як дані читаються та маніпулюються.
Ейфорія

7
@Euphoric Я стверджую, що неправильно сказати, що алгоритми є частиною структури даних. Існує більше ніж один спосіб здійснити бінарний пошук: ви можете, наприклад, здійснити наївний if less than recurse to the left; if greater than, recurse to the right; if equal, returnпошук або трохи складніший if less than recurse to the left; otherwise keep track of this value as a potential candidate and recurse to the right; check for equality once we reach the leaves. Вони мають дещо іншу кількість порівнянь. І те й інше - одна з багатьох речей, які ви могли вибрати з деревом.
Doval

4
@Euphoric Ви плутаєте структуру даних з абстрактним типом даних, який реалізує поєднання структури даних та алгоритмів.
Довал

7
@Euphoric, я не погоджуюся. сортування злиття - це алгоритм. Масив - це структура даних. Зв'язаний список - це інша структура даних. Я можу написати реалізацію MergeSort для роботи на будь-якому. Деякі структури даних можуть бути більш природними або ефективнішими для певного алгоритму, але це рідко є абсолютною вимогою (для впровадження нагромаджувального типу у вас досить багато). Ніколас Вірт написав популярну в 1980-х текстову книгу під назвою: "Алгоритми + Структури даних = Програми"
Чарльз Е. Грант

Відповіді:


20

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

Редагувати: як правильно вказав @Doval, структури даних самі по собі не мають жодних операцій, пов'язаних з ними. Акт поєднання структури даних та алгоритму формує абстрактний тип даних.

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

Розглянемо для прикладу структуру даних для зберігання двовимірних координат, відповідно названих Point. З точки зору алгоритмів нічого не можна зробити для точки, і це дійсно просто контейнер для xі yзначення. Звичайно, надаючи цю структуру даних, тепер ви можете додавати всілякі алгоритми поверх неї (обчислення відстані, опуклі корпуси, що-у вас є).

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

Алгоритми без (реальних) структур даних

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

Прикладом такого алгоритму може бути обчислення найбільшого спільного дільника на два числа. Алгоритми Евкліда для gcd дійсно потребують лише вміщення двох цілих чисел та маніпулювання ними.

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

Алгоритми поєднуються зі структурами даних, відомими також абстрактними типами даних

Зараз це цікаві, але з двох дуже різних причин. Зазвичай до них можна звернутися з двох напрямків: спочатку структура даних або спочатку алгоритм.

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

Структура даних, потім алгоритм

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

На відміну від останньої групи нижче, ці структури даних не піддають своїх користувачів цим алгоритмам. Вам не потрібно знати і не дбати про HashMapвнутрішню хеш-функцію, щоб мати можливість її використовувати. (Хоча ефективно використовувати це, можливо, ви захочете знати ці речі;)

Алгоритм, потім структура даних

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

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

Тісно пов’язані структури даних та алгоритми

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

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


1
Ви поєднуєте структури даних та абстрактні типи даних. Структура даних нічого не робить . Немає сенсу говорити "ви зіткнетесь із структурами даних, які досить прості у використанні", оскільки структура даних - це лише структура. А Map- абстрактний тип даних, який може бути реалізований за допомогою певної структури даних та набору алгоритмів, які дають бажані результати шляхом обходу та маніпулювання структурою. Структура даних не приховує алгоритми, оскільки їх немає; абстрактний тип даних приховує структуру даних (саме це робить його абстрактним.)
Doval

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

2
Ви праві. Тим не менш, я бачу різницю між тим, як ми бачимо різні ADT. Я відредагував свою відповідь і сподіваюся, що вона зараз зрозуміліша і більше не пов'язує структуру з ADT, хоча все ще підкреслюючи, що ви можете зосередитись на структурі та / або операціях для будь-якого ADT.
Френк

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

@Doval: Навіть якщо структура даних, яка просто складається з групи чисел у масиві, які повинні мати і підтримувати певні відносини один до одного, така річ може бути "простою у використанні", якщо легко підтримувати потрібні інваріанти роблячи те, що хочеться, або "важко використовувати", якщо це важко.
supercat

5

Структури даних часто впливають на деталі алгоритму. Через це вони часто йдуть рука об руку.

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

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

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

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