我正在尝试找到此算法的时间复杂度。
这个迭代的算法会生成给定汉明距离内的所有位字符串,从输入位串开始。它生成所有递增序列0 <= a [0] <...< a [dist-1] < strlen(num)
,并反转相应索引处的位。
向量a
应该保留需要反转比特的索引。所以如果a包含当前索引i
,我们打印1而不是0,反之亦然。否则,我们按原样打印位(请参见else部分),如下所示:
// e.g. hamming("0000", 2);
void hamming(const char* num, size_t dist) {
assert(dist > 0);
vector<int> a(dist);
size_t k = 0, n = strlen(num);
a[k] = -1;
while (true)
if (++a[k] >= n)
if (k == 0)
return;
else {
--k;
continue;
}
else
if (k == dist - 1) {
// this is an O(n) operation and will be called
// (n choose dist) times, in total.
print(num, a);
}
else {
a[k+1] = a[k];
++k;
}
}
这个算法的时间复杂度是多少?
我的尝试是:
但这似乎不正确,考虑以下例子,其中所有距离都为2:dist * n + (n choose t) * n + 2
len = 3, (3 choose 2) = 3 * O(n), 10 while iterations
len = 4, (4 choose 2) = 6 * O(n), 15 while iterations
len = 5, (5 choose 2) = 9 * O(n), 21 while iterations
len = 6, (6 choose 2) = 15 * O(n), 28 while iterations
以下是两个代表性的运行示例(在循环开始时进行打印):
000, len = 3
k = 0, total_iter = 1
vector a = -1 0
k = 1, total_iter = 2
vector a = 0 0
Paid O(n)
k = 1, total_iter = 3
vector a = 0 1
Paid O(n)
k = 1, total_iter = 4
vector a = 0 2
k = 0, total_iter = 5
vector a = 0 3
k = 1, total_iter = 6
vector a = 1 1
Paid O(n)
k = 1, total_iter = 7
vector a = 1 2
k = 0, total_iter = 8
vector a = 1 3
k = 1, total_iter = 9
vector a = 2 2
k = 0, total_iter = 10
vector a = 2 3
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
gsamaras@pythagoras:~/Desktop/generate_bitStrings_HammDistanceT$ ./iter
0000, len = 4
k = 0, total_iter = 1
vector a = -1 0
k = 1, total_iter = 2
vector a = 0 0
Paid O(n)
k = 1, total_iter = 3
vector a = 0 1
Paid O(n)
k = 1, total_iter = 4
vector a = 0 2
Paid O(n)
k = 1, total_iter = 5
vector a = 0 3
k = 0, total_iter = 6
vector a = 0 4
k = 1, total_iter = 7
vector a = 1 1
Paid O(n)
k = 1, total_iter = 8
vector a = 1 2
Paid O(n)
k = 1, total_iter = 9
vector a = 1 3
k = 0, total_iter = 10
vector a = 1 4
k = 1, total_iter = 11
vector a = 2 2
Paid O(n)
k = 1, total_iter = 12
vector a = 2 3
k = 0, total_iter = 13
vector a = 2 4
k = 1, total_iter = 14
vector a = 3 3
k = 0, total_iter = 15
vector a = 3 4
if (++a[k] >= n)
这一行改为if (++a[k] > n - dist + k)
来最小化代码的性能问题。这样可以消除所有不必要和无效的来回传递。 - ruakhhamming("<40个零>", 40)
显示了优化的重要性。我的代码版本实际上和你的一样(假设ruakh在第二条评论中的更改已经移除了过多的scuttling)。我的每次迭代做更多的工作,但是你的可以在打印语句之间执行许多次迭代。由于它们本质上正在做相同的事情,所以这两个代码版本完全平衡。 - Paul Hankin