【问题标题】:Generation of a Hamming Series汉明级数的生成
【发布时间】:2011-12-26 23:13:42
【问题描述】:

我一直在尝试解决一个编程问题,其中一个模块需要我生成汉明序列。该函数需要输入两个数字,一个是二进制数 N,另一个是十进制数 K。它现在应该生成与 N 的汉明距离最大为 K 的所有可能数字。

如果你能提供一个关于如何解决这个问题的算法,那将非常有帮助。

提前致谢。

【问题讨论】:

  • 你有没有尝试过?

标签: algorithm combinatorics hamming-code


【解决方案1】:

算法非常简单。您只需要选择包含从 0 到 K 个的所有可能的二进制数。然后用 N 异或,就像这样:

    public static Char[] Xor(Char[] a, Char[] b)
    {
        Char[] c = new Char[a.Length];
        for (Int32 i = 0; i < a.Length; ++i)
            if (a[i] == b[i])
                c[i] = '0';
            else
                c[i] = '1';

        return c;
    }

    public static void Generate(Char[] original, Char[] current, int position, int k)
    {
        if (position == original.Length)
        {
            Console.WriteLine(Xor(original, current));
            return;
        }

        if (k > 0)
        {
            current[position] = '1';
            Generate(original, current, position + 1, k - 1);
        }

        current[position] = '0';
        Generate(original, current, position + 1, k);
    }

    // Find all Number with hamming distance up to 2 from 01100
    Generate("01100".ToCharArray(), "00000".ToCharArray(), 0, 2);

注意:从 N 到 K 的汉明距离的数字数量可能非常大,因为它以指数方式增长取决于 K 的值。

【讨论】:

  • 为什么是字符数组?这整个问题只是尖叫 bitmanipulation
  • 唯一的原因是代码简单。当然,如果您想要定性解决方案,位操作就是您所需要的。
【解决方案2】:

您可以通过从(1&lt;&lt;K)-1 开始并应用NextPermutation 来生成所有设置了K 位的数字,直到您拥有所有数字。
用 N 异或所有这些数字。

【讨论】:

  • 一个非常有趣的答案,请问NextPermutation算法是如何工作的。我试过了,但我对它的输入和输出一无所知,更不用说它的功能了。你能解释一下吗?
  • @Warangalite 老实说我并不真正了解它。我不知道为什么它有效。它只是一个函数,它接受一个“位串”(当然是一个 int)并将其转换为按字典顺序排列的下一个字符串(int)。因此,如果您从 00001111 开始并继续应用它,它将按照字典顺序运行所有设置了 4 位的字节(它需要一个 int,因此它会尝试进一步运行,只需在 11110000 处停止)。在这种情况下,顺序甚至无关紧要,它只是一种直接生成所有设置了 k 位的数字的方法。
  • 谢谢,虽然我喜欢它的性能,但我更喜欢上面给出的 Java(尽管它不准确)解决方案。仍然感谢您的帮助。
【解决方案3】:

一种非常简单的方法(因为您没有提到有关性能的内容)是迭代 1 到 p 并与 N 进行按位异或,如果该数字设置为 1 的位数少于 K。p 的位长度与N.

伪代码:

for i in [0..p]
   if countBits(i) <= K then
      result.add(p xor N)
   end
end

【讨论】:

    【解决方案4】:

    这不是专访街吗?他们要求您不要让其他人为您解决问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-02
      • 2022-01-12
      • 2017-04-10
      相关资源
      最近更新 更多