AVL Дерева та Справжній світ


14

у школі нас навчають, як можна врівноважувати дерево AVL після вставки чи видалення.

Чим насправді цей тип знань стане корисним у реальному світі? Чи може хтось навести приклад того, коли цей тип знань насправді був би корисним?

З того, що я бачив, на робочому місці такі деталі навряд чи з’являються…

Я бачу, наскільки детальні знання про алгоритми та деякі структури даних можуть бути важливими, але не такі деталі, як обертання дерева AVL (і подібні детальні поняття).

Спасибі!


7
Це корисно в інтерв'ю, якщо це вважається реальним світом.
Кевін

Це та ж аргументація, яку висловлюють деякі люди про вивчення тригонометрії в школі "Шееш! Коли я коли-небудь буду використовувати це в реальному житті?", А відповідь - "Ви думали, як проаналізувати і вирішити цілий клас проблеми". . Того дня ви хочете зрубати дерево, і ваш партнер запитує: "Ви впевнені, що будинок не вдариться?" Триг на допомогу!
Бінарний страшник

Відповіді:


13

Вивчення дерев AVL може бути корисним з наступних причин:

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

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

  • Це дає вам змогу писати власні варіанти або навіть створювати абсолютно нові типи структур даних.

  • Вам, можливо, доведеться впровадити дерево AVL для нової бібліотеки чи платформи.

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

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


Цікава стаття, але я не бачу, як дерева AVL допомогли б друзям.
Ератосфен

Мені б хотілося побачити приклад, як B + -Trees використовуються для індексації баз даних.
Лука Фюльб'є

5

Окрім пунктів Macneils ...

Червоно-чорні дерева можуть бути кориснішими безпосередньо, оскільки є корисні ефективні операції, які не підтримуються широко в стандартних реалізаціях бібліотеки, таких як C ++ std::map(принаймні, AFAIK). Червоно-чорні дерева можуть підтримувати "розщеплення" (розрізання дерева на два, одна, що містить клавіші менше вказаної клавіші, а одна, що містить ключі більше), і "з'єднання" (зворотне поєднання дерева великих ключів з деревом малого ключі) можуть бути виконані в O (log n) час, але якщо вони підтримуються в стандартних бібліотеках контейнерів, це здається добре прихованою справою.

Однак "збільшення" структур даних є загальним явищем. Простий приклад - додавання інформації про розмір піддію до вузлів майже в будь-якій структурі даних дерева для підтримки підписки на O (log n). Більш складні приклади включають інтервальні дерева.

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

Зрозуміло, щоб розробити розширену структуру даних, вам потрібно зрозуміти основну нерозширену структуру даних.

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


1
+1 для розширення структури даних, хоча це досить рідкісна річ. Більшість програмістів не прагнуть до працездатності (інакше всі ми використовуємо C ++ / C / Fortran / Assembly).
Матьє М.

@Matthieu - Я вважаю, що це часто, але тільки в певних типах середовищ розробки. Це не протиріччя, чесний, бо ... помилка, ну ...
Steve314

Я повністю згоден! : D
Матьє М.

5

Ні

Це справді не корисно в реальному світі ...

За винятком того, щоб змусити задуматися .

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

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