Programming Taskbook 0


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


Глава 5. Дополнительные средства обработки массивов 
101 
for var k := 1 to 6 do 
begin 
size *= 2;
var a := ArrRandom(size); 
MillisecondsDelta; 
// начало алгоритма 
var b := new integer[0]; 
foreach var e in a do 
if not Odd(e) then 
begin 
SetLength(b, b.Length + 1); 
b[b.Length - 1] := e; 
end; 
// конец алгоритма 
WritelnFormat('size = {0,6} time = {1,6}', size, 
MillisecondsDelta); 
end; 
В данном случае для измерения времени использовалась функция Milli-
secondsDelta. Ее отличие от уже известной нам функции Milliseconds (см. 
п. 3.4) состоит в том, что функция MillisecondsDelta возвращает время (в 
миллисекундах), прошедшее с момента последнего вызова этой же функ-
ции (при первом вызове функции MillisecondsDelta, как и при вызове Milli-
seconds, возвращается время, прошедшее с момента начала работы про-
граммы). Обратите внимание на то, что первый из двух вызовов функции 
MillisecondsDelta имеет вид вызова процедуры, поскольку в данном случае 
нам не требуется возвращаемое значение: мы лишь «помечаем» начало то-
го участка программы, время работы которого требуется измерить. 
Полужирным шрифтом выделен фрагмент, для которого подсчитыва-
ется время работы. Приведем возможный результат выполнения програм-
мы (напомним, что программу следует запускать в режиме релиза — см. 
замечание в п. 3.4): 
size = 20000 time = 36 
size = 40000 time = 147 
size = 80000 time = 1483 
size = 160000 time = 8682 
size = 320000 time = 39110 
size = 640000 time = 147069 
Мы видим что, время растет с большей скоростью, чем размер size.
Алгоритм можно записать короче, если использовать операцию + для 
массивов: 
Task('Array54'); // Вариант 2 


102 
var a := ReadArrInteger; 
var b := new integer[0]; 
foreach var e in a do 
if not Odd(e) then 
b := b + Arr(e); 
b.WriteAll; 
В этом решении мы в цикле добавляем к массиву b одноэлементный 
массив, содержащий элемент e. Быстродействие у данного варианта реше-
ния будет таким же, как и у предыдущего. 
Теперь рассмотрим вариант решения, не требующий многократного 
выделения памяти и копирования элементов: 
Task('Array54'); // Вариант 3 
var a := ReadArrInteger; 
var b := new integer[a.Length]; 
var m := 0; 
foreach var e in a do 
if not Odd(e) then 
begin 
b[m] := e; 
m += 1; 
end; 
SetLength(b, m);
b.WriteAll; 
В этом варианте для массива b сразу выделяется наибольший возмож-
ный размер (совпадающий с размером исходного массива). Кроме того, 
вводится переменная m, определяющая «заполненность» массива b реаль-
ными элементами, полученными из a. В начале алгоритма заполненность 
равна 0. В цикле четные элементы добавляются в конец заполненной части 
массива и одновременно увеличивается m. После завершения цикла оста-
нется уменьшить размер массива b, оставив в нем только заполненную 
Download 1.62 Mb.

Do'stlaringiz bilan baham:
1   ...   57   58   59   60   61   62   63   64   ...   71




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