![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы
![]() |
Поиск в этой теме
![]() |
![]() |
#1 |
Старожил
Регистрация: 04.02.2009
Сообщений: 17,351
|
![]()
Суть: Имеется структура данных в ввиде набора узлов деревьев. Все узлы (то есть узлы различных деревьев) хранятся в одном обычном массиве (делается из соображений скорости и кроссплатформенности). Доступ к элементу дерева на данный момент осуществляется через полный сцепленный ключ. Примером может служить система каталогов на диске. Есть вот какой-нибудь сцепленный ключ - путь d:\users\1\desktop
Так вот чтобы осуществить любую операцию (например, копирование одного узла в другой) необходимо вычислить индекс искомого узла (desktop) в общем массиве всех узлов. Схема поиска в общем пока такова - ищем d:\ (а в результате различных операций он может располагаться где угодно и в начала и в конце массива), затем запрашиваем имена дочерних узлов и уже ищем индекс users (то есть опять перебираем массив) и т.д. в рекурсии. Понятно, что это ни разу не быстро. Например, если организовывать иерархическую базу данных, хранящая реальные данные какой-нибудь отрасли деятельности организации, то такая система всю жизнь будет заниматься вычислением местоположения узлов. Вопрос - как ускорить поиск?
Маньяк-самоучка
Utkin появился в результате деления на нуль. Осторожно! Альтернативная логика ![]() |
![]() |
![]() |
![]() |
#2 | ||
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
![]() Цитата:
Цитата:
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
|
||
![]() |
![]() |
![]() |
#3 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,370
|
![]()
Например хранить полный путь для каждого элемента.
Еще кэширование, чтоб искать только в под-пути. А вообще, если есть индекс по имени и по идентификаторы, то перебор массива будет не таким уж и медленным. И, да, лучше использовать контейнер пошустрее, если данные часто обновляются. Кроме того, деревья можно хорошо кешировать страницами, но это уж совсем для извращенцев. |
![]() |
![]() |
![]() |
#4 | |||
Старожил
Регистрация: 04.02.2009
Сообщений: 17,351
|
![]() Цитата:
Цитата:
Цитата:
Я думал над кешем последних использованных элементов (типа запоминать пути и индексы скажем последних 32-х использованных узлов), но не знаю насколько это будет эффективным решением....
Маньяк-самоучка
Utkin появился в результате деления на нуль. Осторожно! Альтернативная логика ![]() |
|||
![]() |
![]() |
![]() |
#5 | |
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
![]() Цитата:
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
|
|
![]() |
![]() |
![]() |
#6 | |
Старожил
Регистрация: 20.04.2008
Сообщений: 5,542
|
![]() Цитата:
Но уж наверняка они знают свой частичный ключ и знают кто их родитель (имеют прямую ссылку к нему(индекс)). Либо они всегда могут узнать свой полный ключ без полного перебора массива (просто рекурсивно пройдя по своим ссылкам на родителя). Опрашиваем ВСЕ ячейки на предмет их ключа и выбираем искомую. Если при опросе проверять на частичное совпадение то можно будет и не строить полного ключа. ключ 'с\user\t' не может быть у ячейки с частичным ключом 'f' ('t'<>'f') нелинейное построение ключей для дочерних узлов <-> линейное построение ключей по родителям. Каждый элемент(узел) должен уметь проверить на совпадение предоставленный ключ и свой собственный. ну и просить также проверять своего родителя.
программа — запись алгоритма на языке понятном транслятору
Последний раз редактировалось evg_m; 02.10.2014 в 11:45. |
|
![]() |
![]() |
![]() |
#7 |
Участник клуба
Регистрация: 21.11.2007
Сообщений: 1,692
|
![]()
Если я правильно понял, то Closure Table
|
![]() |
![]() |
![]() |
#8 | |||
Старожил
Регистрация: 04.02.2009
Сообщений: 17,351
|
![]() Цитата:
Цитата:
Цитата:
Маньяк-самоучка
Utkin появился в результате деления на нуль. Осторожно! Альтернативная логика ![]() |
|||
![]() |
![]() |
![]() |
#9 | |
Старожил
Регистрация: 20.04.2008
Сообщений: 5,542
|
![]() Цитата:
Есть два типа поиска: 1. Разбор заданного ключа. СПУСК от корневого к дочерним (предполагает что родители знают о всех своих детях). это то что вы пытаетесь реализовать. Но у вас есть проблема: родители на самом деле ничего не знают о своих детях. 2. сравнение ключей Перебор всех элементов массива и восстановление ключа каждого проверяемого элемента. подъем от дочернего (проверяемый узел) к родителю. И сравнение восстановленного ключа с искомым. Как только успех мы НАШЛИ искомое. Сравнение слева направо (спуск+разбор) Сравнение справа налево (подъем+восстановление). ===================== Найти ключ 'с\user\t' ищем все элементы c именем 't' от найденных переходим к родителям, проверяем 'user' и исключаем неудовлетворяющие продолжаем подъем до исчерпания ключа.
программа — запись алгоритма на языке понятном транслятору
Последний раз редактировалось evg_m; 02.10.2014 в 15:39. |
|
![]() |
![]() |
![]() |
#10 |
Старожил
Регистрация: 04.02.2009
Сообщений: 17,351
|
![]()
А, интересная фишка, теперь я понял, какой Вы предлагаете алгорит - от противного
![]() Есть еще одна идея - что если помимо узла, хранить идентификатор родителя? Тогда наверно отбор по корневому узлу мог бы ускорить работу...
Маньяк-самоучка
Utkin появился в результате деления на нуль. Осторожно! Альтернативная логика ![]() Последний раз редактировалось Utkin; 02.10.2014 в 16:19. |
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Работа с деревьями | Alexey_kor | Общие вопросы C/C++ | 0 | 29.04.2012 19:14 |
Работа с двоичными деревьями. | Maksik | Фриланс | 4 | 22.06.2010 22:01 |
Рисонок домика с деревьями!!! | Cheerful-mermaid | Помощь студентам | 5 | 08.04.2009 22:32 |
Работа с деревьями и строками | Михаил_1987 | Помощь студентам | 1 | 27.01.2009 17:12 |