2015-11-16 3 views
1

Я хочу иметь возможность программно генерировать набор двоичных последовательностей заданной длины, избегая при этом сходства между любыми двумя последовательностями. Таким образом, я определяю «аналогичные» между двумя последовательностями:Выбор набора двоичных последовательностей во избежание сходства

Если последовательность A может быть преобразована в последовательность B (или от B до A) с помощью бит-сдвига A (без кругового движения) и отступов с 0s, A и B подобны (примечание: бит сдвига допускается только на одном последовательностей в противном случае оба могут всегда быть сдвинуты к последовательности всего 0s)

Например: A = 01010101B = 10101010C = 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; 
    } 

Это дает совершенно несходный набор согласно моим требованиям. Я понимаю, почему это работает математически.

+0

Какое точное требование к несоблюдению? Вы можете легко генерировать последовательности, создавая их произвольно, за исключением того, что MSB и LSB должны быть равны 1, а затем перебрасывать биты в середине, используя любую стратегию, которая вам нравится (например, тривиальный случай: счетчик нарастания и XOR с средними битами) столько раз как надо. MSB и LSB являются 1 гарантией того, что никакое смещение любого из сгенерированных значений не будет схоже с любым другим. Но в этом случае последовательности будут «очень похожи», хотя технически ваше требование будет выполнено. – Jon

+0

@Jon Последовательности будут приниматься с возможностью смещения бит и потери ведущего или конечного бита (обнуления). Последовательности должны быть однозначно идентифицированы. Первоначально выбирая возможные последовательности в соответствии с указанным выше определением, я надеюсь избежать ошибочной идентификации. Я попытаюсь выполнить ваши предложения и обновления позже. Требуется рабочая реализация, но я также очень заинтересован в математике, стоящей за этой проблемой! – Jack

ответ

1

Я не могу это доказать, но из моего эксперимента я считаю, что ваш набор - это нечетные целые числа, превышающие половину наибольшего числа в двоичном формате. Например. для битовых множеств длины 3 максимальное число равно 7, поэтому множество равно 5 и 7 (101, 111).

+0

Не было бы 2 (010) в том наборе тоже? И, возможно, 000? –

+0

010 похож на 101 (сдвиг 101 правый), и все похоже на 000, просто сдвиньте все вправо (или влево) 3. – DCHE

+0

Ах да. Он работает для четырех бит? –