如何用任何连续数的唯一和构造一个正整数序列?

时间:2011-08-04 05:07:00

标签: algorithm numbers sum sequence

例如:1,2,4,5有以下总和:

1,2,4,5

-3,6,9-

7,11

12

并且每笔款项都是独一无二的。

现在,1,2,3有以下总和:

1,2,3

3,5

6

并且显然不是每个总和都是独一无二的。

是否有任何有效的方法来生成与第一个示例类似的序列,目标是尽可能小地选择每个数字(不仅仅是1,2,4,8,16 ......)?我知道我可以编写一个程序来强制执行这个程序,但我只是好奇它能以更好的方式完成。

2 个答案:

答案 0 :(得分:8)

我认为你在这里寻找的是Golomb Ruler。如果你将上面描述的数字作为标记之间的距离,你就已经描述了一个Golomb标尺。当标尺上的标记集没有重复时,正如您所描述的那样,这就是使它成为Golomb标尺的原因。

描述Golomb标尺的标准方法似乎是通过表示每个标记的位置,而不是它们之间的距离。因此,您的1,2,4,5将被描述为Golomb Ruler 0-1-3-7-12。

引用维基百科:

  

目前,查找任意顺序n的OGR的复杂性(其中   n在一元中给出)是未知的。在过去有一些   推测这是一个NP难问题。与此相关的问题   可以证明Golomb统治者的建造是NP难的,其中   还注意到,没有已知的NP完全问题具有类似的风味   寻找哥伦布统治者。

答案 1 :(得分:1)

Seen <- emtpy set  # Sums seen so far
Open <- empty set  # Sums ending at the last element
for x from 1 to Limit do
    if x in Seen then
        # quick fail
        continue with next x
    end
    # Build new set
    Pending <- empty set
    add x to Pending
    for each s in Open do
        add (s+x) to Pending
    end
    # Check if these numbers are all unique
    if (Pending intersection Seen) is empty then
        # If so, we have a new result
        yield x
        Open <- Pending
        Seen <- Seen union Pending
    end
end

它查看到目前为止看到的所有总和,以及在最后一个元素结束的总和。没有必要跟踪开始和结束位置。

如果 n Limit的值,则此算法将采用 O(n 2 log n),假设已设置成员检查和插入是 O(log n),并且交集/联合不慢于 O(n log n)

(虽然我可能在最后的假设上弄错了)

前几个值是:

1, 2, 4, 5, 8