Re: Структура для поиска битового расстояния
От: R.K. Украина  
Дата: 16.08.18 15:38
Оценка:
Здравствуйте, Videoman, Вы писали:

V>Есть следующая задача:

V>- Есть битовая строка
V>- Задано максимальное расстояние
V>Необходимо:
V>- Придумать структуру в которой можно быстро искать все строки с заданным расстоянием Хемминга в наборе битовых строк такой же длины.

Задачка для PATRICIA trie.

V>Вроде бы на форуме мелькало, но с ходу найти не получается. Задача кажется не сложной. Может быть, туплю. Если кто-то в теме, просьба подсказать куда копать? Желательно как можно проще. Еще лучше если можно будет быстренько "наложить" на STL.


https://github.com/uxn/patl/tree/vc12
Моя либа, самый свежий публичный вариант. Там есть patl::hamming_distance, пример использования в demos/insider. Для битовых строк понадобится примерно такой компаратор:
using bit_string = std::bitset<BIT_LENGTH>;

namespace uxn { namespace patl {

template <>
class bit_comparator<bit_string, 0>
{
    typedef bit_string value_type;

public:
    typedef bool char_type;

    static const word_t bit_size = 1;

    word_t bit_length(const value_type &v) const
    {
        return v.size();
    }

    word_t get_bit(const value_type &v, word_t id) const
    {
        return v.test(id) ? 1 : 0;
    }

    word_t bit_mismatch(const value_type &a, const value_type &b, word_t skip = 0) const
    {
        if (&a == &b)
            return ~word_t(0);
        for (auto i{skip}; i != a.size(); ++i)
        {
            if (a.test(i) != b.test(i))
                return i;
        }
        return ~word_t(0);
    }
};

} } // uxn::patl
You aren't expected to absorb this
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.