List.Find

From SunFlurry wiki
Jump to: navigation, search
  Find (Поиск значения)
Объект:Список
Статус разработки: Реализована
Тип:Функция
Обращение к БД:Нет
Визуальность:Нет

Функция производит поиск указанного значения в списке, начиная с определенной позиции (если указана), список может быть предварительно сортирован по значениям по неубыванию для увеличения скорости поиска.

Синтаксис

List.Find(<Значение>,<Начальный индекс поиска (INT)>,<Сортировка (INT)>=0):<Позиция найденного значения или ноль (INT)>

Аргументы

  • <Значение> - Значение, которое необходимо найти.
  • <Начальный индекс поиска (INT)> - Индекс (позиция) значения, начиная с которого будет осуществляться поиск (поиск продолжается до конца списка).
  • <Сортировка (INT)>=0 - (необязательный аргумент) Если список был предварительно отсортирован по значениям по неубыванию, будет происходить поиск с учетом сортировки (ускорение). Пример сравнения скорости работы функции для сортированных и не сортированных массивов см. ниже. Возможные значения:
    • 0 -- Поиск с учетом сортировки не будет производиться.
    • 1 -- Будет вестись поиск с учетом сортировки, если список содержит несколько значений, равных искомому, будет возвращена позиция первого из найденных значений.
    • 2 -- Будет вестись поиск с учетом сортировки, если список содержит несколько значений, равных искомому, будет возвращена позиция произвольного из найденных значений (данный режим немного быстрее режима 1).

Возвращаемое значение

Возвращается индекс (позиция) найденного значения или ноль, если значение не найдено.

Примеры

a:=List.Create();			//Список пуст
a.Add(1,"Один");			//Список содержит одно значение
a.Add(2,"Два");				//Список содержит два значения
Message(a.Find(2));			//Выводит 2
Message(a.Find(1,2));			//Выводит 0
Message(a.Find(2,2));			//Выводит 2

Сравнение скорости работы функций с сортировкой и функций без сортировки

Данный пример сравнивает скорость работы функции Find для сортированного и не сортированного списков. Внутри цикла поиска также происходит увеличение массива с помощью функции Add для проверки корректности ее работы.

ProfilerClear();
ProfilerStart();

randomize(1);
aList:=List.Create();
For i:=1 To 100000 Do
  aList.Add(Random(10000));
EndDo;

aList.Sort();
For i:=1 To 10000 Do
  j:=Random(aList.Size())+1;
  aNum:=aList.Get(j);
  While _And(j>1,aList.Get(j-1)=aNum) Do
    j:=j-1;
  EndDo;
  j2:=aList.Find(aNum,,1);
  If j<>j2 Then
    Message("Проблема при поиске значения!","!");
  EndIf;
  //Добавление случайного значения внутри цикла поиска
  aList.Add(Random(10000),,,1);
EndDo;  

randomize(1);
aList:=List.Create();
For i:=1 To 100000 Do
  aList.Add(Random(10000));
EndDo;

aList.Sort();
For i:=1 To 10000 Do
  j:=Random(aList.Size())+1;
  aNum:=aList.Get(j);
  While _And(j>1,aList.Get(j-1)=aNum) Do
    j:=j-1;
  EndDo;
  j2:=aList.Find(aNum);
  If j<>j2 Then
    Message("Проблема при поиске значения (2)!","!");
  EndIf;
  //Добавление случайного значения внутри цикла поиска, в данном примере нас интересует сравнительная скорость работы функции Add с сортировкой, поэтому
  //  этот блок не имеет большого значения, кроме как поддержание соответствия может циклами
  //Дополнение: j2 не будет возвращать 0 для последовательности, инициированной randomize(1), в ином случае, возможно, потребуется дополнительная проверка
  j:=Random(10000);
  j2:=aList.Find(j,,1);
  aList.Insert(j2,j);
EndDo;  

ProfilerStop();
debugbreak;

Message("Done!");
//Для i5, конечные результаты для среднего времени исполнения каждой операции:
//aList.Sort();                   -- 3 сек./1
//j2:=aList.Find(aNum,,1);        -- 30.5 мс./10000
//aList.Add(Random(10000),,,1);   -- 640 мс./10000
//j2:=aList.Find(aNum);           -- 31733 мс./10000
//aList.Insert(j2,j);             -- 690 мс./10000
//
//Как показывает эксперимент, для больших массивов поиск в сортированном массиве имеет очень большое преимущество перед поиском без учета сортировки (1000 раз в нашем случае), 
//  преимущество будет только расти при увеличении количества элементов в массиве
//Сортировка больших массивов работает достаточно медленно, поэтому, в циклах, где происходит одновременное добавление и поиск элементов списка, гораздо выгоднее использовать
//  функцию добавления с сортировкой, нежели множественные вызовы сортировки перед поиском.