汉明数字使用自定义函数而不是素数

时间:2016-12-16 04:20:16

标签: algorithm math hamming-numbers

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)...

1 个答案:

答案 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)的重要性。

那为什么会这样呢?

首先,很明显,此算法输出的任何内容都在集合中。

另一方面,假设满足所有三个条件。然后我们必须通过归纳证明,如果你属于序列,我们会在到达之前开始寻找你,然后在我们通过你时必须生成它。 (我们通过你的事实是,序列是一组不断增加的整数。)证明有点混乱,但很简单。