Не расстраивайтесь если не поняли ролик. Никто никогда его не поймет с первого раза. Такие ролики лучше воспринимать не как обучающие а как справочные.
@@Денис-ж3ф5р думаю что человек с реальным уровнем Мидла и выше поймет видос с первого раза, но вот только не все на канале являются мидлами и тем более сеньорами
Недавно наткнулся на ваш канал. Это просто супер. На фоне всего остального шлака по теме it, который существует на ютубе, ваш канал прям выделяется. Мне очень нравится ваш фундаментальный подход. Не тупо освоить синтаксис какого нибудь языка программирования, а дать именно теоретические основы программной инженерии. Да еще и в интерактивном и наглядном формате, с анимациями, графиками. Желаю развития каналу.
7:10 - если при удалении узла, с двумя детьми, мы используем максимальный элемент слева(maxInLeft), то и удалять надо слева : node.left = delete(node.left, maxInLeft.key). На слайдах : node.right = delete(node.right, maxInLeft.key). Аналогичная неточность в коде для AVL Tree
Мне все равно не понятно, если node.left = delete(node.left, maxInLeft.key), delete(node.left, maxInLeft.key) вернет 6 node.left =4 . получится что четверка замениться на 6 ?
Не стоило ли указать, что видео исключительно про бинарные деревья? А то складывается ощущение, что других и не существует. Я, к примеру, всё ждал, каким будет разбор B+Tree, чтобы в очередной итерации попробовать снова обуздать принцип работы InnoDB. Но видео очень залипательное, спасибо! Очень низкоуровнево, прям как я люблю.
Отличный разбор! В коде copyTree (8:00)на экране есть ошибка, должно быть, как и сказано в звуковом комментарии: void copyTree(Node node) { If(node==null) return; print(node.value); copyTree(node.left); copyTree(node.right); }
Деревья придумали для обычных процессоров, которые способны выполнять одно сравнение за одну команду. Ускорители для ИИ работают иначе - там вся память ассоциативная, и поиск заключается в нахождении самого близкого значения от запроса, в идеале равным запросу. Но так как от двоичной логики далеко уйти не получилось - то поиск выполняется параллельным приближением, прямо в памяти. Берётся блок памяти допустим 4к цифр, и каждую цифру сравнивают с запросом, все разом, параллельно. Результатом имеем новый слой данных x>y?x-y:y-x. Если на этом слое где-то получился ноль - поиск заканчивается. Иначе выполняется операция сравнения между двумя соседями, и образуется новый слой - куда помещаются только малые числа. Потом ещё и ещё слои, до самого минимального числа. Адрес минимального числа считается результатом поиска, и он может быть не точным. И ещё пока нижний слой выполняется - верхний может принять новую страницу памяти и новый поиск. Для всего этого требуется огромное количество транзисторов - но зато скорость поиска приближается к реализациям квантовых компов. Которые кстати работают примерно так-же.
Здесь представлен довольно запутанный способ поворота дерева, хотя он эффективен. Есть более простой способ, для начала лучше его освоить. выглядит это примерно так: private Node rotateLeft(Node oldParent) { Node newParent = oldParent.right; Node newParentLeft = newParent.left; newParent.left = oldParent; oldParent.right = newParentLeft; oldParent.computeHeight(); newParent.computeHeight(); return newParent; } Данный метод поворачивает поддерево и возвращает новый корень,. Чтобы его корректно использовать, нужно чтобы методы добавления и удаления возвращали Node, и предрекурсионном методе вызов должен быть таким root = add(key, root);, где root - это корень дерева.
Монтаж топ, но умение объяснять это искусство. Нашёл видео по этой же теме 9летней давности и сразу всё понял. А тут от ролика только перегрузка лишняя. Но лайк за труды
на 8:03 у вас опечатка. Вы говорите что сначала выводим родителя потом левого и правого, но в коде у вас наоборот сначала левый и правый и потом родитель.
Алекс, привет. Мне кажется, что на 7:05 также нужно и слева искать значение ключа заменяющего узла, чтобы его удалить. Т.е. просто нужно добавить node.left = delete(node.left, maxInLeft.key); . Переписал твой код и попробовал на датасете от 5 до 11 удалить вершину 8, то с кодом из примера 7 станет вершиной и также останется лепестком, поэтому нужно и для левой части делать проверку (удаление).
Классный ролик, но эти нелогичные игры с интонациями просто убивают и сводят с ума. Из за них даже простая информация становится сложной. Такое ощущение что голос сгенерин плохой нейросетью.
Мозг расплавится понять это с первого раза. Автору респект, что не только вник и разобрался, но и иллюстрировал и разжевал. Но осознать это всё очень сложно. Только базовые идеи
Подсказка, по поводу того, чтобы понять почему КЧД балансируется, узнайте что такое 2-3 дерево, частный случай n-дерева. Когда вы поймете, 2-3 дерево, тогда вы поймет что кчд - это и есть 2-3 дерево, просто для обозначения левого и правого элемента, нам понадобилось красить узлы бинарного дерева.
Алекс, спасибо тебе! Мне безумно заходить этот контент, я под него стараюсь расслабляться и при этом продолжать вникать во все тонкости программирования, с такой визуализацией и музыкальным сопровождением уносит в транс порой..
08:00 опечатка в коде метода copyTree: правильно будет сначала print(node.value); затем левы и правый. А то получилcя такой же порядок как в deleteTree.
еще было б очень интересно посмотреть ролик про файловые системы. К примеру фат32. Как оно все устроено, где хранятся данные, что такое размер клстера и тд
Благодарю за разбор красно-черного дерева Давно когда-то видел его разбор текстовый - не стал вьезжать и забил. STL на красно-черных - но кодировать их явно сложнее АВЛ и высота дерева в среднем на 25+% выше чем у АВЛ Так что друг друга они заменить и вправду не могут.
23:51 если я правильно понял, то это второй кейс из момента 22:08. Тогда получается ошибочка: чёрные дети красного брата не должны быть нулями. Потому, что их чёрные высоты в момент до удаления равны 1, а не нулю.
@@laranMQRзачем и там, и там, если мы берём 6ку именно из левого дерева, значит ее оттуда и нужно удалить. Справа может отказаться другая 6ка, которую мы удалим "просто так"
Если захотите написать сами по коду из этого видео красно черное дерево, будьте осторожны, так как здесь очень много ошибок и если все переписать код просто не будет работать
1. 7:39, 7:56 print(node.value) разве нам не нужно вывести ключи, т.е. print(node.key) ? 2. 14:22 фукция leftRoatet строка node.right_.left_ = node.right_.right_; не лишняя? 3. После вставки в узла АВЛ в дерево его нужно балансировать? P.s. очень крутое видео, спасибо.
Объясните, пожалуйста, почему на 17:33 в правой ветке дерева узел черный, а не красный, если у него двое детей и оба черные листы? По объяснению, он должен быть красный и тогда все красно-черное древо несбалансированно... или нет?
Подписывайся в телеграм-канал: t.me/Alek_OS
Начался список с 1, не с 0
За это лайк)
- Что делаешь?
- Перекрашиваю чёрных детей.
- Расист?!
- Программист.
🤣🤣🤣 Это за гранью добра и зла
- Что делаешь?
- Делаю деда красным и совершаю левый поворот.
- Коммунист?!
- Программист.
@@abuser-je3gl4vc1c open source программист
Не расстраивайтесь если не поняли ролик. Никто никогда его не поймет с первого раза. Такие ролики лучше воспринимать не как обучающие а как справочные.
я с первого раза все понял, а ты лох
))))))))))))
По фактам
Я понял с первого раза ролик. Даже слишком простой, сеньор ios, магистк комтерных наук
@@Денис-ж3ф5р держи в курсе
@@Денис-ж3ф5р думаю что человек с реальным уровнем Мидла и выше поймет видос с первого раза, но вот только не все на канале являются мидлами и тем более сеньорами
Недавно наткнулся на ваш канал. Это просто супер. На фоне всего остального шлака по теме it, который существует на ютубе, ваш канал прям выделяется. Мне очень нравится ваш фундаментальный подход. Не тупо освоить синтаксис какого нибудь языка программирования, а дать именно теоретические основы программной инженерии. Да еще и в интерактивном и наглядном формате, с анимациями, графиками. Желаю развития каналу.
Точно, канал просто супер!!!
Вот так если задуматься, какую же титаническую работу автор воплотил, написать грамотно текст, визуализировать все сказанное…лайк!
7:10 - если при удалении узла, с двумя детьми, мы используем максимальный элемент слева(maxInLeft), то и удалять надо слева : node.left = delete(node.left, maxInLeft.key).
На слайдах : node.right = delete(node.right, maxInLeft.key).
Аналогичная неточность в коде для AVL Tree
Верно. Хорошее замечание
а я сижу не понимаю что не так
Мне все равно не понятно, если node.left = delete(node.left, maxInLeft.key),
delete(node.left, maxInLeft.key) вернет 6
node.left =4 . получится что четверка замениться на 6 ?
Недавно сам писал реализацию красно-черного дерева, столько статей пересмотрел и видосов,эх,где ты был пару недель назад( Все очень классно и понятно!
Сложно, ничего непонятно, но очень интересно
Лучший из всех каналов на рунете по IT тематике. Спасибо за контент, за качественную информацию и высокий уровень подготовки ролика 👍
Не стоило ли указать, что видео исключительно про бинарные деревья? А то складывается ощущение, что других и не существует. Я, к примеру, всё ждал, каким будет разбор B+Tree, чтобы в очередной итерации попробовать снова обуздать принцип работы InnoDB.
Но видео очень залипательное, спасибо! Очень низкоуровнево, прям как я люблю.
согласен, эту структуру данных как-то обходят стороной, иногда даже BTree расшифровывают как Binary Tree(
Очень низкоуровнево, прям как я не люблю :)
Но было интересно
Братан, хорош, давай, давай, вперёд! Контент в кайф, можно ещё? Вообще красавчик! Можно вот этого вот почаще?
Отличный разбор!
В коде copyTree (8:00)на экране есть ошибка, должно быть, как и сказано в звуковом комментарии:
void copyTree(Node node) {
If(node==null) return;
print(node.value);
copyTree(node.left);
copyTree(node.right);
}
In English: pre-order, in-order, post-order
Деревья придумали для обычных процессоров, которые способны выполнять одно сравнение за одну команду.
Ускорители для ИИ работают иначе - там вся память ассоциативная, и поиск заключается в нахождении самого близкого значения от запроса, в идеале равным запросу. Но так как от двоичной логики далеко уйти не получилось - то поиск выполняется параллельным приближением, прямо в памяти.
Берётся блок памяти допустим 4к цифр, и каждую цифру сравнивают с запросом, все разом, параллельно. Результатом имеем новый слой данных x>y?x-y:y-x. Если на этом слое где-то получился ноль - поиск заканчивается. Иначе выполняется операция сравнения между двумя соседями, и образуется новый слой - куда помещаются только малые числа. Потом ещё и ещё слои, до самого минимального числа. Адрес минимального числа считается результатом поиска, и он может быть не точным. И ещё пока нижний слой выполняется - верхний может принять новую страницу памяти и новый поиск. Для всего этого требуется огромное количество транзисторов - но зато скорость поиска приближается к реализациям квантовых компов. Которые кстати работают примерно так-же.
Интересная инфа, что за тема? Хотел почитать статьи
Здесь представлен довольно запутанный способ поворота дерева, хотя он эффективен. Есть более простой способ, для начала лучше его освоить. выглядит это примерно так:
private Node rotateLeft(Node oldParent) {
Node newParent = oldParent.right;
Node newParentLeft = newParent.left;
newParent.left = oldParent;
oldParent.right = newParentLeft;
oldParent.computeHeight();
newParent.computeHeight();
return newParent;
}
Данный метод поворачивает поддерево и возвращает новый корень,. Чтобы его корректно использовать, нужно чтобы методы добавления и удаления возвращали Node, и предрекурсионном методе вызов должен быть таким root = add(key, root);, где root - это корень дерева.
Сними ролик про B-trees плз)
Нормального ролика найти не могу, а они чаще используются для баз данных....
Как всегда кратко и информативно. Спасибо за пищу для мозга )
Какой же годный контент… Большое спасибо!!!
Монтаж топ, но умение объяснять это искусство. Нашёл видео по этой же теме 9летней давности и сразу всё понял. А тут от ролика только перегрузка лишняя. Но лайк за труды
Скинь ролик плз
Что за ролик?
на 8:03 у вас опечатка. Вы говорите что сначала выводим родителя потом левого и правого, но в коде у вас наоборот сначала левый и правый и потом родитель.
на 8:13 функции deleteTree и copyTree совершенно идентичные, хотя вроде разные обходы.......
Алекс, привет. Мне кажется, что на 7:05 также нужно и слева искать значение ключа заменяющего узла, чтобы его удалить. Т.е. просто нужно добавить node.left = delete(node.left, maxInLeft.key); . Переписал твой код и попробовал на датасете от 5 до 11 удалить вершину 8, то с кодом из примера 7 станет вершиной и также останется лепестком, поэтому нужно и для левой части делать проверку (удаление).
Классный ролик, но эти нелогичные игры с интонациями просто убивают и сводят с ума. Из за них даже простая информация становится сложной. Такое ощущение что голос сгенерин плохой нейросетью.
Мозг расплавится понять это с первого раза. Автору респект, что не только вник и разобрался, но и иллюстрировал и разжевал. Но осознать это всё очень сложно. Только базовые идеи
Кончаю от твоего "Окей" 😁😁😁
Посмотрев данный ролик, я понимаю - какой же я тупой...
Спасибо за ролик.
Очень качественный контент, спасибо
Подсказка, по поводу того, чтобы понять почему КЧД балансируется, узнайте что такое 2-3 дерево, частный случай n-дерева. Когда вы поймете, 2-3 дерево, тогда вы поймет что кчд - это и есть 2-3 дерево, просто для обозначения левого и правого элемента, нам понадобилось красить узлы бинарного дерева.
Алекс, спасибо тебе!
Мне безумно заходить этот контент, я под него стараюсь расслабляться и при этом продолжать вникать во все тонкости программирования,
с такой визуализацией и музыкальным сопровождением уносит в транс порой..
Лайк не глядя, а потом уже просматриваем в высоком качестве и без перемотки 🌚
Alek, благодарю!! 👍 Инфографика великолепна! 🔥
Автор ты просто МегаМен. 👌👍 спасибо
Хорош комменты сыпать) лайки ставьте)
Да поставили уже ))))
Спасибо за видео!!!
Отличный контент! Спасибо!
Спасибо за очередное годное видео
круто, так быстро и подробно про деревья я еще не видел материала
О. Новенький видосик. Усваиваем
08:00 опечатка в коде метода copyTree: правильно будет сначала print(node.value); затем левы и правый. А то получилcя такой же порядок как в deleteTree.
Спасибо за видео. Лайк👍
Интересно, круто рассказываешь, но пока тяжело. Вернусь через месяц
как вовремя! как раз разбирался с ними! спасибо!
Жёсткий контент. Примеров только бы побольше
Как можно было жить и не знать этого, спасибо P.S. Серьёзно, без шуток
еще было б очень интересно посмотреть ролик про файловые системы. К примеру фат32. Как оно все устроено, где хранятся данные, что такое размер клстера и тд
у него есть поищите на канале!
@@MsAlexandr76 вы меня дурите. нету такого
Теперь точно есть) th-cam.com/video/FQ_xeY0eCpA/w-d-xo.html
да ладно, чувакккк, обожаю
На протяжение всего времени изучения программирования, я уже наверное 10000 раз сказал что я тупой )
Прекрасно!!!
Неалохо было бы посмотреть настолько подробное видео года два назад, когда была такая дисциплина. Было бы гораздо легче.
Капитальный красавчик !
Благодарю за разбор красно-черного дерева Давно когда-то видел его разбор текстовый - не стал вьезжать и забил. STL на красно-черных - но кодировать их явно сложнее АВЛ и высота дерева в среднем на 25+% выше чем у АВЛ Так что друг друга они заменить и вправду не могут.
Смотрю про красно-черное дерево в голове играют Rolling Stones😅
Paint it black, понимаю)
Cпасибо, посмотрим
Спасибо за видео
Очень круто и фундаментально
Спасибо за видеоролик!
Спасибо за видео. Что-то код "Прямого обхода" совпадает с кодом "Обратно подхода". Или я чего-то непонял?
Тинькофф ищет только Middle(+) . а видео про Junior(стажер) 😅
В двоичном дереве поиска для метода insert забыли условие для проверки равности ключей (для того чтобы заменить значение по уже существующему ключу).
Спасибо конечно огромное, но контрольная по этой теме была на прошлой неделе
23:51 если я правильно понял, то это второй кейс из момента 22:08. Тогда получается ошибочка: чёрные дети красного брата не должны быть нулями. Потому, что их чёрные высоты в момент до удаления равны 1, а не нулю.
Интересная тема, а какое практическое применение, где это можно встретить?
Ничего не понятно, но очень интересно!
Персистентное AVL- дерево по неявному ключу с групповыми модификациями - кайф
видео с удовольствием .... посмотрел.
Годнота
Это класс, это здорово! Ну а компиляторы, теперь, как работают?
огромное спасибо за видео
Самое крутое объяснение работы деревьев
Лучший просто!
Круто. Но жестко)
По-моему на 7:05 рекурсивно удалять дубль 6ки нужно в левом потомке node.left = delete(node.left, maxInLeft.key) , а не в правом как на видео.
Мне кажется, что нужно и там, и там. Т.е. нужно просто добавить node.left = delete(node.left, maxInLeft.key), а остальное также оставить.
@@laranMQRзачем и там, и там, если мы берём 6ку именно из левого дерева, значит ее оттуда и нужно удалить. Справа может отказаться другая 6ка, которую мы удалим "просто так"
в жаве вылетает на наль поинтер тогда... Кроме того по коду удаляются и другие ноды не равные ключу что передается в функцию
Мне кажется, когда рассказывали про удаление из красно-чёрного дерева, брата по ошибке назвали дядей
Братан что за музон в начале до рекламы ?
неплохо. но где b-tree?) желательно еще и сравнение b-tree с красно-черным деревом. в любом случае лайкос за сравнение с кубиком рубика)
Разбор структур различных файловых систем не ожидается ли в ближайшем будущем?
Спасибо тебе за помощь
Забавно что я сейчас как раз делала домашку з бинарньім деревом, и єто видео просто бьіло у меня в реках
Судьба походу
це відео ще й тілки но вийшло, у тебе там мабудь кайф лютий?
Я не понимаю
@@ЭйяфьядлайёкюдльБесперспективн пон
даааа, я тоже
Пушкааааа
Комент для продвижения ролика*
Омг тут про красно-чёрное дерево... Жэээсть
Alek OS скажите пожалуйста в какой программе вы делаете слайды?
Комм для продвижения ролика*
6:55 то есть я могу в качестве корня взять либо 7 либо 6?
Не уверен что всё хорошо понял, но на всякий случай покрасил деда
Если захотите написать сами по коду из этого видео красно черное дерево, будьте осторожны, так как здесь очень много ошибок и если все переписать код просто не будет работать
1. 7:39, 7:56 print(node.value) разве нам не нужно вывести ключи, т.е. print(node.key) ?
2. 14:22 фукция leftRoatet строка node.right_.left_ = node.right_.right_; не лишняя?
3. После вставки в узла АВЛ в дерево его нужно балансировать?
P.s. очень крутое видео, спасибо.
Классно чёрное дерево это конечно хорошо, но пока сам такую структуру не напишешь, то что-то полностью понять сложновато.
Очень интересно
Не глядя лайк ❤
Не слушая, тоже затычковал
Тут даже теоретически сложно, а если ещё и писать это
Ох, что-то мне не хорошо 😁
Черные родители, черный дядя, черные дети - как будто в гетто зашел)
Спасибо 👍
Ее новое видео!
Хорошие видео, по кормену цикл идет?
Объясните, пожалуйста, почему на 17:33 в правой ветке дерева узел черный, а не красный, если у него двое детей и оба черные листы? По объяснению, он должен быть красный и тогда все красно-черное древо несбалансированно... или нет?
Черный узел может иметь два черных ребенка, а вот красный узел не просто может, а обязан. В этом вся логика
Как сойти с ума за 25 минут
В параметры всех функций передается объект класса Node, я правильно понимаю, что это корень?
а не много ли две рекламы?
А где найти код из видео? И, кажется, на видео не попал метод Rotate, необходимый для реализации балансировки после удаления в КЧ дереве.
Подскажите, чем наибольший элемент дерева отличается от самого наибольшего?