Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 使用自定义函数代替素数的汉明数_Algorithm_Math_Hamming Numbers - Fatal编程技术网

Algorithm 使用自定义函数代替素数的汉明数

Algorithm 使用自定义函数代替素数的汉明数,algorithm,math,hamming-numbers,Algorithm,Math,Hamming Numbers,这是一个著名的问题,它基本上生成所有素数因子仅为{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

这是一个著名的问题,它基本上生成所有素数因子仅为{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
int i=0,j=0,k=0,n=10//求第10个汉明数
H.add(1)
对于(i=0到10)
int next=min(2*H[i],3*H[j],5*H[k])
H.add(下一个)
如果(next==2*H[i])++i
如果(next==3*H[j])++j
如果(next==5*H[k])++k
输出(H[10])
这个解决方案的关键点是,如果H是一个汉明数,那么2H、3H、5H也是一个汉明数


我遇到了一个问题,我感觉它有点像汉明问题,但它不是用一组素数因子来构造数字,相反,如果我对问题陈述进行重新定相,它是如下所示:

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])
1在结果集中。如果H在结果集中,则2H+1和3H+1也在结果集中。在结果集中查找第n个数字

然后我想知道同样的构造算法是否适用于这个问题,事实证明确实如此!(我甚至不知道它为什么有效)

Def(x)2x+1
Def g(x)3x+1
清单H
int i=0,j=0,n=10//求第10个汉明数
H.add(1)
对于(i=0到10)
int next=min(f(H[i]),g(H[j]))
H.add(下一个)
如果(next==f(H[i])++i
如果(next==g(H[j])++j
输出(H[10])

所以我想知道:


此构造算法是否适用于生成数字的问题,如果“如果结果中包含
x
,则所有
f(x)、g(x)、p(x)、q(x)….
也包含在结果中”,假设这些函数将给出一个结果>=
x
一个充分条件是,从整数到整数的所有函数都必须是单调递增的,并且对于所有的
i
n
,都有
n

举例说明您需要规则的整数部分,这是一对函数
(n+0.5,(n+floor(n+1))/2)
。这将导致序列
1、3/2、7/4、15/8,…
,您将永远无法到达
2

函数
(2^n,20-5n+n^2)
的顺序是
1,2,4,16,14,…
,显然没有顺序。因此,需要非递减

函数
(n-3)
给出序列(1,-2,-5,…),并显示
n
的重要性

那么,这是为什么

首先,很明显,这个算法输出的任何东西都在集合中


反过来说,假设这三个条件都满足。然后我们必须通过归纳法证明,如果你属于这个序列,我们在到达之前就开始寻找你,然后当我们经过你的时候,我们必须产生它。(序列是一组递增的整数,这一事实保证了我们可以传递给你。)证明有点混乱,但很简单。

函数需要是单调的:如果f(2)>f(3),那么生成的数字将不会按递增顺序排列。如果函数是单调的,我想你可以用归纳法证明所有的数都是按正确的顺序生成的。生成N个以下的所有数字后,其中一个指针必须准备好生成序列中的下一个数字。@mcdowella谢谢,我认为关于单调部分你是对的。为了证明这一点,我正在努力做到这一点,但这对我来说并不微不足道……单调(或其他一些强有力的假设)是必不可少的。如果
f
g
等可以用可证明的无界范围进行计算,但没有其他假设,则通过应用这些函数从
{1}
生成的集合是递归可枚举的,但通常不是递归的。在非递归情况下,任何算法都不可能工作,因为停止问题是不可判定的。事实上,没有通用算法可以确定集合中是否有2。