例如: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 ......)?我知道我可以编写一个程序来强制执行这个程序,但我只是好奇它能以更好的方式完成。
答案 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