Programming Taskbook 0
Download 1.62 Mb. Pdf ko'rish
|
Abramyan-Pascal2016-1
- Bu sahifa navigatsiya:
- var b := new integer[0]; foreach var e in a do if not Odd(e) then begin SetLength(b, b.Length + 1);
- Array54 ); // Вариант 2
- Array54 ); // Вариант 3
Глава 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: |
Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling
ma'muriyatiga murojaat qiling