【发布时间】:2011-12-26 23:13:42
【问题描述】:
我一直在尝试解决一个编程问题,其中一个模块需要我生成汉明序列。该函数需要输入两个数字,一个是二进制数 N,另一个是十进制数 K。它现在应该生成与 N 的汉明距离最大为 K 的所有可能数字。
如果你能提供一个关于如何解决这个问题的算法,那将非常有帮助。
提前致谢。
【问题讨论】:
-
你有没有尝试过?
标签: algorithm combinatorics hamming-code
我一直在尝试解决一个编程问题,其中一个模块需要我生成汉明序列。该函数需要输入两个数字,一个是二进制数 N,另一个是十进制数 K。它现在应该生成与 N 的汉明距离最大为 K 的所有可能数字。
如果你能提供一个关于如何解决这个问题的算法,那将非常有帮助。
提前致谢。
【问题讨论】:
标签: algorithm combinatorics hamming-code
算法非常简单。您只需要选择包含从 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 的值。
【讨论】:
您可以通过从(1<<K)-1 开始并应用NextPermutation 来生成所有设置了K 位的数字,直到您拥有所有数字。
用 N 异或所有这些数字。
【讨论】:
一种非常简单的方法(因为您没有提到有关性能的内容)是迭代 1 到 p 并与 N 进行按位异或,如果该数字设置为 1 的位数少于 K。p 的位长度与N.
伪代码:
for i in [0..p]
if countBits(i) <= K then
result.add(p xor N)
end
end
【讨论】:
这不是专访街吗?他们要求您不要让其他人为您解决问题。
【讨论】: