![]() |
|
|
![]()
|
|
| HalkaR |
|
|||
![]() Пуфыстый назгул ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2132 Регистрация: 8.12.2002 Где: В Москве Репутация: нет Всего: 42 |
Есть массив ( вмоем случае трехмерный, но не в этом суть). В нем необходимо найти определенное количество минимальных элементов (процент). И обнулить их.
Как это можно сделать с минимальными затратами ресурсов? Массив в моем случае 512*512*3 of double. |
|||
|
||||
| Akina |
|
|||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 20 Всего: 454 |
Вероятно надо использовать сортировку и потом уже отбор и обнуление. Причем часть методов сортировки позволяют не доводить сортировку до конца (достаточно отобрать требуемый процент минимальных либо максимальных), к тому же в зависимости от заданного процента более эффективно сортировать с бОльших либо с мЕньших...
PS. Несколько проще, если все элементы - заведомо положительные. -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
| HalkaR |
|
|||
![]() Пуфыстый назгул ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2132 Регистрация: 8.12.2002 Где: В Москве Репутация: нет Всего: 42 |
Нет, элементы есть и отрицательные. И вообщето необходимо обнулять не минимальные, а ближайшие к нулю по модулю.
|
|||
|
||||
| cardinal |
|
|||
![]() Инженер ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6003 Регистрация: 26.3.2002 Где: Германия Репутация: 5 Всего: 99 |
Я бы сделал так:
1. По проценту вичисляешь сколько элементов будет в новом массиве t = (процент/100)*512*512*3 2. Создаешь массив x (double) этого размера 3. Записываешь туда первые t чисел 4. сортируешь x по порядку уменьшения 6. n=0, t++ 6. если t+n число меньше самого большого (первого в массиве), то заменяешь это число t+n-ым числом 4. сортируешь x по порядку уменьшения (методом: менять местами рядом стоящие элементы массива, пока x[y] < x[y+1]) 8. n++ 9. продолжаешь в 6. По массиву 512*512*3 надо идти не в цикле по принципу [x][y][z], а прибавляя к указателю 8 (если не ошибаюсь). -------------------- Немецкая оппозиция потребовала упростить натурализацию иммигрантов В моем блоге: Разные истории из жизни в Германии "Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино". А. и Б. Стругацкие |
|||
|
||||
| Akina |
|
||||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 20 Всего: 454 |
HalkaR
т.е. фактически сортировать надо не элементы массива, а их абс. величины. впрочем пофиг. cardinal
если процент более 50 - то брать есссно 100-процент... (above) - т.о. наибольшее время поиска таким методом - при процент около 50... HalkaR на такого размера массиве прекрасно работает quicksort. Размер массива - порядка 6 Мб, не разговор... впрочем если нет проблем по памяти, лучше имхо использовать сортировку двоичным деревом... см. http://algolist.manual.ru/sort/faq/q7.php и http://algolist.manual.ru/sort/faq/q8.php -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
||||
|
|||||
| Guest |
|
|||
|
Unregistered |
Находишь элемент который занимает место на 10 проценте(10 месте из 100) все остальные делишь+умножаешь на него.
|
|||
|
||||
| sergejzr |
|
|||
![]() Un salsero Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: 4 Всего: 360 |
2Cardinal
Алтернатива: путём бинарного поиска находим "место" елемента t+n в массиве x. Потом сдвигаем весь массив влево (если слева большие числа). пункт 7 тогда отпадает.. 2Akina Обычный инженерный подход - исползовать 100% работающую компоненту (сортировку). Но возможность использования сортировки думаю была всем понятна с самого начала. Алгоритмом однако является именно то, что предложил Cardinal. Это сообщение отредактировал(а) sergej.z - 22.4.2004, 00:25 |
|||
|
||||
| Akina |
|
|||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 20 Всего: 454 |
sergej.z
Осмелюcь возразить - речь идет об ОПТИМАЛЬНОМ РЕШЕНИИ задачи. Алгоритм cardinal, вне всякого сомнения, решает именно нужную задачу - но заведомо неоптимально... o(n*n) и o(n*Log(n)) - вещи суть разные... -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
| cardinal |
|
||||
![]() Инженер ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6003 Регистрация: 26.3.2002 Где: Германия Репутация: 5 Всего: 99 |
Akina, это правильное замечание.
Насчет этого подумаем... -------------------- Немецкая оппозиция потребовала упростить натурализацию иммигрантов В моем блоге: Разные истории из жизни в Германии "Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино". А. и Б. Стругацкие |
||||
|
|||||
| HalkaR |
|
|||
![]() Пуфыстый назгул ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2132 Регистрация: 8.12.2002 Где: В Москве Репутация: нет Всего: 42 |
Попробуем все.
|
|||
|
||||
| cardinal |
|
|||
![]() Инженер ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6003 Регистрация: 26.3.2002 Где: Германия Репутация: 5 Всего: 99 |
Ну тогда и думать не надо. HalkaR нам потом все, что ему profiler сказал, расскажет
-------------------- Немецкая оппозиция потребовала упростить натурализацию иммигрантов В моем блоге: Разные истории из жизни в Германии "Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино". А. и Б. Стругацкие |
|||
|
||||
| HalkaR |
|
||||||
![]() Пуфыстый назгул ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2132 Регистрация: 8.12.2002 Где: В Москве Репутация: нет Всего: 42 |
Быстрая сортировка очень хорошо показала себя. Для массива порядка 512*512*3 элементов of double время сортировки несколько секунд.
Кардинал, твой алгоритм хорош, но больше всего времени отнимает пункт 4, поскольку я нашел хороший метод сортировки разница между твоим алгоритмом и чистой быстрой сортировкой очень маленькая (с секундомером не стоял, но мелочь). Вобщем я взял почти неизменный алгоритм с algolist. НО.
|
||||||
|
|||||||
| cardinal |
|
||||
![]() Инженер ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6003 Регистрация: 26.3.2002 Где: Германия Репутация: 5 Всего: 99 |
Это бы на asm переписать надо. compGT по крайней мере надо сделать inline.
Это примерно как? quickSort это конечно жорошо, но... как бы так cказать... Плохо вобщем -------------------- Немецкая оппозиция потребовала упростить натурализацию иммигрантов В моем блоге: Разные истории из жизни в Германии "Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино". А. и Б. Стругацкие |
||||
|
|||||
| HalkaR |
|
||||
![]() Пуфыстый назгул ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2132 Регистрация: 8.12.2002 Где: В Москве Репутация: нет Всего: 42 |
Не намного быстрее. Выигрыш в пару секунд мне сейчас не так важен, как достаточно простой код. Сортировку все равно не выкинешь.
А асма я и не знаю, да и не надо мне. Сейчас меня вполне удовлетворяет скорость работы программы.
|
||||
|
|||||
| cardinal |
|
||||
![]() Инженер ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6003 Регистрация: 26.3.2002 Где: Германия Репутация: 5 Всего: 99 |
B это в том случае если
или в этом случае:
тоже? А inline попробовал? Время ты profiler'ом мереешь или секундомером? -------------------- Немецкая оппозиция потребовала упростить натурализацию иммигрантов В моем блоге: Разные истории из жизни в Германии "Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино". А. и Б. Стругацкие |
||||
|
|||||
| HalkaR |
|
|||
![]() Пуфыстый назгул ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2132 Регистрация: 8.12.2002 Где: В Москве Репутация: нет Всего: 42 |
Это в первом случае.
Во втором все нормально. Время замеряю на глаз - мне разница в долях секунды не важна. |
|||
|
||||
| cardinal |
|
||||
![]() Инженер ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6003 Регистрация: 26.3.2002 Где: Германия Репутация: 5 Всего: 99 |
Странно...
А если функцию
переписать в
-------------------- Немецкая оппозиция потребовала упростить натурализацию иммигрантов В моем блоге: Разные истории из жизни в Германии "Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино". А. и Б. Стругацкие |
||||
|
|||||
| HalkaR |
|
|||
![]() Пуфыстый назгул ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2132 Регистрация: 8.12.2002 Где: В Москве Репутация: нет Всего: 42 |
бесполезно
|
|||
|
||||
| cardinal |
|
|||
![]() Инженер ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6003 Регистрация: 26.3.2002 Где: Германия Репутация: 5 Всего: 99 |
Ну что-то я ничего не понимаю. Ты же сам как бы подтвердил, что проблема именно в abs. Значит дело вот в этой функции... Вот нонсенс...
... О, доперло! Пиши так:
У тебя же double, а не int - соответственно fabs, а не abs -------------------- Немецкая оппозиция потребовала упростить натурализацию иммигрантов В моем блоге: Разные истории из жизни в Германии "Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино". А. и Б. Стругацкие |
|||
|
||||
| HalkaR |
|
|||
![]() Пуфыстый назгул ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2132 Регистрация: 8.12.2002 Где: В Москве Репутация: нет Всего: 42 |
cardinal , СПАСИБО!!!!!!!!!!
|
|||
|
||||
![]()
|
| Правила форума "Алгоритмы" | |
|
|
Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Алгоритмы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |