Hamming Problem是一个着名的问题,它基本上生成所有整数,其素数因子只有{2,3,5}。 (它可以扩展到我认为的任何一组素因子)
为了找到第n个汉明数,Dijkstra有一个聪明的O(N)构造算法,伪代码如下:
import java.awt.BorderLayout;
import java.awt.image.BufferedImage;
import javax.swing.*;
public class ScrollPaneTest {
public static void main(String[] args) {
JFrame testFrame = new JFrame("ramka testowa");
testFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JLabel picture = new JLabel(new ImageIcon(
new BufferedImage(370, 1200, BufferedImage.TYPE_INT_RGB)));
JScrollPane scrollPane = new JScrollPane(picture);
JPanel insidePanel = new JPanel(new BorderLayout());
insidePanel.add(scrollPane);
testFrame.add(insidePanel, BorderLayout.CENTER);
insidePanel.add(new JLabel("Stay"), BorderLayout.LINE_START);
insidePanel.add(new JLabel("Stay"), BorderLayout.LINE_END);
insidePanel.add(new JLabel("Stay"), BorderLayout.PAGE_START);
insidePanel.add(new JLabel("Stay"), BorderLayout.PAGE_END);
testFrame.pack();
testFrame.setSize(400, 400);
// failing to do this will end the main & the app.
// doing it will cause the EDT to start.
testFrame.setVisible(true);
}
}
此解决方案的关键点是,如果 H是汉明数,则2H,3H,5H也是汉明数
我遇到了一个problem,我感觉它有点像汉明问题,但它并没有使用一组素因子来构造数字,相反,如果我重新讨论问题陈述,它如下所示:
1在结果集中。如果H在结果集中,那么2H + 1和3H + 1也在结果集中。找到结果集中的第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])
所以我想知道:
此构造算法是否适用于生成数字的问题,给定类似&#34的规则;如果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
也在结果中#34 ;,只要这些函数会给出结果&gt; = f(x), g(x), p(x), q(x)...
?
答案 0 :(得分:1)
一个充分条件是从整数到整数的所有函数f_i
必须是单调递增的,并且n < f_i(n)
和i
都有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_i(n)
的重要性。
那为什么会这样呢?
首先,很明显,此算法输出的任何内容都在集合中。
另一方面,假设满足所有三个条件。然后我们必须通过归纳证明,如果你属于序列,我们会在到达之前开始寻找你,然后在我们通过你时必须生成它。 (我们通过你的事实是,序列是一组不断增加的整数。)证明有点混乱,但很简单。