- PVSM.RU - https://www.pvsm.ru -

Красно-чёрные деревья на javascript

image

Привет! Изучал недавно красно-черные деревья. Попробовал визуализировать детали работы алгоритмов вставки и удаления на d3.js. Надеюсь, полученный результат поможет сэкономить немного времени тем, кто изучает алгоритмы на javascript. Посмотреть можно тут [1]. Исходник реализации, от которой отталкивался тут [2]. Под катом краткие подробности.

Поиск существующих решений

Главной целью задумки было разобраться в реализации алгоритма и визуализировать ее. Первым делом стал искать реализацию с полными и понятными пояснениями и кодом на js. В процессе поиска опечалило, что авторы временами недоделывают исходник, например, тут [3] есть алгоритм вставки, но нету удаления. Или делают визуализацию как тут [4], но не дают ссылки на исходник. Потом нашел вот эту [5] отличную статью. Но хоть убейте, до сих пор не могу понять почему автор вставил код картинками и не дал по запросу в коментах ссылку на исходник. Есть еще npm пакет red-black-tree [6], весь исходный код которого: 'in progress...' в readme. Также нашлась популярная реализация [7] красно-черных деревьев на js, от которой зависит куча пакетов и миллионы закачек в неделю, но код там устарел лет на пять.

Расстановка приоритетов и конкретизация задачи

Пораскинув мозгами, решил, что читаемость и понятность кода для учебных целей приоритетнее, поэтому взял за основу статью, которую упоминал вначале, а не npm пакет. Реализация оказалась более удобной и наглядной в плане чтения кода. В статье автор начинает с двоичного дерева, потом расширяет его до красно-черного. Для визуализации выглядит вполне логичным наследовать от красно-черного дерева и сделать анимированное дерево. Поэтому, перенабрав код и убедившись, что он работает, приступил к рисованию анимированного дерева. Дальше на помощь приходит d3.js. Там есть замечательные transitions, которые позволяют двигать элементы в нужные позиции и плавно трансформировать в подходящие состояния, по ходу работы алгоритма.

Смысл красно-черных деревьев

Долго думал, как бы по простому, объяснить что к чему. Наверное, все таки надо почитать теорию из разных источников. Как говорится: «Из песни слов не выкинешь». Но простые итоговые выводы в двух словах сформулировать можно. Суть сводится к тому, что есть несколько кейсов при вставке и удалении элемента, в зависимости от которых «дедушки», «папы», «дяди», «дети», «братья» перекрашиваются и сдвигаются (поворачиваются) в сторону, где элементов меньше. В результате никогда не бывает, чтобы путь от самого дальнего узла к корневому был слишком длинным, поэтому поиск нужного элемента в такой структуре происходит очень быстро. Ну а компенсируется это сложностью вставки и удаления.

Автор: Иван

Источник [8]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/javascript/347485

Ссылки в тексте:

[1] тут: https://idriuk.github.io/red-black-tree-player/

[2] тут : https://github.com/IDriuk/red-black-tree-player/tree/master/src/algorithms

[3] тут : https://github.com/trekhleb/javascript-algorithms/blob/ba2d8dc4a8e27659c1420fe52390cb7981df4a94/src/data-structures/tree/red-black-tree/__test__/RedBlackTree.test.js#L315

[4] как тут : https://www.cs.usfca.edu/~galles/visualization/RedBlack.html

[5] вот эту : https://medium.com/@julianknodt/red-black-trees-in-javascript-c20eec1d5d1c

[6] npm пакет red-black-tree : https://www.npmjs.com/package/red-black-tree

[7] реализация : https://www.npmjs.com/package/functional-red-black-tree

[8] Источник: https://habr.com/ru/post/488578/?utm_source=habrahabr&utm_medium=rss&utm_campaign=488578