Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поиск дубликатов в TTreeView 
V
    Опции темы
mr.Anderson
Дата 22.8.2007, 13:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


Профиль
Группа: Участник Клуба
Сообщений: 3374
Регистрация: 20.12.2004
Где: далеко

Репутация: 3
Всего: 128



Задача следующая.

В процессе анализа текста у меня формируется дерево (контрол TTreeView). В нем три корневых раздела. В каждый из корневых узлов по мере анализа вносятся нужные подразделы. Проблема в том, что нельзя, чтобы в корневой узел вносился подраздел, КОТОРЫЙ ТАМ УЖЕ ЕСТЬ, короче, нельзя дублировать подразделы. Но!

Для поиска дубликатов приходится обходить ВСЕ подразделы данного корневого узла, и, как вы понимаете, это сильно увеличивает время построения дерева - чем больше дерево - тем дольше работа (так как тем с большим количеством подразделов приходится проводить сравнение).

Я никак не могу придумать алгоритм быстрого поиска дубликатов в корневом разделе дерева. Вот это и есть основная задача. Мой алгоритм "прямой" и прет напролом, что добавляет целых 2-3 минуты ко времени анализа: он просто циклически обходит все подразделы. Это самый простой и самый длительный по времени алгоритм.


P.S. Хочу заметить, что дерево не бинарное, то есть в каждом из трех корневых разделов может быть любое количество подразделов. А вот у подразделов дочерних нодов уже нет - т.е. дерево двухуровневое: корень - подразделы.


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
dumb
Дата 22.8.2007, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 3
Всего: 158



самый быстрый, на мой взгляд, вариант - для корневых узлов сделать массивы хэшей(crc32 напр), а при добавлении элемента, считать его хэш и проверять, нет ли такого в массиве.

хотя, скорее всего, основные тормоза в строковых сравнениях - если те же хэши заголовков элементов класть в item.Data, и, пробегая по цепочке элементов, сравнивать хэш нового эл-та с item.Data, то будет гораздо веселей...
PM MAIL   Вверх
mr.Anderson
Дата 22.8.2007, 14:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


Профиль
Группа: Участник Клуба
Сообщений: 3374
Регистрация: 20.12.2004
Где: далеко

Репутация: 3
Всего: 128



А примерчик можете привести? Data - это поле типа Pointer. А в DRKB я нашел реализацию CRC32-функции, возвращающую Integer. Плюс в нее передаются непонятные параметры типа IniCRC: Integer.


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
dumb
Дата 22.8.2007, 15:57 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 3
Всего: 158



второй вариант(т.е. без массивов хэшей):
Код

procedure TForm1.Button1Click(Sender: TObject);
var
  s: String;
  dup: Boolean;
  crc: Dword;
  item: TTreeNode;
begin
  s := Edit1.Text;
  if s = '' then exit;
  crc := CRC32(-1, s);
  dup := false;
  item := TreeView1.Items.GetFirstNode;
  while item <> nil do
  begin
    if crc = Dword(item.Data) then begin
      dup := true;
      break;
    end;
    item := item.GetNext;
  end;
  if not dup then
    TreeView1.Items.AddChildObject(nil, s, Pointer(crc));
end;

PM MAIL   Вверх
MetalFan
Дата 22.8.2007, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 22
Всего: 128



посмотри в сторону VirtualTreeView. оно в разы быстрее стандартного работает, если правильно его применить)


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
mr.Anderson
Дата 22.8.2007, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


Профиль
Группа: Участник Клуба
Сообщений: 3374
Регистрация: 20.12.2004
Где: далеко

Репутация: 3
Всего: 128



dumb, благодарю!

MetalFan, спасибо, поищу данный контрол. Пока нарыл описание, очень обнадеживает, попробую работать с ним.


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0484 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.