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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Virtual Treeview указатель на узел по индексу 
:(
    Опции темы
Napalmx
Дата 16.9.2009, 09:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Собственно вопрос. Имеется VirtualStringTree заполненный узлами, как от него получить указатель на узел (PVIrtualNode)  зная индекс узла. Индекс узла вычисляется в теле программы. Заранее спасибо.
PM MAIL   Вверх
kami
Дата 16.9.2009, 12:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 23
Всего: 72



имхо, только перебором.
Что-то типа

Код

function TForm1.GetNodebyIndex(index:integer):pVirtualNode;
var
  tmpNode:pVirtualNode;
begin
  Result:=nil;
  tmpNode:=vt.GetFirst;
  
  While Assigned(tmpNode) do
    begin
      if vt.AbsoluteIndex(tmpNode)=index then
        begin
          Result:=tmpNode;
          break;
        end;
      tmpNode:=vt.GetNext(tmpNode);
    end;
end;


Это сообщение отредактировал(а) kami - 16.9.2009, 12:12
PM MAIL WWW   Вверх
Napalmx
Дата 16.9.2009, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(kami @ 16.9.2009,  12:12)
имхо, только перебором.

Этого как раз пытаюсь избежать... Узлов может быть достаточно большое количество. Список сортированный по определенному параметру, поэтому хочу организовать поиск делением пополам по этому же параметру. Для этого мне и нужно каждый раз получать узел-середину выбранного диапазона. Если искать узел перебором все плюсы данного алгоритма сходят на нет.
PM MAIL   Вверх
kami
Дата 17.9.2009, 00:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 23
Всего: 72



Цитата(Napalmx @  16.9.2009,  15:59 Найти цитируемый пост)
Узлов может быть достаточно большое количество. 

Насколько большое?
на моей машине (AMD turion 64x2 1.9 ГГц) поиск по дереву из 11 100 элементов (4 уровня вложения) происходит максимум за 1 миллисекунду, чем ближе к началу - тем быстрее (не тики же считать smile  ).

Вот другой код, состряпанный сегодня на основе исходников VT (возможно, неоптимальный и некрасивый, но зато выполняется за 0 миллисекунд на том же дереве, разницу меньше 1мс считать просто лень).

Код

function TForm1.GetNodeByIndex(index: integer): pVirtualNode;
var
  tmpNode: pVirtualNode;
  tmpIndex: integer;
begin
  Result := nil;
  // проверяем, есть ли вообще такой элемент
  if (index > vt.AbsoluteIndex(vt.GetLast)) or (index < 0) then
    exit;

  // начинаем искать
  tmpIndex := 0;
  tmpNode := vt.GetFirst;

  while Assigned(tmpNode) and (tmpIndex <> index) do
    begin
      // пролистываем по элементам одного уровня, пока не перескочим за искомый индекс
      while Assigned(tmpNode) and (tmpIndex < index) do
        begin
          inc(tmpIndex, tmpNode.TotalCount);
          if tmpIndex <= index then
            tmpNode := tmpNode.NextSibling
        end;
      if (tmpIndex > index) then
        begin
          if Assigned(tmpNode) then
            tmpNode := tmpNode.LastChild; // чуть перескочили - берем последний дочерний узел
          while Assigned(tmpNode) do
            begin
          // отматываем назад
              dec(tmpIndex, tmpNode.TotalCount);
              if (tmpIndex > index) then
                tmpNode := tmpNode.PrevSibling
              else
                break;
            end;
        end;
    // и так до тех пор, пока не найдем узел с нужным индексом.
    end;
  Result := tmpNode;
end;

PM MAIL WWW   Вверх
kami
Дата 17.9.2009, 07:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 23
Всего: 72



Цитата(kami @  17.9.2009,  00:58 Найти цитируемый пост)
поиск по дереву из 11 100 элементов (4 уровня вложения) происходит максимум за 1 миллисекунду, чем ближе к началу - тем быстрее

мда... погорячился. С одним уровнем в 11 000 нодах поиск идет за 600-700 мс первым кодом и прежние 0 мс вторым...

Видимо, второй код оптимальнее для этой задачи.

Это сообщение отредактировал(а) kami - 17.9.2009, 22:23
PM MAIL WWW   Вверх
Romikgy
Дата 17.9.2009, 09:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 26
Всего: 146



имхо проще унаследовать данный виртуал , и при добавлении нового итема,
записывать индекс его и указатель на итем в отдельную структуру.....


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Napalmx
Дата 18.9.2009, 07:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Видимо так и придется перебирать... Просто я с компонентом работаю недавно, рассчитывал что есть какой-то метод или механизм для реализации этой задачи. Всем спасибо.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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