Бинарный поиск для std::list
Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.
Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.
Здравствуйте.
Хотел написать бинарный поиск для
std::list. Пишу:Но для
std::list<coord>::iteratorоператоры + и < не перегружены. Как быть?Контейнер
listне предназначен для произвольного доступа.Используй
vectorилиdeque.vectorне подойдёт, т.к. слишком «дорогая» операция удаления элемента. Уdequeне перегружен оператор+:(А в качестве бинарного поиска можно использовать
std::lower_bound?А зачем тебе вообще бинарный поиск, да ещё в списке?
Чем тебя не устраивает find?
Если не секрет, что ты такое делаешь, что тебе нужен столь экзотический набор свойств контейнера?
Пишу класс
LifeMap, решаю эту задачу.Есть список живых точек —
std::list<coord> map.Всякий раз при обращении к значению точки(метод
getCell(x,y), нужно искать эту точку вmap.Над функцией
std::findя уже думал, но она работает за O(n), а это медленно, если количество точек становится большим. Я решил использовать бинарный поиск, он быстрее, т.к. работает за O(log(n)).Бинарный поиск, говоришь...
А у тебя список отсортирован?
А как у тебя отсортирован список? По X? по Y? или как-то ещё?
Да, и кстати, что значит
c1 > c2для типаcoord? Подозреваю, чтоstruct coord { long long x, y; }, ну или около того.Да.
По Y.
Чуть больше :)
Если всё так круто, то почему бы не использовать binary_search?
Если ты хочешь активно использовать STL, рекомендую книгу Николай Джосьютис. C++ Стандартная библиотека. Для профессионалов — СП Питер, 2004 ISBN 5-94723-635-4
Издание, правда, достаточно старое. Но актуальность практически не утратило. Есть ли более новое издание — не знаю.
Здесь у тебя неувязочка:
Если истина, что
a > b, то из этого не следует, чтоa < bтоже истина. Они, сволочи, ещё могут быть равны.Первично лучше определять
operator <. Именно он используется в STL для сортировок, сравнений и пр. Следовательно, если он первичен в определении, то хоть немного времени, но сэкономится на вызове лишней подпрограммы.Насколько я понимаю,
binary_searchтолько ищет элемент, и возвращает true, если элемент найден и false в противном случае. А мне нужен итератор на найденный элемент.А std::lower_bound не подходит? Он вроде итератор выдает. Только не помню у него линейная скорость или логарифмическая.
Насколько я понимаю, сложность у него логарифмическая.
Оптимизировать нужно только то, что критично к задаче.
В данном же случае я бы посоветовал тебе реализовать рабочий функционал без лишних заморочек с оптимизацией. Например, через
std::vector. А потом смотреть по ситуации, нужна ли эта оптимизация вообще.Также, ты можешь использовать
std::mapсо ссылкой на элемент списка для быстрого поиска по координатам.