Я хочу иметь возможность программно генерировать набор двоичных последовательностей заданной длины, избегая при этом сходства между любыми двумя последовательностями. Таким образом, я определяю «аналогичные» между двумя последовательностями:Выбор набора двоичных последовательностей во избежание сходства
Если последовательность A может быть преобразована в последовательность B (или от B до A) с помощью бит-сдвига A (без кругового движения) и отступов с 0s, A и B подобны (примечание: бит сдвига допускается только на одном последовательностей в противном случае оба могут всегда быть сдвинуты к последовательности всего 0s)
Например: A = 01010101
B = 10101010
C = 10010010
в этом примере , A и B аналогичны, поскольку один левый сдвиг o f A приводит к B (A < < 1 = B). A и C равны , а не, так как ни одно смещение одного из них не может привести к другому.
A набор последовательностей определен неравномерно, если ни одно подмножество размера 2 не является аналогичным.
Я считаю, что может быть множество множеств для заданной длины последовательности, и, предположительно, размер набора будет значительно меньше, чем общие возможности (общие возможности = длина последовательности 2 ^).
Мне нужен способ создания набора для заданной длины последовательности. Существует ли алгоритм, который может достичь этого? Выбор последовательностей по одному и проверка на все ранее выбранные последовательности неприемлемы для моего варианта использования (но, возможно, это должно быть, если лучшего метода не существует!).
Я пробовал генерировать множества целых чисел, основанные на числах простых чисел, а также золотое отношение, а затем преобразование в двоичное. Казалось, что это может быть жизнеспособным методом, но я не смог заставить его работать так, как ожидалось.
Обновление: Я написал функцию в C#, которая использует простое число по модулю для генерации набора без успеха. Кроме того, я попытался с помощью последовательности Фибоначчи, которая находит основном неодинаковый набор, но такого размера, что очень мало по сравнению с количеством возможностей:
private List<string> GetSequencesFib(int sequenceLength)
{
var sequences = new List<string>();
long current = 21;
long prev = 13;
long prev2 = 8;
long size = (long)Math.Pow(2, sequenceLength);
while (current < size)
{
current = prev + prev2;
sequences.Add(current.ToBitString(sequenceLength));
prev2 = prev;
prev = current;
}
return sequences;
}
Это порождает множество последовательностей размера 41, которое примерно 60% различны (sequenceLength = 32
). Он начинается с 21, так как более низкие значения производят последовательности в основном 0s, которые похожи на любую другую последовательность.
Ослабляя условия подобия, допуская только небольшое количество последовательных бит-сдвигов, доля разнородных последовательностей приближается к 100%. Это может быть приемлемым в моем случае использования.
Update 2:
Я реализовал функцию следующее предложение DCHE, в выбирая нечетные числа больше половины максимального значения для заданной длины последовательности:
private static List<string> GetSequencesOdd(int length)
{
var sequences = new List<string>();
long max = (long)(Math.Pow(2, length));
long quarterMax = max/4;
for (long n = quarterMax * 2 + 1; n < max; n += 2)
{
sequences.Add(n.ToBitString(length));
}
return sequences;
}
Это дает совершенно несходный набор согласно моим требованиям. Я понимаю, почему это работает математически.
Какое точное требование к несоблюдению? Вы можете легко генерировать последовательности, создавая их произвольно, за исключением того, что MSB и LSB должны быть равны 1, а затем перебрасывать биты в середине, используя любую стратегию, которая вам нравится (например, тривиальный случай: счетчик нарастания и XOR с средними битами) столько раз как надо. MSB и LSB являются 1 гарантией того, что никакое смещение любого из сгенерированных значений не будет схоже с любым другим. Но в этом случае последовательности будут «очень похожи», хотя технически ваше требование будет выполнено. – Jon
@Jon Последовательности будут приниматься с возможностью смещения бит и потери ведущего или конечного бита (обнуления). Последовательности должны быть однозначно идентифицированы. Первоначально выбирая возможные последовательности в соответствии с указанным выше определением, я надеюсь избежать ошибочной идентификации. Я попытаюсь выполнить ваши предложения и обновления позже. Требуется рабочая реализация, но я также очень заинтересован в математике, стоящей за этой проблемой! – Jack