Programming Taskbook 0


Download 1.62 Mb.
Pdf ko'rish
bet63/71
Sana21.06.2023
Hajmi1.62 Mb.
#1644761
TuriУчебное пособие
1   ...   59   60   61   62   63   64   65   66   ...   71
Bog'liq
Abramyan-Pascal2016-1

size = 20000 time = 3 
size = 40000 time = 1 
size = 80000 time = 1 
size = 160000 time = 2 
size = 320000 time = 5 
size = 640000 time = 10 
Конечно, в отношении наглядности вариант со счетчиком заполненно-
сти существенно проигрывает варианту, использующему запросы. 
Если немного отступить от условий задачи, то в последнем варианте 
решения можно обойтись и без запроса ToArray. В этом случае в перемен-
ной b будет сохраняться ссылка не на массив, а на последовательность
содержащую требуемый набор данных: 
Task('Array54'); // Вариант 4a 


104 
var a := ReadArrInteger; 
var b := a.Where(e -> not Odd(e)); 
b.WriteAll; 
Данное решение также будет засчитано как правильное. Однако нам 
не удастся проверить его быстродействие, подставив в программу замера 
времени оператор
var b := a.Where(e -> not Odd(e)); 
При запуске этого варианта мы получим следующий результат: 
size = 20000 time = 3 
size = 40000 time = 0 
size = 80000 time = 0 
size = 160000 time = 0 
size = 320000 time = 0 
size = 640000 time = 0 
Разумеется, это не означает, что в данном варианте алгоритм работает 
менее 1 миллисекунды для исходных массивов любого размера (большего 
20000). Вспомним, что основная особенность запросов, преобразующих 
последовательности, состоит в их отложенном выполнении. Таким обра-
зом, в варианте 4a при формировании последовательности b не выполняет-
ся фактическая обработка исходного массива a: в последовательность b 
лишь записывается «правило», по которому эта обработка будет происхо-
дить впоследствии, когда, например, элементы последовательности будут 
перебираться в цикле foreach или когда последовательность будет преобра-
зована в массив запросом ToArray (как в варианте 4). Понятно, что для за-
писи правила обработки требуется очень мало времени и, главное, это 
время не зависит от размера обрабатываемых массивов.
Замечание. Значение 2, выведенное в первой строке, связано с выпол-
нением некоторых дополнительных действий программы при первом об-
ращении к запросу Where. Если, например, вызвать запрос Where в начале 
программы (применив его к произвольной последовательности и указав 
произвольный предикат), то в выведенном списке все значения time будут 
равны нулю.
5.3.
Поиск в динамических массивах 
В главе 4 мы познакомились с некоторыми запросами, которые можно 
использовать при организации поиска в последовательностях. Это, прежде 
всего, запросы First и Last (и их варианты FirstOrDefault и LastOrDefault) с па-
раметром — лямбда-выражением, а также запросы-квантификаторы (см. 
п. 4.1). Можно считать, что специализированный поиск выполняют и агре-
гирующие запросы Max и Min (и их варианты MaxBy, MinBy, LastMaxBy, Last-
MinBy), также описанные в п. 4.1. Для поиска в динамических массивах в 


Download 1.62 Mb.

Do'stlaringiz bilan baham:
1   ...   59   60   61   62   63   64   65   66   ...   71




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling