Нахождение максимума

Алгоритмы: от сортировки пузырьком до численных методов

Модераторы: C_O_D_E, DeeJayC

Ответить
Хыиуду
Сообщения: 2442
Зарегистрирован: 06 мар 2005, 21:03
Откуда: Москва
Контактная информация:

Приближается сессия - начинается новый наплыв школьников и студентов в разделе "Решите мне задачку". Функция нахождения максимума в одномерном массиве А[1..N]:

Код: Выделить всё

function max(A:array of integer):integer;
var i:byte; maxi:byte;
begin
  maxi:=1;
  for i:=2 to N do
    if A[i]>A[maxi] then maxi:=i;
  max:=maxi;
end;
Функции передается массив, она возвращает индекс максимального элемента. Сам максимальный элемент - А[max(A)].
То же самое для двухмерного массива A[1..N,1..M]:

Код: Выделить всё

type pair=record
    i,j:integer;
end;
function max(A:array of array of integer) :p air;
var i,j:byte; maxi,maxj:byte; result :p air;
begin
  maxi:=1;
  maxj:=1;
  for i:=2 to N do
  for j:=2 to N do
    if A[i,j]>A[maxi,maxj] then begin maxi:=i; maxj:=j; end;
  result.i:=maxi;
  result.j:=maxj;
  max:=result;
end;
Поскольку Паскаль не может возвращать два значения из одной функции, вводится тип pair - запись с полями i,j. Функция возвращает переменную типа pair, у которой поле i соответствует абсциссе максимального значения, а поле j - ординате. Сам максимальный элемент - A[max(A).i, max(A).j]
При использовании этого второго варианта описание типа pair тоже нужно скопировать себе в программу (как показала практика, некоторые этого не знают)
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

Хыиуду, все это хорошо, но

- переменная N не определена, вместо нее советую ставить High(A) которая возвратит индекс последнего элемента массива
- массивы желательно передавать по ссылке через Var, т.к. при больших массивах будут сильные тормоза и может крякнуть стек (Stack overflow)
It's a long way to the top if you wanna rock'n'roll
Хыиуду
Сообщения: 2442
Зарегистрирован: 06 мар 2005, 21:03
Откуда: Москва
Контактная информация:

Логично. Я здесь имел в виду, что N задана константой, а первый элемент имеет индекс 1. В противном случае вообще писать придется так:
maxi:=low(A);
for i:=low(A) to high(A) do
...
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
Аватара пользователя
Начинающая
Сообщения: 15
Зарегистрирован: 16 апр 2007, 15:38

Хыиуду писал(а):Функции передается массив, она возвращает индекс максимального элемента. Сам максимальный элемент - А[max(A)].
То же самое для двухмерного массива A[1..N,1..M]:

Код: Выделить всё

type pair=record
    i,j:integer;
end;
function max(A:array of array of integer) :p air;
var i,j:byte; maxi,maxj:byte; result :p air;
begin
  maxi:=1;
  maxj:=1;
  for i:=2 to N do
  for j:=2 to N do
    if A[i,j]>A[maxi,maxj] then begin maxi:=i; maxj:=j; end;
  result.i:=maxi;
  result.j:=maxj;
  max:=result;
end;
Поскольку Паскаль не может возвращать два значения из одной функции, вводится тип pair - запись с полями i,j. Функция возвращает переменную типа pair, у которой поле i соответствует абсциссе максимального значения, а поле j - ординате. Сам максимальный элемент - A[max(A).i, max(A).j]
а это подойдет для задачи. где нужно найти номер строки и столбца двумерного массива для мах элемента этого массива?
Аватара пользователя
Oleg_Rus
Сообщения: 335
Зарегистрирован: 16 окт 2006, 09:56
Откуда: г.Улан-Удэ, респ.Бурятия, Российская Федерация
Контактная информация:

а если количество таковых максимумов больше 1? например 2. и надо найти индекс первого, ведь во многих задачах вопрос так и стоит.

можно просто обратить цикл, предложенный Хыиуду
for i:=n-1 donto 1 do
if a>a[maxi] then maxi:=i;

или можно через цикл repeat
i:=n;
Repeat
if a>a[maxi] then maxi:= i;
dec(i);
until i>1;
e-mail: garmayev@yandex.ru
---------------------------------------------------------------------------
<a href="http://nick-name.ru/sertificates/711965/"><img src="http://nick-name.ru/img.php?nick=Garmay ... =2&text=t5" alt="Никнейм Garmayev зарегистрирован!" /></a>
Аватара пользователя
Oleg_Rus
Сообщения: 335
Зарегистрирован: 16 окт 2006, 09:56
Откуда: г.Улан-Удэ, респ.Бурятия, Российская Федерация
Контактная информация:

собственно тут и до минимума рукой подать:

for i:=1 to n do
if a<a[maxi] then maxi:= i;
e-mail: garmayev@yandex.ru
---------------------------------------------------------------------------
<a href="http://nick-name.ru/sertificates/711965/"><img src="http://nick-name.ru/img.php?nick=Garmay ... =2&text=t5" alt="Никнейм Garmayev зарегистрирован!" /></a>
Хыиуду
Сообщения: 2442
Зарегистрирован: 06 мар 2005, 21:03
Откуда: Москва
Контактная информация:

начинающая писал(а):а это подойдет для задачи. где нужно найти номер строки и столбца двумерного массива для мах элемента этого массива?
это и называется "найти максимум"
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
DeeJayC
Сообщения: 497
Зарегистрирован: 17 фев 2004, 11:26
Откуда: Ленинград (который Город на Неве)
Контактная информация:

cat | sort | head -1
"Особое внимание начинающих аквариумистов хотим обратить на то, что рыбки никогда не спят на спинке!" (c)

viel spass, DeeJayC
Хыиуду
Сообщения: 2442
Зарегистрирован: 06 мар 2005, 21:03
Откуда: Москва
Контактная информация:

Поднимаю. Слишком часто на эту тему приходится ссылаться.
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
ruifut
Сообщения: 1
Зарегистрирован: 28 июл 2009, 03:09

Здравтсвйте
Интересует меня такая тема, как задержка дыхания под водой
В бассейне могу переплыть 25 м. Хочу больше
Кто знает, есть ли методики дыхалки для максимального нахождения под водой?

з.ы. Вообще интересует все, что связано с дыханием...
Спасибо
а кстати не сочтите за рекламу друг пригласил в новую онлайн игру http://netassault.ru - это даже не игра, netassault.ru - просто бомба ;)
Ответить