в массиве определить количество его одинаковых элементов

Форум для изучающих FPC и их учителей.

Модератор: Модераторы

в массиве определить количество его одинаковых элементов

Сообщение Skrripa » 08.04.2011 00:42:20

Дан целочисленный массив размера N. Найти максимальное количество его одинаковых элементов.

некоем образом не получается
Skrripa
незнакомец
 
Сообщения: 2
Зарегистрирован: 26.02.2011 16:20:25

Re: в массиве определить количество его одинаковых элементов

Сообщение informat » 08.04.2011 06:33:38

А какими пробовали?

Способ "в лоб", не эффективный (сложность N*N):
Берём элементы заданного массива и считаем сколько раз они встречались. Помним максимум этого количества.
После окончания этот максимум и есть ответ.

Способ сложности N+NlogN:
1. Сортируем заданный массив.
2. Считаем максимум длин цепочек из одинаковых элементов - это и есть ответ.

Есть и более эффективные способы. Особенно в частных случаях. Например, если в массиве только 0 и 1, достаточно одного прохода.
Аватара пользователя
informat
новенький
 
Сообщения: 62
Зарегистрирован: 27.10.2010 09:44:20
Откуда: http://informat.name

Re: в массиве определить количество его одинаковых элементов

Сообщение vada » 08.04.2011 09:48:27

А я беру, например, Постгес. Создаю БД и таблицу. Заполняю таблицу элементами данного массива, причем, поле в которое этот массив закачиваю - есть primary key. Сколько раз exception получу, столько и одинаковых элементов+1.
:D
Аватара пользователя
vada
энтузиаст
 
Сообщения: 691
Зарегистрирован: 14.02.2006 13:43:17

Re: в массиве определить количество его одинаковых элементов

Сообщение Oleg_D » 10.05.2011 18:40:35

Организуем односвязный список с элементами следующей структуры:
type
PRec = ^TRec;
TRec = record
mNumber : integer; // число из массива
mCount : integer; // счетчик вхождений
mNext : PRec; // поле связи
end;

Далее проходим по массиву (1 раз!) и формируем список так, чтобы при повторниях одинаковых чисел наращивался только счетчик mCount. Осталось лишь пробежать по списку и выбрать максимальный mCount.
По сути список здесь выполняет роль множества особого рода. Эффективней, но немного сложнее, - организовать такое множество через бинарное дерево.
---
Аналогичная задача решена в главе 55 книги Песни о Паскале
Oleg_D
постоялец
 
Сообщения: 391
Зарегистрирован: 09.05.2011 11:28:36

Re: в массиве определить количество его одинаковых элементов

Сообщение Oleg_D » 12.05.2011 18:35:50

Вот самый быстрый, но прожорливый по памяти способ (сложнось линейная)
------------------------
const CSize = ...; // размер массива

var
Numbers: array [0...CSize] of integer; // обрабатываемый массив
Counts: array [0...MaxInt] of integer; // массив счетчиков
i, max : integer;

begin
FillChar(Counts, SizeOf(Counts), 0); // очистка счетчиков
for i:=0 to CSize-1 do Inc( Counts[ Numbers[i] ] ); // накопление счетчиков (число в массиве - это индекс счетчика)
// Осталось пробежаться по массиву Counts и выбрать максимальное значение
max:= MinInt; // ноль или минимальное целое
for i:=0 to MaxInt-1 do if max < Counts[i] then max := Counts[i];
end.
------------------------
На ошибки не проверял.
Oleg_D
постоялец
 
Сообщения: 391
Зарегистрирован: 09.05.2011 11:28:36

Re: в массиве определить количество его одинаковых элементов

Сообщение informat » 13.05.2011 09:40:47

Oleg_D писал(а):Вот самый быстрый, но прожорливый по памяти способ (сложнось линейная)
------------------------
const CSize = ...; // размер массива

var
Numbers: array [0...CSize] of integer; // обрабатываемый массив
Counts: array [0...MaxInt] of integer; // массив счетчиков
i, max : integer;

begin
FillChar(Counts, SizeOf(Counts), 0); // очистка счетчиков
for i:=0 to CSize-1 do Inc( Counts[ Numbers[i] ] ); // накопление счетчиков (число в массиве - это индекс счетчика)
// Осталось пробежаться по массиву Counts и выбрать максимальное значение
max:= MinInt; // ноль или минимальное целое
for i:=0 to MaxInt-1 do if max < Counts[i] then max := Counts[i];
end.
------------------------
На ошибки не проверял.


А куда считаются отрицательные числа?
Как будет работать программа для массива:
1 -30000 30000 -30000
?
Аватара пользователя
informat
новенький
 
Сообщения: 62
Зарегистрирован: 27.10.2010 09:44:20
Откуда: http://informat.name

Re: в массиве определить количество его одинаковых элементов

Сообщение Oleg_D » 13.05.2011 13:16:25

informat писал(а):А куда считаются отрицательные числа?
Как будет работать программа для массива:
1 -30000 30000 -30000 ?

-----------
const
CSize = ...
CMinNumber = ...
CMaxNumber = ...
var
Numbers: array [0...CSize] of integer; // обрабатываемый массив
Counts: array [CMinNumber...CMaxNumber] of integer; // массив счетчиков
и т.д. ...
------------
Знаки индексов в массиве могут быть любыми.
Идея, конечно, дурацкая, но в принципе - рабочая, если (CMaxNumber-CMinNumber) не слишком велико.
Oleg_D
постоялец
 
Сообщения: 391
Зарегистрирован: 09.05.2011 11:28:36


Вернуться в Обучение Free Pascal

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 20

Рейтинг@Mail.ru