Programming Taskbook 0
Download 1.62 Mb. Pdf ko'rish
|
Abramyan-Pascal2016-1
- Bu sahifa navigatsiya:
- Array54 ); // Вариант 4a
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. Для поиска в динамических массивах в |
Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling
ma'muriyatiga murojaat qiling