Поиск:

Ответ в темуСоздание новой темы Создание опроса
> МОДА 
V
    Опции темы
Golden Hands
Дата 15.5.2006, 21:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Золотой
****


Профиль
Группа: Участник Клуба
Сообщений: 2023
Регистрация: 23.1.2005
Где: Екатеринбург

Репутация: нет
Всего: 83



Сделал на раз - цикл до x + вложенный цикл. Количество итераций = sum[x], которое при x=3000 в моем случае совершенно неприемлимо. Подскажите алгоритм, определяющий моду за один проход.  

Это сообщение отредактировал(а) Golden Hands - 16.5.2006, 14:52


--------------------
Мы обречены... но только на победу!
Настанет день, и мы построим новый дом.
Внесем в него тепло, что сохранить сумели,
И воскресим все то, что в нас когда-то умерло... © Тень Света
PM MAIL ICQ   Вверх
maxim1000
Дата 15.5.2006, 23:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 33
Всего: 110



мода, если мне память не изменяет, это максимум?
максимум ищется за один проход (в переменной надо сохранять параметры текущего максмума) 


--------------------
qqq
PM WWW   Вверх
esperant0
Дата 15.5.2006, 23:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 714
Регистрация: 20.5.2005

Репутация: 4
Всего: 14



Цитата(maxim1000 @ 15.5.2006,  23:32)
мода, если мне память не изменяет, это максимум?
максимум ищется за один проход (в переменной надо сохранять параметры текущего максмума)

мода это элемент встечающийся максимальное число раз 


--------------------
 
 Student->Teacher Assistant ->Research assistant->Microsoft Software Development Engineer 

Пользователь получил наказание за то, что проигнорировал замечание которое было написано модератором  а затем стерто и которое он - пользователь не мог видеть. 
PM MAIL   Вверх
Golden Hands
Дата 16.5.2006, 00:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Золотой
****


Профиль
Группа: Участник Клуба
Сообщений: 2023
Регистрация: 23.1.2005
Где: Екатеринбург

Репутация: нет
Всего: 83



Мода возвращает наиболее часто встречающееся значение в массиве данных. Причем:
1) Если массив не содержит одинаковых значений, мода не может быть подсчитана.
2) Если несколько значений встречаются одинаковое число раз, мода равна тому значению, которое встречается первым. 


--------------------
Мы обречены... но только на победу!
Настанет день, и мы построим новый дом.
Внесем в него тепло, что сохранить сумели,
И воскресим все то, что в нас когда-то умерло... © Тень Света
PM MAIL ICQ   Вверх
maxim1000
Дата 16.5.2006, 00:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 33
Всего: 110



Аааа... я почему-то подумал, что у нас уже массив вероятностей...

Добавлено @ 00:38 
можно попробовать так:
1. сортируем массив - log(n)*n
2. идём по нему, считая длину непрерывной последовательности элементов и сравнивая с наиболее длинной из ранее встреченных 


--------------------
qqq
PM WWW   Вверх
nostromo
Дата 16.5.2006, 09:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 194
Регистрация: 23.3.2006

Репутация: 5
Всего: 10



Можно за один проход (ну почти ;) ).
Постоянно храним и обновляем список встреченных значений, их текущее количество (список частот), а также индекс в списке элемента, который встретился максимальное число раз. 
При обработке очередного элемента обновляем соответствующую ячейку списка частот и проверяем, не побит ли рекорд. 

Можно сказать, что алгоритм работает за один проход только в случае, когда не тратится много времени на поиск нужного элемент в списке частот при обновлении. Напиример, должно хорошо работать, когда различных элементов не очень много, или на множестве элементов есть хорошая хэш-функция. 
--------------------
На пыльных тропинках далеких планет останутся наши следы.
PM MAIL   Вверх
maxim1000
Дата 16.5.2006, 10:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 33
Всего: 110



Цитата(nostromo @  16.5.2006,  08:10 Найти цитируемый пост)
При обработке очередного элемента обновляем соответствующую ячейку списка 

в лучшем случае на это понадобится log(n) - это если хранить в упорядоченном массиве... только тогда добавление будет дольше... 


--------------------
qqq
PM WWW   Вверх
nostromo
Дата 16.5.2006, 11:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 194
Регистрация: 23.3.2006

Репутация: 5
Всего: 10



Цитата

в лучшем случае на это понадобится log(n) - это если хранить в упорядоченном массиве... только тогда добавление будет дольше...


Нет, вычисляем хэш от очередного числа и находим его индекс. Никакого log(n). 
--------------------
На пыльных тропинках далеких планет останутся наши следы.
PM MAIL   Вверх
Mayk
Дата 16.5.2006, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 2
Всего: 134



Цитата(maxim1000 @  16.5.2006,  14:50 Найти цитируемый пост)
в лучшем случае на это понадобится log(n) - это если хранить в упорядоченном массиве... только тогда добавление будет дольше...  

Зачем в массиве?  Есть бинарное дерево поиска. Немного модифицируем - добавим в узел поле count, которое будет указывать сколько раз встречается данный элемент.

Мы можем использовать добавлять элемент из массива бинарное дерево следующим образом:
1) если узла с таким элементом в дереве ещё не было, то он добавляется как в обычное бинарное дерево поиска, и node.count <- 1
2) если узел с таким элементом есть, то мы увеливаем у узла count.


далее проходим по всему дереву и ищем максимум.

 


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
Golden Hands
Дата 16.5.2006, 11:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Золотой
****


Профиль
Группа: Участник Клуба
Сообщений: 2023
Регистрация: 23.1.2005
Где: Екатеринбург

Репутация: нет
Всего: 83



Вот, собстно, что у меня сейчас. Кидаю паскалевский код, т.к. блок-схемы подзабыл  smile 


element - массив исходных значений, count - массив для подсчета числа вхождений элемента.

Код


for i:=1 to High(element) do
  Begin
    t:=element[i];
    for k:=i to High(element) do
      if t:=element[k] then count[i]:=count[i]+1;    // количество вхождений элемента
  End;

Flag:=False;

for i:=1 to High(count) do
  if count[i]<>1 then
    Begin
      Flag:=True;
      Break;
    End;

if Flag=False then ShowMessage('Невозможно подсчитать моду');  //все элементы массива count равны 1

if Flag=True then <цикл определения максимального элемента count и его номера>;




Есть вариант вставить цикл (между 5 и 6 строками в коде), который будет проходить по всему массиву element и разрешать выполнение (строка 6) только в том случае, если текущий элемент не входит в этот массив. Но тогда:
1) Если вхождение установится быстро, то все ОК.
2) Если вхождение установится в самом конце прохода, то получится двойная трата времени, чем было бы без проверки вхождений.  

Это сообщение отредактировал(а) Golden Hands - 16.5.2006, 11:56


--------------------
Мы обречены... но только на победу!
Настанет день, и мы построим новый дом.
Внесем в него тепло, что сохранить сумели,
И воскресим все то, что в нас когда-то умерло... © Тень Света
PM MAIL ICQ   Вверх
sergejzr
Дата 16.5.2006, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 4
Всего: 360



если min/max числа в разумных пределах, можно прямо таблицу составить, где индекс - само число. при каждом последующем числе х увеличиваем на еденицу значение массив[х] и сравниваем с МОД'ом из предидущей итерации.
(В принципе тот же хэш, предложенный nostromo, хо с функцией hash(x)=x) 


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
SoWa
Дата 16.5.2006, 11:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Харекришна
****


Профиль
Группа: Комодератор
Сообщений: 2422
Регистрация: 18.10.2004

Репутация: 6
Всего: 74



Ну ты заврал про кол-во итераций. Их не квадрат...
Цитата(Golden Hands @  16.5.2006,  11:42 Найти цитируемый пост)
if Flag=True then <цикл определения максимального элемента count и его номера>;

Как уже предлагал Mayk, а может я не так понял, создадим новый тип, который будет хранить два значения- сама цифра и кол-во её вхождений в множество. Причем у каждого последующего элемента с одинаковой "цифрой" кол-во её вхождений будет на 1 больше. К примеру: цифра 6 встречалась два раза на момент начала действия,тогда было
6,2;
Появилась еще одна шестерка. И стало
6,2;
6,3;
И далее:
6,2;
6,3;
6,4;
И затем просто ищи максимум среди кол-ва вхождений. 


--------------------
Всем добра smile
PM MAIL ICQ   Вверх
nostromo
Дата 16.5.2006, 11:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 194
Регистрация: 23.3.2006

Репутация: 5
Всего: 10



Цитата(Mayk @ 16.5.2006,  11:37)
Цитата(maxim1000 @  16.5.2006,  14:50 Найти цитируемый пост)
в лучшем случае на это понадобится log(n) - это если хранить в упорядоченном массиве... только тогда добавление будет дольше...  

Зачем в массиве?  Есть бинарное дерево поиска. Немного модифицируем - добавим в узел поле count, которое будет указывать сколько раз встречается данный элемент.

Мы можем использовать добавлять элемент из массива бинарное дерево следующим образом:
1) если узла с таким элементом в дереве ещё не было, то он добавляется как в обычное бинарное дерево поиска, и node.count <- 1
2) если узел с таким элементом есть, то мы увеливаем у узла count.


далее проходим по всему дереву и ищем максимум.


Поиск в бинарном дереве как раз и имеет сложность log(n) 
--------------------
На пыльных тропинках далеких планет останутся наши следы.
PM MAIL   Вверх
Golden Hands
Дата 16.5.2006, 11:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Золотой
****


Профиль
Группа: Участник Клуба
Сообщений: 2023
Регистрация: 23.1.2005
Где: Екатеринбург

Репутация: нет
Всего: 83



SoWa, двумерный масив предлагаешь? Я обдумывал это, сейчас еещ прикину. 


--------------------
Мы обречены... но только на победу!
Настанет день, и мы построим новый дом.
Внесем в него тепло, что сохранить сумели,
И воскресим все то, что в нас когда-то умерло... © Тень Света
PM MAIL ICQ   Вверх
SoWa
Дата 16.5.2006, 12:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Харекришна
****


Профиль
Группа: Комодератор
Сообщений: 2422
Регистрация: 18.10.2004

Репутация: 6
Всего: 74



НЕЕЕ. не двумерный. А вот так:
Код

type CF=record
c: integer;
count: integer;
end

var 
mas: array[1..] of CF;
 


--------------------
Всем добра smile
PM MAIL ICQ   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.0567 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.