![]() |
|
|
![]()
|
|
| W4FhLF |
|
|||
![]() found myself ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2831 Регистрация: 2.12.2006 Репутация: 5 Всего: 121 |
Привет всем!
Подскажите есть ли способ за O(n) или O(n*logn) вычислить гистограму не имея начального представления о динамическом диапазоне чисел? Добавлено через 14 минут и 29 секунд Не, при этом я не имею ввиду 8битные числа или гигантских объектов памяти (т.е. bins -> singularity). -------------------- "Бог умер" © Ницше "Ницше умер" © Бог |
|||
|
||||
| Abyx |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 601 Регистрация: 3.11.2009 Репутация: нет Всего: 10 |
W4FhLF, всмысле "гистограмму"? всмысле "вычислить"?
Добавлено через 4 минуты и 4 секунды подсчет количества чисел в последовательности чисел? если хранить гистограмму в map (dict) проблем с ДД не будет или входная последовательность из непрерывных чисел? тогда - хз, действительно надо знать ДД чтоб квантовать их. |
|||
|
||||
| Pavia |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 418 Регистрация: 6.12.2008 Репутация: 11 Всего: 12 |
||||
|
||||
| W4FhLF |
|
|||
![]() 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 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 418 Регистрация: 6.12.2008 Репутация: 11 Всего: 12 |
W4FhLF, С оптимизацией под видео карты я незнаком.
Тут вы ошибаетесь. O(n) будет. Один раз чтение для нахождения минимума максимума. Один при занисении в корзину и чтение и запись обратно счетчика корзины. Итого 4 операции с памятью. O(4*n) константа 4 можно занести в O получаем O(n). Это свойство оператора O. Второй вариант это отсортировать числа и пройтись по ним подсчитывая повторы. Это будет O(n*log(n)). O - это асимптотическая оценка. Я её сам не люблю из-за таких выкрутасов. Нас интересует реальная оценки возможности. Так вот если чисел очень много то вариант такой разбить на K групп. Т.е завести К массивов счетчиков. 1 число с первым массивом 2 во втором и тд до к. Потом K+1 будет в 1 и тд. По идее должно ускорить. Дальше сливаем эти массивы-гистограммы в один массив-гистограмму. Возможно надо будет и по другому разбить. Второй вариант применить быструю сортировку. Взять готовую реализацию под видео карту. Она должна сортировать в регистрах. Так как их много. На небольшом числе чисел от 10 до 1000 будет работать, быстро. Без затрат по обращению к памяти. А дальше уже можно порциями сортировать заносить в гистограмму. |
|||
|
||||
| W4FhLF |
|
|||
![]() found myself ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2831 Регистрация: 2.12.2006 Репутация: 5 Всего: 121 |
Да, с оценкой я ошибся. Тоже не люблю эту O
У меня задача не вычислить гистограмму большого объёма данных. Как раз объёмы выборок у меня небольшие. Каждое графическое ядро вычисляет гистограмму своей выборки. Выборка берётся из общей для ядер памяти, в которой расположен большой массив и выборки между ядрами перекрываются, поэтому я не имею права менять расположение элементов в массиве. Алгоритм с перестановками не подходит. Возможно тут подойдёт какой-нибудь рекурсивный алгоритм с постепенным уточнением границ? Я пока себе с трудом это представляю. -------------------- "Бог умер" © Ницше "Ницше умер" © Бог |
|||
|
||||
![]()
|
| Правила форума "Алгоритмы" | |
|
|
Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Алгоритмы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |