Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Быстрый способ сгруппировать значения std::map
|
|||
|---|---|---|---|
|
#18+
Добрый день. Есть такие структурка и map: Код: plaintext 1. 2. 3. 4. 5. 6. 7. значения double могут быть со знаками после запятой. Надо сгруппировать по значениям от 0 до 1, от 1 до 2, от 2 до 3 и т.д., результат сложить в вектор: Код: plaintext 1. под группировкой я подразумеваю SUM: в векторе будет лежать CSomeStruct, в котором будет сумма nLeftValue и nRightValue по всем структурам мапы, которые попадают в диапазон; Есть один ньюанс: Разряжённой может быть как шкала, так и данные. Что я имею ввиду: 1. Разряжённая шкала: шкала от 0 до 10 с шагом 1. В мапе 10М струтктур, в каждую единицу шкалы попадает в среднем по 1М структур; 2. Разряжённые данные: шкала от 0.0 до 1.0 с шагом 0.000 000 01 (10М), В мапе 200 единиц структур (именно поэтому результат складывается в map а не vector); Причём разряженность достаточно большая (десятки, сотни миллионов единиц), т.о. полный перебор только по одной из сущностей может привести к ступору. А алгоритм должен работать быстро - это часть UI. Можно, конечно, и самому написать два алгоритма и переключать их в зависимости от того, чего больше, но может есть более красивое решение? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2018, 18:54 |
|
||
|
Быстрый способ сгруппировать значения std::map
|
|||
|---|---|---|---|
|
#18+
std::map отсортирован по ключу, поэтому задача в один проход решается. Быстрее невозможно. Последовательно суммируешь то что попадает в один диапазон, как только появился элемент за диапазоном - сохраняешь результат и т.д. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2018, 19:42 |
|
||
|
Быстрый способ сгруппировать значения std::map
|
|||
|---|---|---|---|
|
#18+
Dima T, а может какой-нибудь итератор есть, который ключи по порядку перебирает? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2018, 20:17 |
|
||
|
Быстрый способ сгруппировать значения std::map
|
|||
|---|---|---|---|
|
#18+
13thDima T, а может какой-нибудь итератор есть, который ключи по порядку перебирает? Обычный итератор перебирает Код: plaintext 1. 2. 3. пример отсюда http://www.cplusplus.com/reference/map/map/begin/ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2018, 20:26 |
|
||
|
Быстрый способ сгруппировать значения std::map
|
|||
|---|---|---|---|
|
#18+
Честно говоря, использовать в качестве ключа double- не очень хорошее решение. Ведь идея заключается в том, чтобы по ключу получать значения, а вы не можете точно повторить double: он вечно будет в милитысячных отличаться. Поэтому получить по ключу что- либо становится просто невозможно. Думаю лучше было переменную типа double положить в структуру CSomeStruct, которые хранить: 1. В контейнере set с функцией сравнения Код: plaintext 1. 2. 3. 4. 2. В контейнере vector и перед накоплением итоговых значений его отсортировать той же самой функцией. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.04.2018, 08:20 |
|
||
|
Быстрый способ сгруппировать значения std::map
|
|||
|---|---|---|---|
|
#18+
AlekseySQLЧестно говоря, использовать в качестве ключа double- не очень хорошее решение. Ведь идея заключается в том, чтобы по ключу получать значения, а вы не можете точно повторить double: он вечно будет в милитысячных отличаться. Да, я знаю. Но спасибо за напоминание. У меня, конечно же, не double, а нормальная обёртка со всеми операторами сравнения, преобразования и т.д. Double я написал для простоты. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.04.2018, 08:52 |
|
||
|
Быстрый способ сгруппировать значения std::map
|
|||
|---|---|---|---|
|
#18+
Вот так сделал. Если где-то можно ещё подтюнить, буду благодарен за совет: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.04.2018, 11:45 |
|
||
|
Быстрый способ сгруппировать значения std::map
|
|||
|---|---|---|---|
|
#18+
13thЕсли где-то можно ещё подтюнить, буду благодарен за совет Как уже сказали: накапливай агрегат в переменной, а в результирующий список его сбрасывай только при изменении dLevel. Сейчас ты тратишь туеву хучу времени на обращение к mapResult на каждом цикле. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.04.2018, 12:31 |
|
||
|
Быстрый способ сгруппировать значения std::map
|
|||
|---|---|---|---|
|
#18+
13th значения double могут быть со знаками после запятой. double ВСЕГДА со знаками после запятой. Правда, ты, видимо, об этом не знаешь... 13th Код: plaintext 1. MAP с ключём типа double ? Парень, ты хорошо подумал, прежде чем это делать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.04.2018, 13:20 |
|
||
|
Быстрый способ сгруппировать значения std::map
|
|||
|---|---|---|---|
|
#18+
13th Надо сгруппировать по значениям от 0 до 1, от 1 до 2, от 2 до 3 и т.д., результат сложить в вектор: Тут нет ничего сложного. Бежишь по записям map-а, и суммируешь. Хочешь -- в вектор, хочешь -- в другой map складывай. Зависит от констрейнтов на алгоритм. Про то, что map отсортирован по ключу, тебе уже сказали. Итого O(N), один пробег. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.04.2018, 13:22 |
|
||
|
Быстрый способ сгруппировать значения std::map
|
|||
|---|---|---|---|
|
#18+
AlekseySQLЧестно говоря, использовать в качестве ключа double- не очень хорошее решение. Не не очень хорошее, а очень плохое решение. Но для данной задачи пофиг, главное, что записи там лежат, и отсортированы. А задачи поиска в map по ключу тут и не стоит. Подозреваю, задача и возникла изза того, что были проблемы с поиском по иррациональным числам. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.04.2018, 13:24 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=39626512&tid=2017895]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
53ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
45ms |
get tp. blocked users: |
1ms |
| others: | 287ms |
| total: | 429ms |

| 0 / 0 |
