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

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

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

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

Сообщение Alex2013 » 15.12.2023 23:21:24

iskander писал(а):Потрясающе веский аргумент из уст человека, прожившего уже почти четверть 21 века и по сию пору считающего хеш-таблицу извращением.

Я не считаю хеш-таблицу извращением просто мне показалось что для этой задачи она избыточна .
Последний раз редактировалось Alex2013 15.12.2023 23:31:53, всего редактировалось 1 раз.
Alex2013
долгожитель
 
Сообщения: 2957
Зарегистрирован: 03.04.2013 11:59:44

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

Сообщение iskander » 15.12.2023 23:25:45

Alex2013 писал(а):Я не считаю хеш-таблицу извращением просто мне показалось что для этой задачи она избыточна .

Креститься надо, когда мерещится всякое непотребство.
iskander
энтузиаст
 
Сообщения: 590
Зарегистрирован: 08.01.2012 18:43:34

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

Сообщение Alex2013 » 15.12.2023 23:30:44

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 что (ИМХО) плохой знак.
Alex2013
долгожитель
 
Сообщения: 2957
Зарегистрирован: 03.04.2013 11:59:44

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

Сообщение iskander » 16.12.2023 08:55:03

Alex2013 писал(а):Find действительно быстрее IndexOf

А кто-нибудь подвергал это сомнению?
Alex2013 писал(а):Возможно все это проще будет сделать через более "низкоуровневый" ТList

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

Вангую: если Абракадабре вдруг вздумается переписать свой легаси VCL на генериках, то вполне можешь и увидеть. Но это вряд ли.
iskander
энтузиаст
 
Сообщения: 590
Зарегистрирован: 08.01.2012 18:43:34

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

Сообщение Alex2013 » 16.12.2023 16:15:45

iskander писал(а):Да, и желательно на ассемблере.

Ладно ладно уел ! ( признаю, что нужно быть внимательнее... ) Поделом мне. :mrgreen:
iskander писал(а):Вангую: если Абракадабре вдруг вздумается переписать свой легаси VCL на генериках, то вполне можешь и увидеть. Но это вряд ли.

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

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

Сообщение iskander » 16.12.2023 16:33:16

iskander писал(а):Так что без особой нужды юзать "не устоявшуюся технологию" (ИМХО) так себе идея .

Если правильно помню, "неустоявшаяся технология" впервые появилась в FPC-2.2.0, то есть примерно 16 лет назад.
Alex2013 писал(а):сегодня поддержка джнериков есть, а завтра её может не быть или появится их свершено новая версия (как уже бывало )

А разве было такое? Что-то не могу припомнить.
iskander
энтузиаст
 
Сообщения: 590
Зарегистрирован: 08.01.2012 18:43:34

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

Сообщение Pavia » 18.12.2023 12:29:07

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

https://gitlab.com/pavia00/textlib

Добавлено спустя 1 минуту 8 секунд:
В дальнейшем планирую полную замену персональному поиску от Яндекса.
Аватара пользователя
Pavia
постоялец
 
Сообщения: 290
Зарегистрирован: 07.01.2011 12:46:51

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

Сообщение Alex2013 » 18.12.2023 14:15:04

iskander писал(а):А разве было такое? Что-то не могу припомнить.

Было при переходе к третей версии FPC (или 3.2.0) и когда была мода на странные тральные версии типа 3.2.1 и т.п. ( плюс чуть "плавали" модули поддержки )
Alex2013
долгожитель
 
Сообщения: 2957
Зарегистрирован: 03.04.2013 11:59:44

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

Сообщение sts » 18.12.2023 14:43:18

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>

кароче мутное это дело
sts
постоялец
 
Сообщения: 415
Зарегистрирован: 04.04.2008 12:15:44
Откуда: Тольятти

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

Сообщение iskander » 19.12.2023 10:12:22

Alex2013 писал(а):Было при переходе к третей версии FPC (или 3.2.0) и когда была мода на странные тральные версии типа 3.2.1 и т.п.

Так генерики-то тут причём? Емнип проблемы были связаны с введением codepage-aware строк.
iskander
энтузиаст
 
Сообщения: 590
Зарегистрирован: 08.01.2012 18:43:34

Пред.

Вернуться в Общее

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 35

Рейтинг@Mail.ru