Programming Taskbook 0
Download 1.62 Mb. Pdf ko'rish
|
Abramyan-Pascal2016-1
- Bu sahifa navigatsiya:
- Вариант 6 (НЕДОПУСТИМЫЙ)
- Range
Глава 3. Массивы и последовательности 41 Скорость выполнения вариантов 4 и 4a будет одинаковой. В качестве еще одного варианта реализации данной программы рас- смотрим следующий: // Вариант 5 var sum := ArrFill(100000000, 1).Select(e -> 2* e).Sum; Print(sum, Milliseconds); Он отличается от варианта 4a только тем, что вместо функции SeqFill используется функция ArrFill. Результат работы программы: 200000000 2211 Время хуже, чем для вариантов 2 и 3 с применением циклов. Таким образом, хотя к массиву допустимо применять запросы (поскольку масси- вы могут быть неявно преобразованы в последовательности), они не дают такого же эффекта ускорения, как при применении к последовательностям. Как мы выяснили, анализируя варианты 2 и 3, цикл for для массивов работает с той же скоростью, что и цикл foreach. Что произойдет, если мы попытаемся использовать цикл for для последовательностей? Для этого необходимы запросы, которые позволили бы определять размер последо- вательности и значение ее i-го элемента. Такие запросы есть: это Count и ElementAt(i) соответственно. Однако их никогда не следует использовать для организации перебора элементов последовательности, поскольку запрос ElementAt(i) работает крайне медленно (и, кроме того, время его работы уве- личивается с увеличением значения индекса i). Поэтому окончания работы следующего варианта программы мы не дождемся 2 : // Вариант 6 (НЕДОПУСТИМЫЙ) var a := SeqFill(100000000, 1).Select(e -> 2 * e); var sum := 0; for var i := 0 to a.Count-1 do sum += a.ElementAt(i); Print(sum, Milliseconds / 1000); Итак, на основе анализа различных вариантов нашей программы мож- но сделать вывод о том, что как массивы, так и последовательности явля- ются эффективным средством обработки данных, однако при работе с ни- ми надо учитывать их особенности. Нетрудно заметить, что программы, использующие последовательности, оказываются чрезвычайно наглядны- ми. В то же время, следует иметь в виду, что нередко алгоритмы, основан- ные на обработке последовательностей, работают медленнее, чем традици- онные алгоритмы, использующие циклы (поскольку программный код с последовательностями сложнее оптимизировать). Кроме того, имеются 2 По приблизительным подсчетам, данный вариант программы выполнялся бы на том же компьютере, на котором запускались предыдущие варианты, более двух лет. 42 группы задач, для решения которых последовательности плохо приспособ- лены (например, из-за очень медленного доступа к элементу по его индек- су). И в первом, и во втором выпуске настоящего пособия все особенности последовательностей мы проиллюстрируем на многочисленных примерах. 3.5. Вывод последовательностей и их генерация. Бесконечные последовательности При описании средств вывода элементов массивов в конце п. 3.2 было отмечено, что многие из этих средств можно использовать не только для массивов, но и для последовательностей. Фактически единственным сред- ством, которым не следует пользоваться для вывода последовательности, является обычный цикл for. Напомним, что для вывода последовательностей можно использовать цикл foreach, процедуры Write/Writeln и Print/Println, а также методы Print/Println. В методах Print/Println, как и в одноименных методах для масси- вов, можно указывать необязательный строковый параметр delim — разде- литель, который будет выводиться между значениями элементов. По умолчанию разделителем считается пробел (исключением является после- довательность символов sequence of char, для которой разделителем по умолчанию всегда считается пустая строка). Изменить разделитель по умолчанию можно, записав его новое значение в системную переменную PrintDelimDefault. При выводе последовательностей в программах, выполняющих зада- ния из электронного задачника Programming Taskbook, следует использо- вать методы Write и WriteAll (метод WriteAll перед выводом элементов допол- нительно выводит размер последовательности). Вместо метода Write можно использовать метод Print, который в данном случае выполняет те же самые действия. В предыдущем пункте мы отмечали, что для генерации последова- тельностей можно использовать функции Seq, SeqFill, SeqGen, SeqRandom- Integer (синоним SeqRandom) и SeqRandomReal. Эти функции аналогичны по своему действию функциям для генерации массивов. Кроме них для по- следовательностей предусмотрены еще две функции-генератора: Range и SeqWhile. Функция Range позволяет задавать диапазоны целых чисел или симво- лов, а также диапазоны равномерно распределенных вещественных чисел. Приведем заголовки трех перегруженных вариантов этой функции: function Range(k1, k2: integer [; step: integer]): sequence of integer function Range(c1, c2: char): sequence of char function PartitionPoints(a1, a2: real; n: integer): sequence of real |
Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling
ma'muriyatiga murojaat qiling