Одним из вариантов будет использование контейнера std::map
с двойными значениями в качестве ключей и значений, соответствующих тому, какое значение назначено диапазону, верхней конечной точкой которого является данное значение.Например, учитывая ваш файл, у вас будет такая карта:
std::map<double, std::string> lookup;
lookup[1.0] = "A";
lookup[2.5] = "B";
lookup[7.0] = "C";
Затем вы можете использовать функцию std::map::lower_bound
, учитывая некоторую точку, чтобы вернуть пару ключ / значение, ключ (верхняя конечная точка) - это первый ключ на карте, который по крайней мере такой же большой, как рассматриваемая точка.Например, с приведенной выше картой lookup.lower_bound(1.37)
вернет итератор, значение которого равно "B."lookup.lower_bound(2.56)
вернет итератор со значением "C".Эти поиски быстрые;они занимают O (log n) времени для карты с n элементами.
Выше я предполагаю, что все значения, которые вы ищете, неотрицательны.Если допускаются отрицательные значения, вы можете добавить быстрый тест, чтобы проверить, является ли значение отрицательным, прежде чем выполнять какие-либо поиски.Таким образом, вы можете устранить ложные результаты.
Для чего бы это ни стоило, если вы случайно узнаете что-то о распределении ваших поисков (скажем, они распределены равномерно), можно создать специальную структуру данных, которая называется оптимальное двоичное дерево поиска , которое даст лучшее время доступа, чем std::map
.Кроме того, в зависимости от вашего приложения, возможны еще более быстрые варианты.Например, если вы делаете это, потому что хотите случайным образом выбрать один из результатов с различными вероятностями, я бы посоветовал изучить эту статью о методе псевдонима , которая позволяетвы генерируете случайные значения за O (1) раз.
Надеюсь, это поможет!