Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Общие вопросы по программированию, компьютерный форум
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.10.2014, 17:02   #11
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,542
По умолчанию

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

=============
с\user\t
просматриваем все элементы
переходим к родителям и проверяем ключи ребенков (t) отбираем успешные.
в отобранном переходим к родителям и проверяем (user)
.....
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 02.10.2014, 19:37   #12
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Цитата:
что мешает рядом с именем ребенка хранить и прямой индекс в массиве. (для реализации поиска по спуску).
Операции удаления и перемещения узлов. Удаление дерева как Вы и сами знаете вещь интересная, учитывая что элементы дерева могут быть разбросаны где угодно по массиву. Потому существует такая заморочка - для юзера символьное имя, для высокоуровневых операций - идентификатор-число, для реализации мы уже вынуждены опускаться на уровень индекса в массиве. Каждая операция атомарна и только в рамках нее вычисляется и используется индекс (это задел на многопотоковую работу с хранилищем узлов). То есть индекс вычисляется и используется максимально кратковременно, получается что в результате возможных преобразований (перемещение, копирование, удаление) узлы могут хаотично плавать в массиве (наиболее вероятна операция смещения индекса на 1 к началу из-за удаления узла), поэтому я предположил (возможно ошибочно), что прямая работа с индексами будет неэффективна. Для однозначной идентификации узла, где бы в массиве он не находился используется числовой идентификатор. То есть я работаю так - сцепленный ключ я преобразовывают в идентификатор и далее уже имеется стандартный набор операций над узлом по его идентификатору. И если индекс узла может меняться независимо от самого узла, идентификатор всегда постоянен и уникален во время всей жизни узла и позволяет гарантированно отличать один узел от другого (символьные имена узлов могут быть неуникальными, например корень-корень-корень-корень-корень-корень2). Отличия имеют только потомки одного и того же узла (включая корневые - все они есть потомки глобального узла, который создается при создании и инициализации массива). Поскольку глобальный узел безымянный (не имеет предка, а как писал ранее имена хранятся у родителей), то юзер напрямую обратиться к нему не может и ничего не подозревая считает прямых потомков глобального узла корневыми.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 03.10.2014, 10:56   #13
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,542
По умолчанию

Итак основная проблема:
узлы не имеют непосредственной адресации в массиве (будь то адрес ребенка, будь то адрес родителя),
а есть только косвенная адресация (тот самый идентификатор).

И здесь при любом алгоритме поиска по ключу (моем/вашем/...) остается только многократное "сканирование" массива.
Чего собственно и хочется избежать.

Конечно его можно ускорить если...
как-то упорядочить массив по тем самым идентификаторам(м.б. с использованием доп. массива индексов). нечто подобное кажется было в ваших первых постах.
И соответственно использовать алгоритмы для поиска в упорядоченных данных.

Но упорядочивание усложняет схему вставки и удаления, а может и нет если...
Выделять идентификаторы только с возрастанием (писать только в конец массива).
Не проводить уплотнения при удалении (по крайней мере каждый раз).
Но при этом возникают новые проблемы:
-хватит ли идентификаторов;
-хватит ли свободного места.

P.S. использование имен в списке дочерних делает выбор в пользу вашего алгоритма спуска по дереву против моего.
так что остается только оптимизация сканирования массива при использовании косвенной адресации (поиск узла по его идентификатору [не ключу!]).
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 03.10.2014 в 11:09.
evg_m вне форума Ответить с цитированием
Старый 03.10.2014, 12:33   #14
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Цитата:
Итак основная проблема:
узлы не имеют непосредственной адресации в массиве (будь то адрес ребенка, будь то адрес родителя),
а есть только косвенная адресация (тот самый идентификатор).
Верно. Собственно это и есть узкое место.
Цитата:
И здесь при любом алгоритме поиска по ключу (моем/вашем/...) остается только многократное "сканирование" массива.
Чего собственно и хочется избежать.
Точно
Цитата:
Конечно его можно ускорить если...
как-то упорядочить массив по тем самым идентификаторам(м.б. с использованием доп. массива индексов). нечто подобное кажется было в ваших первых постах.
И соответственно использовать алгоритмы для поиска в упорядоченных данных.
Перемещать узлы в массиве? Некоторые операции будут очень быстрыми, а другие о-о-чень долгими.
Цитата:
Но упорядочивание усложняет схему вставки и удаления, а может и нет если...
Выделять идентификаторы только с возрастанием (писать только в конец массива).
Не проводить уплотнения при удалении (по крайней мере каждый раз).
Не уплотнять не получиться - многократное удаление/добавление узлов приведет к разрастанию массива. Удаление я оптимизировал так - я не перемещаю все узлы, а только последний на место удаляемого. А последний уменьшаю границей динамического массива. В тот момент когда я начал эту тему реализация удаления была как в списке (то есть перемещением узлов).
Цитата:
Но при этом возникают новые проблемы:
-хватит ли идентификаторов;
-хватит ли свободного места.
Идентификаторов хватит, там тоже хитро сделано, удаляемые идентификаторы не теряются, а раздаются снова добавляемым узлам.
Насчет свободного места не знаю.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 03.10.2014, 12:47   #15
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,370
По умолчанию

Цитата:
Сообщение от Utkin Посмотреть сообщение
В миллион элементов будет однозначно длинным. Представьте в массиве миллион элементов, длина пути до узла скажем десять узлов. Если элементы раскиданы в массиве равномерно, то примерно нужно перебрать полмиллиона узлов (даже если идентификатор число) на один узел. Того 5 миллионов узлов среднее время и практически 10 миллионов узлов крайний случай.
миллион элементов это 2 ^ 20, значит максимум на один поиск - 20 сравнение. Если длинна пути 10 элементов, максимум будет 200 обращений к массиву. Если для вас это медленно, ну тогда не знаю. Храните полный путь, тогда на любой поиск будет уходить максимум 20 сравнений на миллион элементов. Кстати, если не использовать именно массив, тогда полный путь не обязательно нужно будет хранить явно - сохраняя указатель на родительский объект его можно будет генерить когда понадобится.

Почему обязательно именно массив? Чем не устраивают деревья? И вообще, почему данные не в базе?

Последний раз редактировалось waleri; 03.10.2014 в 12:49.
waleri вне форума Ответить с цитированием
Старый 03.10.2014, 12:52   #16
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Цитата:
миллион элементов это 2 ^ 20, значит максимум на один поиск - 20 сравнение.
Подробней с такой арифметикой .
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 03.10.2014, 13:05   #17
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Видимо речь о двоичном поиске. А сортированностью там пахнет вообще? Да и добавление новых элементов порушит её
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 03.10.2014, 13:41   #18
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Нет, ничего не сортировано, но препятствий сортировке нет.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 03.10.2014, 13:59   #19
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,542
По умолчанию

Цитата:
Идентификаторов хватит, там тоже хитро сделано, удаляемые идентификаторы не теряются, а раздаются снова добавляемым узлам.
вот как раз этого и не надо бы.
При таком раскладе при сортировке придется писать в произвольное место (оч. долго!)
Но есть нюанс! раз такой узел был и если мы не сжимали массив (не удаляли физически из массива а только помечали удаление) то это место (с таким идентификаторам) ЕСТЬ и запись уже не в произвольное место а на место удаленного "как бы" элемента.

Цитата:
Да и добавление новых элементов порушит её
для этого и предлагается наложить ограничения на правило выделения новых идентификаторов (НЕ нарушать упорядоченность данных).
и также избежать перемещений в массиве.
1.добавление в конец массива с новым идентификатором заведомо большим всех предыдущих.
2.замена физического сжатия массива введением логического флага "исключен".
3.замена отмеченных удаленными с таким же идентификатором.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 03.10.2014 в 14:07.
evg_m вне форума Ответить с цитированием
Старый 03.10.2014, 14:07   #20
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Цитата:
1.добавление в конец массива с новым идентификатором заведомо большим всех предыдущих.
2.замена физического сжатия массива введением логического флага "исключен".
3.замена отмеченных удаленными с таким же идентификатором.
В результате массив будет разрастаться и никогда не будет уменьшаться, я правильно понял? То есть если после миллиона узлов потребуется их удаление, массив все равно будет содержать миллион "мертвых" узлов? Чего то мне это не нравится.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с деревьями 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