Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Гистограмма 
:(
    Опции темы
W4FhLF
Дата 8.8.2010, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


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

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



Привет всем!

Подскажите есть ли способ за O(n) или O(n*logn) вычислить гистограму не имея начального представления о динамическом диапазоне чисел?

Добавлено через 14 минут и 29 секунд
Не, при этом я не имею ввиду 8битные числа или гигантских объектов памяти (т.е. bins -> singularity). 


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
Abyx
Дата 8.8.2010, 17:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



W4FhLF, всмысле "гистограмму"? всмысле "вычислить"?

Добавлено через 4 минуты и 4 секунды
подсчет количества чисел в последовательности чисел?

если хранить гистограмму в map (dict) проблем с ДД не будет
или входная последовательность из непрерывных чисел? тогда - хз, действительно надо знать ДД чтоб квантовать их.
PM MAIL   Вверх
Pavia
Дата 8.8.2010, 17:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 11
Всего: 12



Цитата(W4FhLF @  8.8.2010,  16:30 Найти цитируемый пост)
 динамическом диапазоне чисел?

А как это связанно с вычислением гистограммы?

Цитата(W4FhLF @  8.8.2010,  16:30 Найти цитируемый пост)
Подскажите есть ли способ за O(n) или O(n*logn) вычислить гистограму 

Да. Даже два один за O(n) второй за O(n*log(n))

Это сообщение отредактировал(а) Pavia - 8.8.2010, 17:57
PM MAIL   Вверх
W4FhLF
Дата 9.8.2010, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


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

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



Извиняюсь, если непонятно выразился. Попробую объяснить.

Числа на самом деле обычные float или double. Работаю я на графическом процессоре и никакие map и другие сложные структуры данных использовать нецелесообразно. Отсюда в общем-то и требование O(n), потому что любое обращение к памяти отжирает приличный кусок от производительности алгоритма в целом, ради которой собственно всё и делается.

Pavia, ну как я себе представляю простейший случай. Ищем max и min в выборке за O(n), далее разбиваем полученный динамический диапазон на заданной число корзин: (max - min) / n и потом "раскладываем" числа по корзинам. Явно не O(n*logn) и тем более не O(n).

Цитата(Pavia @  8.8.2010,  17:52 Найти цитируемый пост)
Да. Даже два один за O(n) второй за O(n*log(n))


Буду рад выслушать твои варианты. ;) 




--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
Pavia
Дата 9.8.2010, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 11
Всего: 12



W4FhLF, С оптимизацией под видео карты я незнаком.


Цитата(W4FhLF @  9.8.2010,  11:37 Найти цитируемый пост)
ну как я себе представляю простейший случай. Ищем max и min в выборке за O(n), далее разбиваем полученный динамический диапазон на заданной число корзин: (max - min) / n и потом "раскладываем" числа по корзинам. Явно не O(n*logn) и тем более не O(n).

Тут вы ошибаетесь. O(n) будет. 
Один раз чтение для нахождения минимума максимума. Один при занисении в корзину и чтение и запись обратно счетчика корзины. Итого 4 операции с памятью. O(4*n) константа 4 можно занести в O получаем O(n). Это свойство оператора O.

Второй вариант это отсортировать числа и пройтись по ним подсчитывая повторы. Это будет O(n*log(n)).

O - это асимптотическая оценка. Я её сам не люблю из-за таких выкрутасов. Нас интересует реальная оценки возможности.

Так вот если чисел очень много то вариант такой разбить на K групп. Т.е завести К массивов счетчиков.  1 число с первым массивом 2 во втором и тд до к. Потом K+1 будет в 1 и тд. По идее должно ускорить. Дальше сливаем эти массивы-гистограммы в один массив-гистограмму.
Возможно надо будет и по другому разбить.

Второй вариант применить быструю сортировку. Взять готовую реализацию под видео карту. Она должна сортировать в регистрах. Так как их много. На небольшом числе чисел от 10 до 1000 будет работать, быстро. Без затрат по обращению к памяти. А дальше уже можно порциями сортировать заносить в гистограмму.

PM MAIL   Вверх
W4FhLF
Дата 9.8.2010, 13:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


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

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



Да, с оценкой я ошибся. Тоже не люблю эту O smile

У меня задача не вычислить гистограмму большого объёма данных. Как раз объёмы выборок у меня небольшие.  Каждое графическое ядро вычисляет гистограмму своей выборки. Выборка берётся из общей для ядер памяти, в которой расположен большой массив и выборки между ядрами перекрываются, поэтому я не имею права менять расположение элементов в массиве. Алгоритм с перестановками не подходит. 

Возможно тут подойдёт какой-нибудь рекурсивный алгоритм с постепенным уточнением границ? Я пока себе с трудом это представляю. 


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

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


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

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


 




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


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

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