![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
Алексей1153 |
![]()
Сообщение
#1
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2943 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: ![]() ![]() ![]() |
Задача простая (на превый взгляд):
как наиболее быстро найти в std::map<int,int> наименьший неиспользованный ключ в диапазоне [A,B ) (B - не включено в диапазон) |
|
|
kwisp |
![]()
Сообщение
#2
|
![]() астарожна ынтжинэр ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1404 Регистрация: 26.11.2008 Из: ТаганрогРодинаЧехова Пользователь №: 435 Спасибо сказали: 113 раз(а) Репутация: ![]() ![]() ![]() |
Алексей1153,
уточни пожалуйста диапазон может быть любой т.е. 1: [0, 3, 4, 5, 8, 11 ) или только 2: [3,4,5,6,7,8,9,10 ) ? |
|
|
kwisp |
![]()
Сообщение
#3
|
![]() астарожна ынтжинэр ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1404 Регистрация: 26.11.2008 Из: ТаганрогРодинаЧехова Пользователь №: 435 Спасибо сказали: 113 раз(а) Репутация: ![]() ![]() ![]() |
в map значения отсортированные по ключам.
итератор begin соответсвует меньшему ключу итератор end большему ключу. очевидны простые ответы 1. если диапазон искомых не входит в диапазон ключей от begin до end ответ А. 2. если имеет пересечение у нижней границы ключей то ответ тоже А 1 и 2 можно обЪединить. 3. если диапазон искомых и ключей имеют пересечение у верхней границы ключей то ответ ключ итератора end +1 4. сымый сложный случай: если интервал искомых входит в интервал ключей полностью - в цикле пока ключ входит в диапазон перебирать ключи вычисляя разность между соседними ключами, если разность больше 1, то искомое значение младший ключ+1. |
|
|
Iron Bug |
![]()
Сообщение
#4
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: ![]() ![]() ![]() |
думаю, примерно так:
берём интервал (первый раз - все элементы мапа). берём первый и последний элементы и сравниваем разницу их ключей с количеством элементов в интервале. если разница+1 равна количеству, то нефиг там искать - там нет свободных ключей. если разница оказалась больше - то делим интервал пополам и рассматриваем по одному первую и вторую половину. ну и так далее. но тут надо смотреть, сколько тиков тратится на операции. может, проще тупо перебором... а ещё можно также делить, но искать с помощью upper_bound и lower_bound. Сообщение отредактировал Iron Bug - 15.2.2011, 20:50 |
|
|
Алексей1153 |
![]()
Сообщение
#5
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2943 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: ![]() ![]() ![]() |
уточни пожалуйста диапазон может быть любой на входе A и B - произвольные. Iron Bug, lower_bound в основном ![]() поэтому решил так - простым перебором ищу первый элемент в диапазоне и последний. Затем по ним шагаю и определяю, какой ключ взять, если всё не заполнено под завязку |
|
|
kwisp |
![]()
Сообщение
#6
|
![]() астарожна ынтжинэр ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1404 Регистрация: 26.11.2008 Из: ТаганрогРодинаЧехова Пользователь №: 435 Спасибо сказали: 113 раз(а) Репутация: ![]() ![]() ![]() |
Алексей1153,
Но только я не сумел его подружить с мапом, там же value_type составной, третий аргумент никак не могу сообразить можно так:
думаю можно и без лишнего создания pair обойтись. на входе A и B - произвольные. да это значительно усложняет задачу. |
|
|
![]() ![]() |
![]() |
|
Текстовая версия | Сейчас: 5.4.2025, 2:07 |