Це нормально, щоб не повністю зрозуміти дерева РБ? [зачинено]


15

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

Просто розуміння того, що відбувається, зайняло у мене багато часу для дерев RB. Навіть з поясненнями книги мені все одно було важко зрозуміти код. Не кажучи вже про те, що я не міг зрозуміти, як / чому працюють обертання. Я не вважаю це інтуїтивно зрозумілим. Я маю на увазі, три (шість насправді) різних випадків вставки, а потім 4 випадки для видалення? Чи можна зрозуміти цю річ? Мені неможливо відновити цей код без обману. До бінарного дерева я не міг реалізувати речі з голови, з деяким налаштуванням це завжди спрацювало б, але дерева RB я навіть не збираюся намагатися. Я маю на увазі, навіть вчитель іноді плутається, тому я гадаю, що це насправді не так просто, але в той же час, чи не повинні ми розуміти все, що відбувається, або принаймні чому? Книга не стала ' я справді не поясню, як хтось придумав ідею ротацій. Як хтось помітив, що за допомогою 2 обертів ви можете вирішити будь-яку проблему з введенням? Це дивовижно!

Моє запитання: чи я дійсно повинен на 100% розуміти дерева РБ? Я відчуваю себе погано, пропускаючи речі, не розуміючи цього повністю. Заздалегідь дякую, хлопці! (PS: немає тегів для RB-дерева, насправді навіть не для дерева, просто бінарне дерево, тому я лише ставлю алгоритми)


18
"Молода людина, з математики ти нічого не розумієш. Ти просто звикаєш до них". - Джон фон Нойман

2
@Clash У якому контексті? Я не думаю, що мені ніколи не потрібно було знати, як працюють дерева РБ у професійному середовищі, але це може залежати від того, що ти хочеш робити. Я б сказав, що ви добре пропустити їх, поки вам їх не потрібно.
Адам Лір

4
@Clash Мене дуже турбує те, що ти кажеш, що це "обман", щоб реалізувати що-небудь із вказівками із зовнішнього джерела. Псевдокод існує з причини - вони виключають необхідність робити це з пам'яті. Я повністю погоджуюся з Вінстоном: розуміння та знання з пам’яті - це дві різні взаємовиключні речі. Запам'ятовування! = Розуміння та розуміння! = Запам'ятовування.
doppelgreener

3
Це нормально, аби насправді не піклуватися про дерева РБ - доки вони мені не потрібні?
Стівен А. Лоу

1
Можливо, зрозумійте, КОЛИ Ви повинні використовувати дерева RB, віддаючи перевагу всім іншим типам реалізації дерев. Знайте, які проблеми вони вирішують, і всі причини вибору дерев RB. Але якщо вам коли-небудь доведеться реалізувати його (поза іспитом, звичайно), ви зможете знайти його; так навіщо турбуватися, знаючи, як це зробити з пам'яті?
Давуд каже, що поверніть Моніку

Відповіді:


13

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

Сам я міг би зрозуміти обертання, якби мав перо / папір / кілька годин, щоб грати з ним. Але я, звичайно, не міг просто написати це без думки. Якби мені насправді довелося написати такий алгоритм, я би переглянув це, щоб переконатися, що я отримував всі деталі. Звичайно, я майже в будь-якій ситуації використовував уже написаний код.

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


2
"Ви ніби порівнюєте ідею" розуміння "з" вмінням писати код, не дивлячись на книгу ". Це дві різні речі ». Помилка ... ні. Якщо ви це пишете, це, ймовірно, означає, що ви не вивчали математику за рік-два коледжу, навіть якщо це. У якийсь момент "розуміння" математики (яка, ввічливість Тьюрінга, прирівнюється до обчислень), полягає лише в тому, щоб мати можливість продемонструвати те, що ви "зрозуміли". Немає жодних рішень, ані ifs, maybes, foo, bar, baz На цьому рівні, якщо ти не можеш довести своє математичне твердження, ти тост. (Якщо ви не звуть Ферма.)
Дені де Бернарді,

14
@ Денніс, я маю MS в CS з середньою кількістю математичних курсів для основних. Боюся, що ви не зрозуміли мою думку. Вміти довести або продемонструвати те, що ти розумієш, дуже важливо. Можливість запам'ятати деталі доказу чи методу - це не. Ви повинні ВЗАЄМО написати код. Але я не бачу ніякої користі для того, щоб вимогу мати можливість писати код з MEMORY.
Вінстон Еверт

2
Будьте уважні, де ви також шукаєте - IIRC, деякі підручники мають істотні помилки в своїх алгоритмах червоно-чорного дерева.
Steve314

2
@ Steve314, тобі навіть не потрібно розуміти РБ, щоб бути автором підручника! ;)
Вінстон Еверт

Дякую Вінстону, це мене полегшує! Є лише кілька речей, які я не зрозумів з кодом, який я можу опублікувати найближчим часом. Але я так радий, що нормально не розуміти (розуміючи, я маю на увазі написання коду без обману) чому / як хтось помітив 3/6 випадків для вставки та 4/8 випадків для видалення.
Бернардо Пірес

4

Якщо ви взагалі знаєтесь з функціональним програмуванням, ви можете краще знайти такий підхід до них (Okasaki 1999):

http://www.eecs.usma.edu/webs/people/okasaki/jfp99redblack.pdf

Якщо ні, то принаймні подумайте про вступне речення:

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


Ха-ха-риане! Це мене полегшує! Дуже дякую! Сьогодні я також зауважив, що щодо РБ-дерев є дуже мало запитань. Тож я гадаю, що вони справді хитрі.
Бернардо Пірес

2
Я думаю, що це лише те, що, крім студентів коледжу, вони є тим, що реалізується приблизно один раз на кожній мові програмування. (Або менше. Я думаю, що найпопулярніший код RB для Scheme був перенесений з коду RB для OCaml.)
Ryan Culpepper

Посилання розірвано: дзеркало 1 , дзеркало 2 . Повне цитування у випадку, якщо обидва дзеркала в якийсь момент в майбутньому недоступні: Кріс Окасакі, "Червоно-чорні дерева у функціональній обстановці", Журнал функціонального програмування, 9 (4), pp471-477, липень 1999 р.
Сніжок

3

Вам не потрібно детально розуміти обертання. Ви повинні зрозуміти взаємозв'язок дерев з РБ та 2-3-4 дерев (див. Седжевік). Усі ці божевільні ротації мають набагато більше сенсу, якщо ви думаєте про них як про 2-3-4 дерева. Якщо ваш професор не навчив дерев RB як деталі реалізації для 2-3-4 дерев, ви, ймовірно, повинні прочитати щось на 2-3-4 деревах. (Лікування Седжевіка досить добре; у Вікіпедії його немає.)

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


1

Якщо на наступному тижні вам знадобиться "Дерева RB напам'ять" для експертизи, вам доведеться кусати кулю і вивчити їх. У такому випадку слід переглянути свої методи навчання. Можливо, спроба пояснити RB Trees однокласникові допоможе вам більше, ніж ще одна ніч написання самотнього коду.

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

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


1

Ключ до успіху програмування - ніколи не здаватися :

Сьогодні його RB дерева завтра це буде щось інше. Більший урок - не здавати .

Для мене це одна з основних суть програмування, а не здавання ...

Я б запропонував вам продовжувати намагатись , а коли не вдасться, РОБИТИСЯ .

"Поки ти не отримаєш, поки не натисне, поки не запуститься."

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


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

Це ніколи не марно, повірте, коли воно "клацає" висотою більше, ніж компенсує весь піт і сльози.
Темна ніч

0

Найкращий спосіб зрозуміти це спробувати :

  • Є 3 або 6 обертів. Візьміть аркуш паперу і випишіть їх по черзі.
  • Як тільки ви це отримаєте, перейдіть та впроваджуйте Червоне чорне дерево. Добре, якщо вам доведеться поглянути на кілька речей.

Так ми це зробили в коледжі. І для експертизи ми мали пояснити, як частина її працювала.

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