Это нормально, что не до конца понимаешь RB Trees? [закрыто]

15

Так что я только что выучил красные чёрные деревья в Кормене и вау! Обычно мне нравится понимать все алгоритмы и структуры данных до такой степени, что я могу восстановить их с нуля, не прибегая к мошенничеству, глядя на псевдокод. Мне действительно нравятся алгоритмы, поэтому мне нравится изучать, как они работают, и я обычно иду построчно и пробую некоторые случаи, просматривая код и проверяя, должно ли происходить то, что происходит, как я понял.

Просто понимание того, что происходит, заняло у меня много времени для деревьев RB. Даже с объяснениями книги мне все еще было трудно понять код. Не говоря уже о том, что я не мог понять, как / почему вращение работает. Я не нахожу это интуитивным вообще. Я имею в виду три (шесть фактически) разных случаев для вставки, а затем 4 случая для удаления? Можно ли это понять? Я не могу перестроить этот код без обмана. До бинарного дерева я мог реализовывать вещи из своей головы, с некоторыми изменениями, это всегда работало бы, но деревья RB я даже не собирался пробовать. Я имею в виду, что даже учитель иногда смущался, поэтому я полагаю, что это действительно не так просто, но в то же время, разве мы не должны понимать все, что происходит, или хотя бы почему? Книга не Это действительно объясняет, как кто-то придумал идею вращения. Как кто-то заметил, что с помощью 2 поворотов вы можете решить любую проблему вставки? Это восхитительно!

Мой вопрос: действительно ли я должен на 100% понимать деревья RB? Я чувствую себя плохо, не понимая этого. Заранее спасибо, ребята! (PS: нет тэга для RB-дерева, на самом деле даже для дерева, только для бинарного дерева, поэтому я ставлю только алгоритмы)

Бернардо Пирес
источник
18
«Молодой человек, в математике ты ничего не понимаешь. Ты просто привыкаешь к ним». - Джон фон Нейман
2
@ Clash В каком контексте? Я не думаю, что мне когда-либо нужно было знать, как работают деревья RB в профессиональной среде, но это может варьироваться в зависимости от того, что вы хотите сделать. Я бы сказал, что вы можете пропустить их, пока они вам не понадобятся.
Адам Лир
4
@ Clash Меня очень беспокоит то, что вы говорите, что это «обман» для реализации чего-либо под руководством внешнего источника. Псевдокод существует по причине - они устраняют необходимость делать это из памяти. Я полностью согласен с Уинстоном: понимание и знание по памяти - это две разные взаимоисключающие вещи. Запоминание! = Понимание и понимание! = Запоминание.
doppelgreener
3
Нормально не заботиться о деревьях РБ - пока они мне не понадобятся?
Стивен А. Лоу
1
Возможно, поймите, КОГДА вы должны использовать деревья RB, предпочтительнее всех других типов реализации дерева. Знайте, какие проблемы они решают, и все причины выбора деревьев РБ. Но если вам когда-нибудь понадобится его реализовать (конечно, вне экзамена), вы сможете его найти; так зачем знать, как это сделать по памяти?
Дауд говорит восстановить Монику

Ответы:

13

Похоже, вы приравниваете идею «понимания» к «возможности писать код, не глядя на книгу». Это две разные вещи. Если вы видите, как вращение узлов дерева переставляет дерево, чтобы сохранить баланс, то вы это понимаете. Возможность немедленно вспомнить все случаи, в которых применяются ротации, не имеет значения.

Сам я, вероятно, мог бы определить вращение, если бы у меня была ручка / бумага / несколько часов, чтобы поиграть с ней. Но я, конечно, не мог просто написать это без мысли. Если бы мне действительно пришлось написать такой алгоритм, я бы посмотрел его, чтобы убедиться, что все детали я правильно понял. Конечно, практически в любой ситуации я бы использовал уже написанный код.

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

Уинстон Эверт
источник
2
«Кажется, вы приравниваете идею« понимания »к« возможности писать код, не глядя на книгу ». Это две разные вещи. Эээ ... нет. Если вы пишете это, это, вероятно, означает, что вы не изучали математику больше, чем год или два из колледжа, если даже это. В какой-то момент «понимание» математики (которая, благодаря Тьюрингу, приравнивается к вычислениям) сводится к возможности продемонстрировать то, что вы «поняли». Там нет никакого обходного пути, или если или Maybes или Foo или Bar или Baz. На этом уровне, если вы не можете доказать свое математическое утверждение, вы тост. (Если только вас не зовут Ферма.)
Дени де Бернарди
14
@Dennis, у меня MS в CS с количеством математических курсов выше среднего для основных. Боюсь, что вы не поняли мою точку зрения. Возможность доказать или продемонстрировать то, что вы понимаете, очень важна. Быть в состоянии запомнить детали доказательства или метода не. Вы ДОЛЖНЫ быть в состоянии написать код. Но я не вижу смысла в необходимости писать код из MEMORY.
Уинстон Эверт
2
Будьте осторожны и там, где вы смотрите - IIRC, в некоторых учебниках есть существенные ошибки в их алгоритмах красно-черного дерева.
Steve314
2
@ Steve314, тебе даже не нужно понимать RB, чтобы быть автором учебника! ;)
Уинстон Эверт
Спасибо Уинстон, это меня радует! Есть только несколько вещей, которые я не понял с кодом, который я мог бы опубликовать в ближайшем будущем. Но я так рад, что это нормально, чтобы не понять (под пониманием я имею в виду написание кода без обмана), почему / как кто-то заметил 3/6 случаев для вставки и 4/8 случаев для удаления.
Бернардо Пирес
4

Если вы вообще знакомы с функциональным программированием, вы можете найти такой подход к ним лучше (Okasaki 1999):

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

Если нет, то, по крайней мере, смело начинайте с первого предложения:

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

Райан Калпеппер
источник
Хах Райан! Это меня радует! Большое спасибо! Сегодня я также заметил, что на SO очень мало вопросов о RB-деревьях. Так что я полагаю, они действительно хитры.
Бернардо Пирес
2
Я думаю, что, кроме студентов колледжа CS, они реализуются примерно один раз для каждого языка программирования. (Или меньше. Я думаю, что самый популярный код RB для Scheme был перенесен из кода RB для OCaml.)
Райан Калпеппер
Ссылка не работает: зеркало 1 , зеркало 2 . Полное цитирование в случае, если оба зеркала будут недоступны в какой-то момент в будущем: Крис Окасаки, «Красно-черные деревья в функциональной обстановке», Журнал функционального программирования, 9 (4), стр. 471-477, июль 1999 г.
Snowball
3

Вам не нужно разбираться в поворотах в деталях. Вы должны понимать связь между деревьями RB и 2-3-4 деревьями (см. Sedgewick). Все эти сумасшедшие повороты имеют больше смысла, когда вы думаете о них как о 2-3-4 деревьях. Если ваш профессор не учил деревья RB как детали реализации для 2-3-4 деревьев, вам, вероятно, следует что-то прочитать на 2-3-4 деревьях. (Лечение Седжвика довольно хорошее; в Википедии его нет.)

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

Рекс Керр
источник
1

Если вам понадобится «RB Trees By Heart» для экзамена на следующей неделе, вам нужно будет прикусить пулю и выучить их. В этом случае вам следует пересмотреть свои методы обучения. Возможно, попытка объяснить RB Trees однокласснику поможет вам больше, чем очередной вечер одинокого написания кода.

Если деревья RB являются основой для вашего следующего курса после каникул, пропустите их сейчас (без плохих чувств) и сконцентрируйтесь на курсе этого семестра. Но следите за темами, которые могут подготовить вас ко второй попытке в RB Trees.

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

Ekkehard.Horner
источник
1

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

Сегодня его деревья РБ, завтра это будет что-то другое. Больший урок не сдается .

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

Я бы посоветовал вам продолжать попытки , а когда вы терпите неудачу, СНОВА ЭТО .

«Пока не получишь, пока не щелкнет, пока не побежит».

Потому что, как только вы преодолеете горы, небо станет чистым. Ваш разум меняется в понимании, вы временно возвышены (до следующей горы) . Это временное возвышение стоит больше, чем все деньги в мире ..

Темная ночь
источник
Спасибо, это был мой страх! Если я откажусь от этого, что мешает мне отказаться от следующего? Вот почему я потратил почти целый день, чтобы понять, как вставить и удалить.
Бернардо Пирес
Это никогда не пустая трата, поверьте мне, когда он «щелкает» по высоте больше, чем компенсирует весь пот и слезы.
Темная ночь
0

Лучший способ понять это - попробовать это :

  • Есть 3 или 6 поворотов. Возьмите лист бумаги и запишите их один за другим.
  • Как только вы это получите, идите и реализуйте Красное Черное Дерево. Ничего страшного, если вам нужно поискать несколько вещей.

Это то, как мы это делали в колледже. И для экзамена мы должны объяснить, как его часть работала.

Карра
источник