Бинарный поиск для 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
со ссылкой на элемент списка для быстрого поиска по координатам.