Поиск строки в массиве

Общие вопросы программирования, алгоритмы и т.п.

Модератор: Модераторы

Alex2013
долгожитель
Сообщения: 3211
Зарегистрирован: 03.04.2013 11:59:44

Сообщение Alex2013 »

iskander писал(а):Потрясающе веский аргумент из уст человека, прожившего уже почти четверть 21 века и по сию пору считающего хеш-таблицу извращением.
Я не считаю хеш-таблицу извращением просто мне показалось что для этой задачи она избыточна .
Последний раз редактировалось Alex2013 15.12.2023 22:31:53, всего редактировалось 1 раз.
iskander
энтузиаст
Сообщения: 627
Зарегистрирован: 08.01.2012 18:43:34

Сообщение iskander »

Alex2013 писал(а):Я не считаю хеш-таблицу извращением просто мне показалось что для этой задачи она избыточна .
Креститься надо, когда мерещится всякое непотребство.
Alex2013
долгожитель
Сообщения: 3211
Зарегистрирован: 03.04.2013 11:59:44

Сообщение Alex2013 »

Find действительно быстрее IndexOf

Код: Выделить всё

function TStringList.Find(const S: string; out Index: Integer): Boolean;

var
  L, R, I: Integer;
  CompareRes: PtrInt;
begin
  Result := false;
  Index:=-1;
  if Not Sorted then
    Raise EListError.Create(SErrFindNeedsSortedList);
  // Use binary search.
  L := 0;
  R := Count - 1;
  while (L<=R) do
  begin
    I := L + (R - L) div 2;
    CompareRes := DoCompareText(S, Flist^[I].FString);
    if (CompareRes>0) then
      L := I+1
    else begin
      R := I-1;
      if (CompareRes=0) then begin
         Result := true;
         if (Duplicates<>dupAccept) then
            L := I; // forces end of while loop
      end;
    end;
  end;
  Index := L;
end;
 

Но увы (Сори, тут я точно поспешил не проверив :oops: ) это не будет работать с CustomSort и пустым списком строк ...
(Хотя это не великая проблема но признаю что "изящества" уже не будет (придется делать свою процедуру поиска ) )
Зы
Но все-же CustomSort действительно существует .

Код: Выделить всё

procedure TStringList.CustomSort(CompareFn: TStringListSortCompare);

begin
  If (FCount>1) and (FForceSort or (FSortStyle<>sslAuto))  then
    begin
    Changing;
    QuickSort(0,FCount-1, CompareFn);
    Changed;
    end;
end;
Зы Зы
Возможно все это проще будет сделать через более "низкоуровневый" ТList там тоже есть механикка для сортировки

Добавлено спустя 59 минут 14 секунд:
По поводу дженериков: что-то я не видел, что их начинают массово применять в новых релизах LCL что (ИМХО) плохой знак.
iskander
энтузиаст
Сообщения: 627
Зарегистрирован: 08.01.2012 18:43:34

Сообщение iskander »

Alex2013 писал(а):Find действительно быстрее IndexOf
А кто-нибудь подвергал это сомнению?
Alex2013 писал(а):Возможно все это проще будет сделать через более "низкоуровневый" ТList
Да, и желательно на ассемблере.
Alex2013 писал(а):По поводу дженериков: что-то я не видел, что их начинают массово применять в новых релизах LCL что (ИМХО) плохой знак.
Вангую: если Абракадабре вдруг вздумается переписать свой легаси VCL на генериках, то вполне можешь и увидеть. Но это вряд ли.
Alex2013
долгожитель
Сообщения: 3211
Зарегистрирован: 03.04.2013 11:59:44

Сообщение Alex2013 »

iskander писал(а):Да, и желательно на ассемблере.
Ладно ладно уел ! ( признаю, что нужно быть внимательнее... ) Поделом мне. :mrgreen:
iskander писал(а):Вангую: если Абракадабре вдруг вздумается переписать свой легаси VCL на генериках, то вполне можешь и увидеть. Но это вряд ли.
Просто я к тому, что сегодня поддержка джнериков есть, а завтра её может не быть или появится их свершено новая версия (как уже бывало ) . Тем более в LCL не VCL, а ее аналог. А вечно сидеть на старой версии компилятора и лазаруса не получится в принципе. (Если даже с исходным кодом из середины а то и конца 10- х уже туча проблем то что будет дальше? ) Так что без особой нужды юзать "не устоявшуюся технологию" (ИМХО) так себе идея .
.
iskander
энтузиаст
Сообщения: 627
Зарегистрирован: 08.01.2012 18:43:34

Сообщение iskander »

iskander писал(а):Так что без особой нужды юзать "не устоявшуюся технологию" (ИМХО) так себе идея .
Если правильно помню, "неустоявшаяся технология" впервые появилась в FPC-2.2.0, то есть примерно 16 лет назад.
Alex2013 писал(а):сегодня поддержка джнериков есть, а завтра её может не быть или появится их свершено новая версия (как уже бывало )
А разве было такое? Что-то не могу припомнить.
Аватара пользователя
Pavia
постоялец
Сообщения: 290
Зарегистрирован: 07.01.2011 11:46:51

Сообщение Pavia »

Начал писать небольшую программку для построения индекса и поиска файлов в нем. Поиск полнотексный. Код специально упрощен.
Так как написание в процессе. Ещё не до конца готова. Надо небольшие штрихи поправить в логике обработки запроса.

https://gitlab.com/pavia00/textlib

Добавлено спустя 1 минуту 8 секунд:
В дальнейшем планирую полную замену персональному поиску от Яндекса.
Alex2013
долгожитель
Сообщения: 3211
Зарегистрирован: 03.04.2013 11:59:44

Сообщение Alex2013 »

iskander писал(а):А разве было такое? Что-то не могу припомнить.
Было при переходе к третей версии FPC (или 3.2.0) и когда была мода на странные тральные версии типа 3.2.1 и т.п. ( плюс чуть "плавали" модули поддержки )
sts
энтузиаст
Сообщения: 519
Зарегистрирован: 04.04.2008 12:15:44
Откуда: Тольятти

Сообщение sts »

Alex2013 писал(а):По поводу дженериков: что-то я не видел, что их начинают массово применять в новых релизах LCL что (ИМХО) плохой знак.
LCL в прямой зависимости от VCL по совместимости, как тока там, так тут же здесь.

при этом VCL на дженериках как то уныло получается, например, свойство Items: TStrings, по идее должно стать Items: TStrings<E is TObject> и что, при бросани TListBoxа на форму спрашивать что подставить вместо E? а как его задавать? TListBox<E is TObject> а Items: TStrings<E> ? и в "дфм" по умолчанию писать ListBox1: TListBox<TObject>? как то криво, сделать перегружаемый тип синоним для TStrings<E is TObject>, TStrings = TStrings<TObject>, тогда смысл теряется дженерика,
и это еще без учета что TStrings абстрактный класс, надо как то сделать проброс E на реализацию TStringList, property Items: TStrings<E is TObject> => FItems: TStringList<E is TObject>

кароче мутное это дело
iskander
энтузиаст
Сообщения: 627
Зарегистрирован: 08.01.2012 18:43:34

Сообщение iskander »

Alex2013 писал(а):Было при переходе к третей версии FPC (или 3.2.0) и когда была мода на странные тральные версии типа 3.2.1 и т.п.
Так генерики-то тут причём? Емнип проблемы были связаны с введением codepage-aware строк.
Ответить