|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
21.06.2016, 10:51 | #1 |
Старожил
Регистрация: 04.02.2009
Сообщений: 17,351
|
Оптимизация доступа к данным в деревьях
Итак, есть дерево строк (по предыдущим темам должно быть понятно). Ну например:
Планета ...Континенты ......Азия ......Европа .........Москва ......Южная Америка ......Северная Америка ......Австралия ...Океаны ......Тихий океан ......Атлантический океан ......Индийский океан Все узлы физически размещены в динамическом массиве. Для поиска узлов используется идентификатор (так как элементы могут удаляться идентификатор узла и его индекс в массиве это разные вещи). Суть проблемы ранее уже озвучивали, но мне не когда было ранее обращать на это внимание. Теперь же вот например я хочу добавить Москве в угоду админу вон Химки. Соответственно рекурсивно - нужно преобразовать строковое имя в идентификатор, а по нему в индекс. Все это делается пока что простым перебором. Проблема в том что сразу индекс элемента массива получить нельзя, так как имена у различных ветвей на разных уровнях могут повторяться. То есть нужно строить всю цепочку последовательно: Планета-Континенты-Европа-Москва. То есть я должен как минимум 4 раза перебирать массив, а если Москву добавляли последней, то как минимум один раз полностью пройти его. Вопрос как ускорить процесс? Мне нужно быстро получить идентификатор или индекс для элемента Москва. Пока ничего не придумал, только сделать по уровням привязку имен/идентификаторов (помним, что элементы в массиве могут менять местоположение, потому сразу индексы непонятно как прикрутить). Ну то есть где-то хранить Планета(0 - идентификатор, 0 - начальный уровень) и т.д. В пути уровень определить уже можно и так ускорить построение пути до нужного идентификатора, а там уже полным перебором в массиве найти нужный индекс.
Маньяк-самоучка
Utkin появился в результате деления на нуль. Осторожно! Альтернативная логика |
21.06.2016, 11:10 | #2 |
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
А узлы просто строки или объекты? Если объекты, то почему бы не искать по ссылкам на дочерние? Ссылочки конечно в объект придется встраивать
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
|
21.06.2016, 11:14 | #3 | ||
Лис
Старожил
Регистрация: 18.09.2015
Сообщений: 2,409
|
Цитата:
Цитата:
Если он совпадает с подзапросом из нового запроса, то поиск начинай от него. Индексировать надо то по чему у вас чаще идут запросы. А вообще вам надо начинать с архитектуры. Опишите данные их объемы. Напишите какой вид операций чаще используется: вставка, удаление или поиск. Выберете из сходя из этого нужную коллекцию(динамическую структуру). Для оптимизации используйте индексы и кеши, которые должны ускорить работу выбранной коллекции данных под конкретные разновидности запросов. И помните золотое правило программиста: выигрываешь в скорости проигрываешь в памяти.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал . Последний раз редактировалось Pavia; 21.06.2016 в 11:22. |
||
21.06.2016, 11:39 | #4 | |||||||
Старожил
Регистрация: 04.02.2009
Сообщений: 17,351
|
Цитата:
Цитата:
Цитата:
Цитата:
Код:
Код:
Цитата:
Цитата:
Цитата:
Маньяк-самоучка
Utkin появился в результате деления на нуль. Осторожно! Альтернативная логика Последний раз редактировалось Utkin; 21.06.2016 в 11:54. |
|||||||
21.06.2016, 11:52 | #5 | |
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
А чего на родителя и детей индексы, а не Pointer? Тогда положение в массиве не важно будет. Да и сам массив не очень актуален.
Цитата:
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Последний раз редактировалось Аватар; 21.06.2016 в 11:56. |
|
21.06.2016, 12:05 | #6 | ||||
Старожил
Регистрация: 04.02.2009
Сообщений: 17,351
|
Цитата:
Цитата:
Цитата:
Цитата:
Маньяк-самоучка
Utkin появился в результате деления на нуль. Осторожно! Альтернативная логика |
||||
21.06.2016, 12:07 | #7 | |||
Лис
Старожил
Регистрация: 18.09.2015
Сообщений: 2,409
|
Utkin
Вам надо посмотреть на проблему глобально. Вы сейчас ищете локальное решение. Это не даст вам решения, будет как в анекдоте: Хвост поднял - нос увяз. Нос поднял - хвост увяз! Цитата:
Цитата:
Т.е. не больше 10 миллионов. Цитата:
Зачем вам делать поиск? Кто ищет человек или машина? Если человек ему главное уложиться <1 секунды. Это выполняется в линейном списке при линейном поиске. А у вас есть дерево вот и делайте обход дерева в глубину или в ширину. Будет в 1000-1 000 000 быстрее линейного поиска. И тут вы гарантированно уложитесь. Если поиск это делает машина, то она делает по некоторым входным данным. Вот коллекцию надо подстраивать под структуру этих данных. Храните полный путь 'Планета.Континенты.Азия.Европа.Мос ква' в линейном отсортированном списке. Можно будет искать бинарным поиском.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал . |
|||
21.06.2016, 12:12 | #8 | |
Лис
Старожил
Регистрация: 18.09.2015
Сообщений: 2,409
|
Цитата:
И будет ваша операция O(1)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал . Последний раз редактировалось Pavia; 21.06.2016 в 12:36. |
|
21.06.2016, 12:12 | #9 |
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
Так и я к тому - вместо не понятных индексов родителя и детей их адреса. Я об этом
Код:
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
|
21.06.2016, 12:46 | #10 | |||||||||
Старожил
Регистрация: 04.02.2009
Сообщений: 17,351
|
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Я вот Вам чего предлагаю - Вы вот то что все мне предлагаете попробуйте пошагово выполнить сами. Операция же проста - переместить Москву из Европы в Австралию. Просто чтобы понять проблему изнутри, я может просто объяснить не могу правильно. Вот как Вы будете перемещать Москву?
Маньяк-самоучка
Utkin появился в результате деления на нуль. Осторожно! Альтернативная логика Последний раз редактировалось Utkin; 21.06.2016 в 12:55. |
|||||||||
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Как избавиться от запроса доступа к внешним данным | Loshara | Microsoft Office Excel | 0 | 29.07.2015 14:13 |
Страницы доступа к данным | Jimmy Lenox | Microsoft Office Access | 0 | 19.10.2012 15:12 |
страницы доступа к данным... | AGhost | Microsoft Office Access | 3 | 21.05.2010 23:05 |
Создание класс с использованием методов доступа к данным | El_Bint0 | Помощь студентам | 1 | 14.03.2007 10:16 |