Difference between revisions of "List.Find"
(No difference)
|
Revision as of 21:41, 3 December 2020
| Find (Поиск значения) | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| |||||||||||
Функция производит поиск указанного значения в списке, начиная с определенной позиции (если указана), список может быть предварительно сортирован по значениям по неубыванию для увеличения скорости поиска.
Синтаксис
List.Find(<Значение>,<Начальный индекс поиска (INT)>,<Сортировка (INT)>=0):<Позиция найденного значения или ноль (INT)>
Аргументы
<Значение>- Значение, которое необходимо найти.<Начальный индекс поиска (INT)>- Индекс (позиция) значения, начиная с которого будет осуществляться поиск (поиск продолжается до конца списка).<Сортировка (INT)>=0- (необязательный аргумент) Возможные значения 0 и 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 раз в нашем случае),
// преимущество будет только расти при увеличении количества элементов в массиве
//Сортировка больших массивов работает достаточно медленно, поэтому, в циклах, где происходит одновременное добавление и поиск элементов списка, гораздо выгоднее использовать
// функцию добавления с сортировкой, нежели множественные вызовы сортировки перед поиском.