Быстрый нечеткий поиск в контейнере C ++

Предположим, что класс определен следующим образом:

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 но что принимает концепцию сходства, а не равенства?

Что касается того, почему я спрашиваю:
У меня есть несколько значений, которые представляют некоторые другие объекты (в моем случае целое число представляет изображение), и похожие изображения приводят к аналогичным значениям. Вставляя значения по одному в контейнер, я хочу избежать добавления значения, если подобное уже существует. Мне все равно, что разные порядки вставки приводят к разным контейнерам.

2

Решение

Вы можете отсортировать вектор и использовать бинарный поиск, чтобы найти позиции, которые имеют наименьшее расстояние до точки.

Например std::lower_bound дает вам наименьшее значение> = ваше начальное значение в O(log(n)), И предыдущий элемент --std::lower_bound самый большой элемент < ваше начальное значение. Если существует нечеткое значение, равное, то одно из этих двух найденных значений является искомым.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]