Решение задач первого класса

Классы задач по обработке массивов

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

Классы задач:

1) однотипная обработка всех или указанных элементов массива;

2) задачи, в результате решений которых изменяется структура (порядок следования элементов) массива;

3) обработка нескольких массивов одновременно. Сюда же относятся задачи, когда по-разному обрабатываются подмассивы одного и того же массива;

4) поисковые задачи для массивов.

Решение задач первого класса

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

Пример 1. Найти сумму (произведение) элементов одномерного массива.

Решение. Каждый элемент массива прибавляется к сумме s=s+a[i] или умножается на произведение предыдущих элементов массива p=p*a[i]. Поскольку требуется перебрать все элементы массива, можно выбрать схему перебора элементов по одному, двигаясь с начала или с конца массива.

{сумма элементов массива} {произведение элементов массива}

s=0; p=1;

i=0; i=n;

while (i<n) while( i>=0)

{ {

s=s+a[i]; p=p*a[i];

i=i+1; i=i-1;

} }

Пример 2. Подсчитать количество элементов массива, совпадающих по величине с заданным.

Решение. В этой задаче исходными данными являются одномерный массив и некоторое число, которое обозначим Х. Для ответа на вопрос задачи нужно каждый элемент массива сравнить с заданным. Если они совпадут, то счетчик совпавших элементов нужно увеличить на единицу. Поскольку нужно сравнить каждый элемент, то нужно выбрать схему перебора по одному элементу. В приведенном здесь решении выбрана схема перебора по одному от последнего элемента к первому. Ответ задачи будет храниться в счетчике совпавших элементов. Исходя из приведенных рассуждений, можно предложить такой вариант решения:

s=0;

for (i=n-1; i>=0; i--)

if (a[i] = =x) s++;

Пример 3. Найти максимальный элемент одномерного массива.

Решение. В этой задаче «действующие лица» - одномерный массив и его максимальный элемент. Одномерный массив является исходным данным, а максимальный элемент - результатом. Максимальный элемент массива будем хранить в переменной max. Для его поиска достаточно каждый элемент массива сравнить с max (max<a[i]). Начальным значением максимального элемента может быть значение произвольного элемента массива, чаще всего для этой цели выбирают первый элемент. Исходя из этих соображений, получаем следующий фрагмент программы:

const int n=10;

int[] a =new int[n]; //исходный массив

int i; //индекс массива

int max; //максимальный элемент массива

max=a[0];

for (i=1; i< n; i++)

if (max<a[i] ) max=a[i];

Console.WriteLine(«Максимальный элемент массива = »+max);

 

Пример 4. Найти номер максимального элемента массива.

Решение. В задаче используются понятия массива и номера максимального элемента. Обозначим массив так же, как в предыдущих примерах: номер текущего элемента массива будем обозначать i, а номер максимального элемента - kmax. Как обычно, для определения максимального элемента нужно сравнить каждый элемент с максимальным. В выбранных обозначениях такое сравнение запишется так: if (a[kmax]<a[i]) kmax =i. Поскольку нужно просмотреть все элементы массива, то, выбрав подходящую схему перебора, например, перебор по одному от первого элемента к последнему, получим следующее решение задачи. Здесь начальное значение номера максимального элемента выбрано равным 0, но оно может быть любым от 0 до n-1.

kmax =0;

for (i=1; i< n; i++)

if (a[kmax]<a[i]) kmax =i;

Console.WriteLine(«Номер максимального элемента массива »+kmax);

 

Другие решения задачи можно получить, если выбрать другие схемы перебора элементов в массиве. Выберем, например, схему перебора элементов по одному, двигаясь от обоих концов массива к середине. Обозначим через i номера начальных элементов массива, а через j - номера последних элементов массива. Для поиска максимального элемента нужно сравнить все элементы между собой. В данном случае будем сравнивать i-й и j-й элементы и изменять значение индекса для того элемента, который оказался меньше. По окончании просмотра оба индекса будут указывать на один и тот же элемент, он и будет являться максимальным.

i=0; j=n-1;

while (i<j)

if (a[i]<a[j])

i=i+1;

else j=j-1;

Console.WriteLine(«Максимальный элемент массива = »+ a[i]);

Console.WriteLine(«Номер максимального элемента массива »+j)

Пример 5. Подсчитать количество элементов массива, совпадающих по величине с максимальным.

Решение. Одним из очевидных решений будет сведение этой задачи к уже решенным. Найти максимальный элемент можно с помощью алгоритма, приведенного в примере3. Затем, воспользовавшись алгоритмом примера2, можно подсчитать количество элементов массива, совпадающих по величине с максимальным. Такой подход требует двойного просмотра массива. Его реализация приведена ниже:

max=a[0];

for (i=1; i< n; i++)

if (max<a[i]) max=a[i];

s=0;

for (i=0; i< n; i++)

if (a[i] = =max) s+=1;

Сравнив два цикла в приведенном решении, заметим, что их можно объединить в один, увеличив скорость работы алгоритма.

max=a[0]; s=1; /* один совпавший с текущим максимальным уже есть, это a[1]*/

for (i=1; i< n; i++)

if (max<a[i])

{ //найден новый кандидат на максимум

max=a[i];

s=1;

}

else if (max= =a[i]) s+=1;