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