汉明问题是一个著名的问题,它基本上生成所有仅质因数为 {2,3,5} 的整数。(它可以扩展到我认为的任何主要因素)
为了找到第 n 个汉明数,Dijkstra 有一个巧妙的 O(N) 构造算法,其伪代码如下:
List<int> H
int i=0,j=0,k=0, n=10 // find the 10-th hamming number
H.add(1)
for(i=0 to 10)
int next = min(2*H[i], 3*H[j], 5*H[k])
H.add(next)
if(next == 2*H[i]) ++i
if(next == 3*H[j]) ++j
if(next == 5*H[k]) ++k
output(H[10])
这个解的关键是,如果H是一个汉明数,那么2H、3H、5H也是一个汉明数
我遇到了一个问题,我觉得它有点像汉明问题,但它不是使用一组素因子来构造数字,而是如果我重新调整问题陈述,它就像下面这样:
1 在结果集中。如果 H 在结果集中,则 2H+1 和 3H+1 也在结果集中。在结果集中找到第 n 个数字
然后我想知道相同的构造算法是否适用于这个问题,事实证明它确实有效!(我什至不知道它为什么会起作用)
Def f(x) 2x+1
Def g(x) 3x+1
List<int> H
int i=0,j=0,n=10 // find the 10-th hamming number
H.add(1)
for(i=0 to 10)
int next = min(f(H[i]), g(H[j]))
H.add(next)
if(next == f(H[i])) ++i
if(next == g(H[j])) ++j
output(H[10])
那么我想知道:
这个构造算法是否适用于生成数字的问题,给定一个规则,如“如果x
在结果中,那么所有f(x), g(x), p(x), q(x)...
也在结果中”,前提是这些函数将给出结果 >= x
?