Так что я только что выучил красные чёрные деревья в Кормене и вау! Обычно мне нравится понимать все алгоритмы и структуры данных до такой степени, что я могу восстановить их с нуля, не прибегая к мошенничеству, глядя на псевдокод. Мне действительно нравятся алгоритмы, поэтому мне нравится изучать, как они работают, и я обычно иду построчно и пробую некоторые случаи, просматривая код и проверяя, должно ли происходить то, что происходит, как я понял.
Просто понимание того, что происходит, заняло у меня много времени для деревьев RB. Даже с объяснениями книги мне все еще было трудно понять код. Не говоря уже о том, что я не мог понять, как / почему вращение работает. Я не нахожу это интуитивным вообще. Я имею в виду три (шесть фактически) разных случаев для вставки, а затем 4 случая для удаления? Можно ли это понять? Я не могу перестроить этот код без обмана. До бинарного дерева я мог реализовывать вещи из своей головы, с некоторыми изменениями, это всегда работало бы, но деревья RB я даже не собирался пробовать. Я имею в виду, что даже учитель иногда смущался, поэтому я полагаю, что это действительно не так просто, но в то же время, разве мы не должны понимать все, что происходит, или хотя бы почему? Книга не Это действительно объясняет, как кто-то придумал идею вращения. Как кто-то заметил, что с помощью 2 поворотов вы можете решить любую проблему вставки? Это восхитительно!
Мой вопрос: действительно ли я должен на 100% понимать деревья RB? Я чувствую себя плохо, не понимая этого. Заранее спасибо, ребята! (PS: нет тэга для RB-дерева, на самом деле даже для дерева, только для бинарного дерева, поэтому я ставлю только алгоритмы)
источник
Ответы:
Похоже, вы приравниваете идею «понимания» к «возможности писать код, не глядя на книгу». Это две разные вещи. Если вы видите, как вращение узлов дерева переставляет дерево, чтобы сохранить баланс, то вы это понимаете. Возможность немедленно вспомнить все случаи, в которых применяются ротации, не имеет значения.
Сам я, вероятно, мог бы определить вращение, если бы у меня была ручка / бумага / несколько часов, чтобы поиграть с ней. Но я, конечно, не мог просто написать это без мысли. Если бы мне действительно пришлось написать такой алгоритм, я бы посмотрел его, чтобы убедиться, что все детали я правильно понял. Конечно, практически в любой ситуации я бы использовал уже написанный код.
Все это используется, когда вы сталкиваетесь с ситуацией, которая не совсем соответствует ни одному из алгоритмов. Вам никогда не нужно будет писать собственную реализацию дерева. Но вы можете оказаться, например, нуждающимися в выравнивании иерархии двусвязных списков. В этом случае понимание основной идеи вращения может быть очень полезным.
источник
Если вы вообще знакомы с функциональным программированием, вы можете найти такой подход к ним лучше (Okasaki 1999):
http://www.eecs.usma.edu/webs/people/okasaki/jfp99redblack.pdf
Если нет, то, по крайней мере, смело начинайте с первого предложения:
источник
Вам не нужно разбираться в поворотах в деталях. Вы должны понимать связь между деревьями RB и 2-3-4 деревьями (см. Sedgewick). Все эти сумасшедшие повороты имеют больше смысла, когда вы думаете о них как о 2-3-4 деревьях. Если ваш профессор не учил деревья RB как детали реализации для 2-3-4 деревьев, вам, вероятно, следует что-то прочитать на 2-3-4 деревьях. (Лечение Седжвика довольно хорошее; в Википедии его нет.)
В более общем смысле, понимание деталей реализации того, почему алгоритм работает, полезно только иногда. Понимание логики того, почему алгоритм работает, почти всегда полезно. Возможность придумывать алгоритм самостоятельно обычно не требуется, хотя чем больше алгоритмов вы понимаете, тем больше у вас шансов.
источник
Если вам понадобится «RB Trees By Heart» для экзамена на следующей неделе, вам нужно будет прикусить пулю и выучить их. В этом случае вам следует пересмотреть свои методы обучения. Возможно, попытка объяснить RB Trees однокласснику поможет вам больше, чем очередной вечер одинокого написания кода.
Если деревья RB являются основой для вашего следующего курса после каникул, пропустите их сейчас (без плохих чувств) и сконцентрируйтесь на курсе этого семестра. Но следите за темами, которые могут подготовить вас ко второй попытке в RB Trees.
Если вы искренне чувствуете, что они вам никогда не понадобятся (см. Комментарий Анны Лир), поцелуйте их на прощание без сожаления - никто не знает больше о том, что капля в море знаний (просто слишком плохо, что учителя часто считают, что их падение - самое важный).
источник
Ключ к успеху в программировании - никогда не сдаваться :
Сегодня его деревья РБ, завтра это будет что-то другое. Больший урок не сдается .
Для меня это одна из основных сущностей программирования, а не сдаваться ...
Я бы посоветовал вам продолжать попытки , а когда вы терпите неудачу, СНОВА ЭТО .
Потому что, как только вы преодолеете горы, небо станет чистым. Ваш разум меняется в понимании, вы временно возвышены (до следующей горы) . Это временное возвышение стоит больше, чем все деньги в мире ..
источник
Лучший способ понять это - попробовать это :
Это то, как мы это делали в колледже. И для экзамена мы должны объяснить, как его часть работала.
источник