Информация об изменениях

Сообщение Re: Структура для поиска битового расстояния от 17.08.2018 18:08

Изменено 17.08.2018 18:15 Erop

Re: Структура для поиска битового расстояния
Здравствуйте, Videoman, Вы писали:

V>Заранее, спасибо большое всем откликнувшимся!



IMHO, верно тебе бор советовали. Только надо его не из битов делать, а сразу из чётвёрок битов, или сразу 8-рок, даже
Если памяти не особо жаль, то узел дерева из тетрад -- это просто 16 смещений вперёд, или 0-й, если тетрада в узле не используется.

Итого, имеешь указатель на корень, берёшь из своего образца то, что ещё не выводит за границу расстояния, и получаешь список пар (узел + накопленное расстояние), ну итерируешь до упора...
Я бы ещё сделал отрицательные смещения, и в качестве их использовал бы индексы для входа в область, где хранятся неветвящиеся "хвосты".
Можно написать очень быстрый код.

Если список строить не обязательно, и достаточно позвать колбэк в каждой подходящей строке, то можно рекурсивный обход сделать.
Re: Структура для поиска битового расстояния
Здравствуйте, Videoman, Вы писали:

V>Заранее, спасибо большое всем откликнувшимся!



IMHO, верно тебе бор советовали. Только надо его не из битов делать, а сразу из чётвёрок битов, или сразу 8-рок, даже
Если памяти не особо жаль, то узел дерева из тетрад -- это просто 16 смещений вперёд, или 0-й, если тетрада в узле не используется.

Итого, имеешь указатель на корень, берёшь из своего образца то, что ещё не выводит за границу расстояния, и получаешь список пар (узел + накопленное расстояние), ну итерируешь до упора...
Я бы ещё сделал отрицательные смещения, и в качестве их использовал бы индексы для входа в область, где хранятся неветвящиеся "хвосты".
Можно написать очень быстрый код.

Если список строить не обязательно, и достаточно позвать колбэк в каждой подходящей строке, то можно рекурсивный обход сделать.

p. s.
Да, как сделать быстро перебор всех на расстоянии не больше чем. Просто генерим массив из 16 тетрад:
deltas[16] = { 0, //  0 бит 
    0x1, 0x2, 0x4, 0x8, //   1 бит
    0x3, 0x5, 0x9, 0x6, 0xA, 0xC, // 2 бита
    0x7, 0xB, 0xD, 0xE, // 3 бита
    0xF // 4 бита, на самом деле не нужно
};

Соответственно, если допустимой дистанции осталось менее 4 бит, то берём соответствующий отрезок массива deltas, последовательно ксорим с обьразцом и берём из узла варианты продолжения + сразу вычитаем скока надо бит. Если 4 и более, то берём все варианты в узле подряд и вычитаем число бит из разницы.