Следующая: , Предыдущая: geom, Вверх: Top


2 Обработка числовых последовательностей

Пусть наша программа получает на вход числовую последовательность: конечный ряд действительных чисел. Количество элементов в последовательности неизвестно и может быть очень велико, поэтому сохранение всей последовательности в памяти недопустимо. Программа должна считывать входную последовательность со стандарного ввода до появления признака конца файла, обрабатывать ее и выводить информацию на стандартный вывод.

Организация считывания последовательности

C++
     #include<iostream>
     using namespace std;
     int main()
     {
         double x;
         double sum=0;
         while (cin>>x)
             sum+=x;
         cout<<"Sum: "<<sum<<endl;
         return 0;
     }

В этом примере в переменную sum осуществляется суммирование всех считанных чисел, а очередное число считывается в переменную x. Программа содержит цикл while (cin>>x), который будет выполняться, пока считывание переменной будет успешным.

Питон

Для удобства считывания последовательности строк из файла существует модуль fileinput. Соответствующая программа будет выглядеть следующим образом:

     import fileinput
     sum=0
     for line in fileinput.input():
         x=float(line)
         sum=sum+x
     print "Sum: ",sum

В этом примере сначала подключается модуль fileinput, затем организовывается цикл, в котором переменная line пробегает по всем элементам списка, создаваемого функцией fileinput.input(). Эта функция генерирует список, элементами которого являются строки входного файла. Затем мы в цикле увеличиваем величину переменной sum на величину line, преобразованную к действительному числу при помощи функции float.

Ввод чисел

Запущенная таким образом программа будет считывать числа со стандартного входа, пока стандартный вход не завершится. Для завершения ввода данных необходимо сгенерировать признак конца файла необходимо нажать клавиши <Ctrl>+<D> (в системе Linux), <Ctrl>+<Z> (в системе Windows). Если программа написана на Питоне, то эту клавишу необходимо нажать два раза подряд.

При необходимости можно перенаправить стандартный ввод, читая данные не с клавиатуры, а из файла , например, следующим образом (из файла inputdata):

     $ ./a.out < inputdata
     $ python myprog < inputdata

Индуктивные функции

Функция f, определенная на множестве конечных числовых последовательностей, называется индуктивной, если ее значение на последовательности x1, ..., xn можно восстановить по значению функции f на последовательности x1, ..., xn-1 и по величине xn . Примеры индуктивных функций: сумма всех элементов последовательности, количество элементов в последовательности. А среднее арифметическое всех элементов последовательности не является индуктивной функцией: если мы знаем последний элемент последовательности и среднее арифметическое всех элементов кроме последнего, то вычислить среднее значение исходной последовательности невозможно, поскольку неизвестно общее число элементов в последовательности.

Индуктивные функции можно вычислить за один просмотр массива, сохраняя значение функции в одной переменной (в рассмотренном примере это переменная sum) и вычисляя новое значение функции, используя ее старое значение и считанный элемент последовательности (sum=sum+x).

К сожалению, полезных индуктивных функций не очень много. Но для неиндуктивной функции иногда можно найти ее индуктивное расширение: набор функций, каждую из которых можно вычислить, зная последний элемент последовательности и значение индуктивного расширения на всей последовательности без последнего элемента. Например, для среднего значения всех элементов последовательности индуктивным расширением является сумма всех элементов и их количество.

Упражнения

Для приведенных ниже функций покажите, что они являются индуктивными или имеют индуктивное расширение. Для функций, допускающих это расширение, явно выпишите это расширение на бумаге, задав индуктивное расширение в виде формул. Напишите программы, которые вычисляют заданную функцию за однократное считывание последовательности с конечной памятью.

  1. Наибольший элемент последовательности.
  2. Количество положительных элементов последовательности.
  3. Количество элементов, которые больше предыдущего элемента последовательности.
  4. Количество элементов, равных наибольшему элементу последовательности.
  5. Второй по величине элемент последовательности целых чисел (тот, который будет наибольшим, если из последовательности удалить один элемент с наибольшим значением).
  6. Второй по величине элемент последовательности, если все равные элементы считать за один.
  7. Среднеквадратичное отклонение σ=sqrt(S/(n-1)), где S=(x1-xc)2+...+(xn-xc)2, xc – среднее значение элементов последовательности, n – количество элементов последовательности.
  8. Максимальное число идущих подряд одинаковых элементов.
  9. Максимальная длина неубывающего участка последовательности.
  10. Количество строгих локальных максимумов последовательности (элемент называется строгим локальным максимумом, если он больше всех своих соседей).
  11. Наибольшее расстояние между двумя строгими локальными максимумами.