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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.04.2010, 21:27   #1
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию "Деревянный" TList

Нужна реализация самобалансирующегося (красно-черного или АВЛ, не суть важно) дерева на Delphi. Ибо скорость стандартного поиска TList.IndexOf не устраивает никак. Что посоветуете? Желательно что-то готовое, удобное и напоминающее интерфейсом TList, чтобы просто заменить и не вникать долго.

p.s. Кстати, может есть в поставке Delphi такое чудо? В С++ и в Java есть на базе красно-черного дерева структуры данных, может и в Delphi появились?
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог

Последний раз редактировалось mutabor; 02.04.2010 в 21:34.
mutabor вне форума Ответить с цитированием
Старый 03.04.2010, 15:38   #2
Баламут
Баламучу слегка...
Участник клуба
 
Аватар для Баламут
 
Регистрация: 01.11.2006
Сообщений: 1,585
По умолчанию

Готового класса предложить не могу, к сожалению. Но может это поможет? Там довольно подробно все расписано
Баламут вне форума Ответить с цитированием
Старый 03.04.2010, 17:35   #3
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Может просто TList дописать по аналогии с TStrings. Что-то вроде:

Код:
type
   TSortedList = class(TList)
   private
      FSorted : boolean;
      FCompare : TListSortCompare;
   public
      function AddSorted(AObject: TObject): Integer;
      function Find(const AObject: TObject; var Index: Integer): Boolean;
      constructor Create(aCompare: TListSortCompare);
   end;

constructor TSortedList.Create(aCompare: TListSortCompare);
begin
   inherited Create;
   FSorted := true;
   FCompare := aCompare;
end;

function TSortedList.AddSorted(AObject: TObject): Integer;
begin
  if not FSorted then
    Result := Count
  else
    if Find(AObject, Result) then {};
  Insert(Result, AObject);
end;

function TSortedList.Find(const AObject: TObject; var Index: Integer): Boolean;
var
  L, H, I, C: Integer;
begin
  Result := False;
  L := 0;
  H := Count - 1;
  while L <= H do
  begin
    I := (L + H) shr 1;
    C := FCompare(items[I], AObject);
    if C < 0 then L := I + 1 else
    begin
      H := I - 1;
      if C = 0 then
      begin
        Result := True;
        {if Duplicates <> dupAccept then L := I;}
      end;
    end;
  end;
  Index := L;
end;
Весь код из VCL практически без изменений.

Код:
function MySort(N1, N2:Pointer):integer;
begin
   if      integer(N1) = integer(N2) then result :=  0
   else if integer(N1) < integer(N2) then result := -1
   else                                   result :=  1
end;

procedure TForm6.FormCreate(Sender: TObject);
var L1:TSortedList;
    i, N:integer;
begin
   L1 := TSortedList.Create(MySort);
   for i := 0 to 1000 do L1.AddSorted(Pointer(Random(10000)));
alexBlack вне форума Ответить с цитированием
Старый 03.04.2010, 18:30   #4
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Баламут, у меня есть эта книга, но все равно спасибо, может когда нибудь сделаю реализацию TList скоростную, а пока хочется что-то готовое, времени нет на это.

alexBlack, это наверное получше стандартного списка, но мне кажется все равно медленно будет работать, там полный перебор при поиске.

Нашел библиотеку для Delphi где есть ассоциативные массивы на базе красно-черного дерева. Прикрутил, работает, то что надо, быстрее раз в 20 стало. Тут >>> есть описание, там и другие библиотеки упоминаются, но я сделал на той, о к-рой статья, там много чего еще в ней есть, практически реализация STL для Delphi.

Во вложении адаптированный для D2009 главный модуль библиотеки (к статье приложена версия адаптированная для D7), еще я там отключил пул, в начале юнита директива, с ним программа вываливалась с исключением. Насчет остальных модулей не знаю, мне они не понадобились, только этот и еще один (mwFixedRecSort.pas), но там без изменений.
Вложения
Тип файла: txt DeCAL.pas.txt (325.6 Кб, 191 просмотров)
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог

Последний раз редактировалось mutabor; 03.04.2010 в 18:44.
mutabor вне форума Ответить с цитированием
Старый 03.04.2010, 18:51   #5
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Не-а, не полный перебор. В Find используется деление списка пополам, как в QuickSort. т.е. теоретически log2(n) операций для поиска.
alexBlack вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
"ОКРВВЕРХ", "ОКР", "ЕСЛИ". Как бы их связать. Каравай Microsoft Office Excel 13 17.02.2010 09:53
при вводе на листе "магазин"- код товара появлялось "описание" товара из "склада" с "продажной ценой" aleksei78 Microsoft Office Excel 13 25.08.2009 12:04
блок "cont" с права не принимает значение "margin: 10px;" которое описано в body tabikA HTML и CSS 5 24.02.2009 21:50
Под прикрытием "кризиса" наши доблестные "управители" хотят утопить нас в радиоактивных отходах mihali4 Свободное общение 1 17.01.2009 01:43