![]() |
|
Модераторы: Snowy, MetalFan, bems, Poseidon |
![]()
|
|
| mr.Anderson |
|
|||
![]() iOS Lead Developer ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3374 Регистрация: 20.12.2004 Где: далеко Репутация: 3 Всего: 128 |
Задача следующая.
В процессе анализа текста у меня формируется дерево (контрол TTreeView). В нем три корневых раздела. В каждый из корневых узлов по мере анализа вносятся нужные подразделы. Проблема в том, что нельзя, чтобы в корневой узел вносился подраздел, КОТОРЫЙ ТАМ УЖЕ ЕСТЬ, короче, нельзя дублировать подразделы. Но! Для поиска дубликатов приходится обходить ВСЕ подразделы данного корневого узла, и, как вы понимаете, это сильно увеличивает время построения дерева - чем больше дерево - тем дольше работа (так как тем с большим количеством подразделов приходится проводить сравнение). Я никак не могу придумать алгоритм быстрого поиска дубликатов в корневом разделе дерева. Вот это и есть основная задача. Мой алгоритм "прямой" и прет напролом, что добавляет целых 2-3 минуты ко времени анализа: он просто циклически обходит все подразделы. Это самый простой и самый длительный по времени алгоритм. P.S. Хочу заметить, что дерево не бинарное, то есть в каждом из трех корневых разделов может быть любое количество подразделов. А вот у подразделов дочерних нодов уже нет - т.е. дерево двухуровневое: корень - подразделы. |
|||
|
||||
| dumb |
|
|||
![]() sceloglauxalbifacies ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2929 Регистрация: 16.6.2006 Репутация: 3 Всего: 158 |
самый быстрый, на мой взгляд, вариант - для корневых узлов сделать массивы хэшей(crc32 напр), а при добавлении элемента, считать его хэш и проверять, нет ли такого в массиве.
хотя, скорее всего, основные тормоза в строковых сравнениях - если те же хэши заголовков элементов класть в item.Data, и, пробегая по цепочке элементов, сравнивать хэш нового эл-та с item.Data, то будет гораздо веселей... |
|||
|
||||
| mr.Anderson |
|
|||
![]() iOS Lead Developer ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3374 Регистрация: 20.12.2004 Где: далеко Репутация: 3 Всего: 128 |
А примерчик можете привести? Data - это поле типа Pointer. А в DRKB я нашел реализацию CRC32-функции, возвращающую Integer. Плюс в нее передаются непонятные параметры типа IniCRC: Integer.
|
|||
|
||||
| dumb |
|
|||
![]() sceloglauxalbifacies ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2929 Регистрация: 16.6.2006 Репутация: 3 Всего: 158 |
второй вариант(т.е. без массивов хэшей):
|
|||
|
||||
| MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 22 Всего: 128 |
посмотри в сторону VirtualTreeView. оно в разы быстрее стандартного работает, если правильно его применить)
-------------------- There are always someone smarter than you... |
|||
|
||||
| mr.Anderson |
|
|||
![]() iOS Lead Developer ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3374 Регистрация: 20.12.2004 Где: далеко Репутация: 3 Всего: 128 |
dumb, благодарю!
MetalFan, спасибо, поищу данный контрол. Пока нарыл описание, очень обнадеживает, попробую работать с ним. |
|||
|
||||
![]()
|
| Правила форума "Delphi: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |