Предположим, что класс определен следующим образом:
class Test
{
public:
Test(int arg)
{
x = arg;
}
bool fuzzyEqual(const Test& other) const {
if (abs(x - other.x) < FUZZY_EQUAL)
return true;
else return false;
}
int x;
private:
static const int FUZZY_EQUAL = 5;
};
Теперь предположим, что у нас есть std::vector<Test>
с большим количеством элементов.
Учитывая новый Test
объект, линейный поиск самый быстрый способ найти первый элемент в векторе, который «нечеткий» равен (похож) на него?
Кроме того, есть ли контейнер, который работает как std::map
но что принимает концепцию сходства, а не равенства?
Что касается того, почему я спрашиваю:
У меня есть несколько значений, которые представляют некоторые другие объекты (в моем случае целое число представляет изображение), и похожие изображения приводят к аналогичным значениям. Вставляя значения по одному в контейнер, я хочу избежать добавления значения, если подобное уже существует. Мне все равно, что разные порядки вставки приводят к разным контейнерам.
Вы можете отсортировать вектор и использовать бинарный поиск, чтобы найти позиции, которые имеют наименьшее расстояние до точки.
Например std::lower_bound
дает вам наименьшее значение> = ваше начальное значение в O(log(n))
, И предыдущий элемент --std::lower_bound
самый большой элемент < ваше начальное значение. Если существует нечеткое значение, равное, то одно из этих двух найденных значений является искомым.
Других решений пока нет …