Russian Qt Forum

Программирование => С/C++ => Тема начата: AzazelloAV от Апрель 12, 2015, 01:46



Название: Стандартные алгоритмы
Отправлено: AzazelloAV от Апрель 12, 2015, 01:46
И так и сяк кручу.
Как же объеденить свойства List со свойствами Hash - т.е. и быстрый доступ по индексу и быстрый поиск по ключу, вот такие взаимоисключения.

То лирика. Задача  - число, определить какому диапазону оно принадлежит. Понятно, диапазон есть.

P.S. Ну про брутфорс не будем.

P.P.S. И конечно же! Христос воскрес!


Название: Re: Стандартные алгоритмы
Отправлено: System от Апрель 12, 2015, 08:32
быстрый доступ по индексу и быстрый поиск по ключу
std::list<ValType> для быстрого доступа по индексу, std::hash<KeyType, size_t> для быстрого поиска по ключу, значения в хэше - индексы списка. Далее просто объединяем эти два объекта в одном классе. Пойдёт?


Название: Re: Стандартные алгоритмы
Отправлено: Igors от Апрель 12, 2015, 09:31
И так и сяк кручу.
Как же объеденить свойства List со свойствами Hash - т.е. и быстрый доступ по индексу и быстрый поиск по ключу, вот такие взаимоисключения.

То лирика. Задача  - число, определить какому диапазону оно принадлежит. Понятно, диапазон есть.

P.S. Ну про брутфорс не будем.
Наверное имелся ввиду QList, но причем тут Hash (QHash ?) - для поиска по диапазону он непригоден. Нужен std::lower_bound выбирайте любой контейнер который это имеет, а можно и просто сортированный массив/вектор. Если данные нужно удалять/добавлять(и это критично по скорости)  - тогда хужее. В бусте есть такой "multi" (не помню точно) и, пожертвовав еще кусочком коры мозга, постичь можно. Но я бы все-таки сделал свой


Название: Re: Стандартные алгоритмы
Отправлено: AzazelloAV от Апрель 12, 2015, 09:53
std::list<ValType> для быстрого доступа по индексу, std::hash<KeyType, size_t> для быстрого поиска по ключу, значения в хэше - индексы списка. Далее просто объединяем эти два объекта в одном классе. Пойдёт?

В принципе подойдёт, пока нет вставки удаления - т.е. перерасчет всего листа при произвольном удалении (вставке).

Цитировать
Нужен std::lower_bound выбирайте любой контейнер который это имеет, а можно и просто сортированный массив/вектор. Если данные нужно удалять/добавлять(и это критично по скорости)  - тогда хужее. В бусте есть такой "multi" (не помню точно) и, пожертвовав еще кусочком коры мозга, постичь можно. Но я бы все-таки сделал свой

Про мульти знаю, но не хочу влазить ни в буст, ни в стд.
Вообщем пока решил так - массив (вектор) сортированый, поиск элемента - методом деления пополам. Хотя действительно, вместо сортированного массива можно использовать и метод, приведенный выше (если добавление элементов всегда в конец)