Древовидная структура

RSL

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

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

Каталог — дерево образовался просто по аналогии с таблицей меню в rs-bank, проще не придумать:

Таблица описатель древовидного каталога неопределённой глубины

Помимо каталога были заведены две таблицы: список товаров и кросс таблица. Без кросса было не обойтись, т.к. по задачке один и тот же товар мог участвовать в разных «страницах» каталога.

Товары
Кросс

Таблицы просты и лаконичны… Вот код порадовал «однопроходностью» в поиске. А именно, объявляется массив для списка вершин, которые лежат «ниже» заданной вершины. И вся фишка в том, что процесс обработки этого массива начинается сразу в момент появления в нём первой вершины.

Кусок кода выглядит так:

Цикл обследования дерева в один проход

Массив ma для начала исследования по нижестоящим вершинам заполняется только одной вершиной — корневой, той с которой надо набрать массив. И далее, в теле цикла массив растёт с «хвоста», а с головы исследуется, «подъедается».

Массив одновременно и исследуется и формируется. Мне это решение понравилось.

А вот как в этот процесс вписался поиск товаров, причем поиск без повторений товаров находящихся одновременно в нескольких вершинах каталога:

Поиск товаров без их повторений

При поиске товаров ожидаемо собирается массив mp товаров, но изюминкой является строчка 46 — отсечечение повторов товаров в массиве с помощью ключевой служебной таблицы. Этот метод позволяет существенно уменьшить объём кода, повысить его читаемость и при этом вся мощь первазива позволяет это делать быстро (несколько лет использую этот метод, рекомендую).

И так, алгоритм целиком выглядит так:

Алгоритм перебора дерева и отбора товаров

P.S. Помимо служебной таблицы uni.dbt уже давно использую служебную таблицу key.dbt. С её помощью удобно формируются различные сортировки с изменяющимися «на лету» ключами. Удобно.

Универсальный упорядочиватель массивов

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

Оцените статью
Белов Олег Владимирович