DON'T STOP AND CODE – Telegram
DON'T STOP AND CODE
103 subscribers
58 photos
2 videos
1 file
119 links
Мой путь в программировании
#python

Для связи: @avagners
Download Telegram
This media is not supported in your browser
VIEW IN TELEGRAM
Дописал метод перемещения узла вместе с поддеревом.

Также написал метод установки уровня глубины узла в дереве.
Метод рекурсивно перебирает все узлы дерева, считает и устанавливает уровень узла относительно корня.

Код покрыл тестами.

Ссылка на гитхаб: https://github.com/avagners/algorithms_and_data_structures/blob/main/data_structures/trees/SimpleTree.py#L65:L77
👍4
~ 549 день👨‍💻 | Двоичные деревья поиска

Сегодня изучал двоичные деревья поиска (бинарные деревья).

Бывают:
- полными (full binary tree);
- строгими (strictly binary tree);
- законченными (complete binary tree);

Бинарные деревья обеспечивают быстрый поиск данных за O(log n).

Отличия от обычных деревьев, которые я изучал накануне:
1) данные в дереве хранятся в определённом порядке;
2) поиск выполняется с учётом этого порядка;

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

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

------
Реализовал структуру данных и покрыл тестами.
Осталось реализовать метод удаления узла.

С кодом можно ознакомиться по ссылке на гитхаб:
https://github.com/avagners/algorithms_and_data_structures/tree/main/data_structures/binary_search_trees

📚Чтение:
+ 14 стр. "Изучаем SQL" Алан Бьюли (2007 год)
(135 страниц из 308)
🔥31
This media is not supported in your browser
VIEW IN TELEGRAM
😁2
~ 550 день👨‍💻 | День работы

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

Например,
- впервые дописывал довольно большой блок модуля;
- впервые поработал с API Яндекс.Диска;
——————
Последнее время работаю в основном самостоятельно. Мой наставник занят своими задачами и уже не уделяет столько времени как раньше.
Радует, что справляюсь. =)

📚Чтение:
+ 0 стр. "Изучаем SQL" Алан Бьюли (2007 год)
(135 страниц из 308)
🔥5👍2🥰1
This media is not supported in your browser
VIEW IN TELEGRAM
🔥1
~ 551 день👨‍💻 | Удаление узла из бинарного дерева

Написать метод удаления узла из бинарного дерева оказалось не такой простой задачей. Просидел порядка 1 часа. Мой код пока не проходит мои тесты)
Проблема с указателями. После операции удаления не все указатели на родителя/потомков указываются верно.

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

Интересная задача. Чем-то напомнила работу с узлами и указателями в связанном списке.

📚Чтение:
+ 0 стр. "Изучаем SQL" Алан Бьюли (2007 год)
(135 страниц из 308)
👍2
~ 552 день👨‍💻 | Удаление узла из бинарного дерева. Продолжение...

Время 1:30 ночи...

Сегодня работал над методом удаления узла из бинарного дерева. =)
Вроде все работает. Узлы удаляются. Тесты свои прохожу.

В общей сложности сегодня решал эту задачу около 9 часов.🙈
——————
Завтра еще раз нужно все перепроверить. И тесты и код.
Возможно, получится поправить код, чтобы он был более компактным и читабельным.

📚Чтение:
+ 0 стр. "Изучаем SQL" Алан Бьюли (2007 год)
(135 страниц из 308)
🔥1
This media is not supported in your browser
VIEW IN TELEGRAM
😁1
Снова восхищаюсь практикой написания тестов))

Сижу перепроверяю вчерашний код. Пишу новые тесты (ну, чтобы на 100% быть уверенным). Написал дополнительно 2 теста. Все работает отлично.

Про себя подумал, что все хорошо и можно заканчивать работу. Но решил написать еще один тест... Иии... Он упал!!!😳

Вроде уже тестов на удаление узла сделал вдоль и поперек. Но как оказалось из вида упускал еще один возможный вариант))

Сижу думаю как поправить метод)🤓

——————
Как я люблю тесты))) Без шуток)
👍2🔥1
~553, 554 дни 👨‍💻 | Закончил работу над бинарным деревом

Написал 545 строк тестов. Было не просто.

Какие сделал выводы?

1) Тестировать все возможные варианты;

2) Если по условию задачи в отрицательном случае метод должен возвращать False, то в противоположном случае обязательно реализуем возврат True. Не оставляем None.

3) Листок и ручка - лучшие друзья при решении подобных задач. Сначала пишем, рисуем. Только потом пишем код.

---------
И самое главное! Читаем условия задачи не жопой! А внимательно, с ручкой и бумагой!

С итоговым кодом можно ознакомиться по ссылке на гитхаб: https://github.com/avagners/algorithms_and_data_structures/tree/main/data_structures%2Fbinary_search_trees

📚Чтение:
+ 0 стр. "Изучаем SQL" Алан Бьюли (2007 год)
(135 страниц из 308)
🔥4
This media is not supported in your browser
VIEW IN TELEGRAM
😁1
~555, 556 дни 👨‍💻 | Поиск в глубину и поиск в ширину

Есть 2 общепринятых способа обхода дерева:
- обход в ширину - это когда перебираем узлы по уровням: сначала корень, потом все узлы второго уровня, далее все узлы третьего уровня, и так далее;

- обход в глубину - это рекурсивный перебор узлов по веткам. Например, сначала перебираем все узлы левого поддерева, потом корень, потом все правого поддерева. Такой способ возвращает упорядоченный список узлов в порядке возрастания. Его ещё называют in-order. Есть ещё pre-order (сначала проверяем узел), и post-order (узел проверяем последним);

С кодом можно ознакомиться на гитхаб: https://github.com/avagners/algorithms_and_data_structures/blob/main/data_structures/binary_search_trees/binary_search_tree.py#L165
---------
📚Чтение:
+ 15 стр. "Изучаем SQL" Алан Бьюли (2007 год)
(150 страниц из 308)
👍3
This media is not supported in your browser
VIEW IN TELEGRAM
1
~557 день 👨‍💻 | Двоичное дерево в виде массива

Продолжаю изучать двоичные деревья. Сегодня начал рассматривать реализацию двоичного дерева поиска в виде массива.

Основные моменты.

1) Узлы в массиве хранятся в последовательном порядке;
2) Дерево хранится целиком. Т.е. если узла нет, то на его месте в массиве хранится None. Пример на изображении.
3) Индексы родителя, левого или правого потомка можно найти след. образом:
- индекс родителя:
(I - 1) / 2
- индекс левого потомка:
2 * I + 1
- индекс правого потомка:
2 * I + 2
, где I - это текущий индекс массива.

—————
📚Чтение:
+ 0 стр. "Изучаем SQL" Алан Бьюли (2007 год)
(150 страниц из 308)
👍3🤔1
This media is not supported in your browser
VIEW IN TELEGRAM
😁1
~558 день 👨‍💻 | Двоичное дерево в виде массива

Реализовал двоичное дерево поиска в виде массива.
Написал 2 метода:
- поиск индекса по ключу;
- вставка нового ключа в массив;

Покрыл всё тестами.

С кодом можно ознакомиться на гитхаб:
https://github.com/avagners/algorithms_and_data_structures/tree/main/data_structures/binary_search_trees_array

—————
📚Чтение:
+ 0 стр. "Изучаем SQL" Алан Бьюли (2007 год)
(150 страниц из 308)
🔥4
2👍2
~559, 560 дни 👨‍💻 | Еще бинарные деревья поиска

Реализовал функцию преобразования неупорядоченного массива в сбалансированное бинарное дерево поиска.

На вход подается неотсортированный массив целых чисел. Размер массива соответствует полностью заполненному дереву N-глубины. Функция возвращает сбалансированное бинарное дерево поиска в виде массива.

Написал тесты.

С кодом можно ознакомиться на гитхаб:
https://github.com/avagners/algorithms_and_data_structures/tree/main/data_structures/generate_bbst_array

—————
P.s. ниже формула нахождения размера массива для создания бинарного дерева нужной глубины:

2^(H+1)-1

, где H - необходимая глубина дерева.

Например, для создания дерева глубиной:
- в 2 уровня - размер массива 7
- в 3 уровня - размер массива 15


📚Чтение:
+ 0 стр. "Изучаем SQL" Алан Бьюли (2007 год)
(150 страниц из 308)
👍4
This media is not supported in your browser
VIEW IN TELEGRAM
😁1
~ 561 день 👨‍💻 | снова бинарные деревья...

Если в субботу создавал метод создания сбалансированного бинарного дерева из массива в виде массива, то вчера написал структуру и методы создания дерева из массива в виде связанных узлов.

Также написал метод проверки - сбалансировано дерево или нет. С данным методом просидел несколько часов)

Написал тесты.

С кодом можно ознакомиться по ссылке на гитхаб:
https://github.com/avagners/algorithms_and_data_structures/tree/main/data_structures%2Fbalanced_binary_search_trees
👍5🔥2