我们如何将数字组划分为序列?并找到一般术语?
1 - 数字总是按顺序
2 - 如果我们有n个数字,则总是存在n / 2个数字
例如我们有:
Input: 0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30
Output--> 2*X, x=[0..15]
OR
Input: 0,2,4,5,6,8,10,12,14,15,16,18,20,22,24,26,28,30
分为两组
A: 0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30
B: 5,10,15,20
Output--> 2*X, x=[0..15] AND 5*X, x=[1..4]
我觉得这很难,有什么意见吗?
什么计算机领域或算法可以帮助我?
答案 0 :(得分:0)
我理解的问题是:给定一系列数字,找到从零开始的序列集,并增加一个覆盖此集合的常数倍。
以下是我将要做的一般概述:
我会列出集合中的所有数字,并从前两个元素开始迭代,以生成符合条件的所有可能集合。如果您在列表中遇到元素,则可以将其作为生成编号从考虑中删除,因为具有该编号作为常数倍的任何列表都是您之前遇到的列表的子集。完成后,您将获得可用于覆盖该组的可能组的列表。例如:
0,2,4,5,6,8,10,12,14,15,16,18,20,22,24,26,28,30
我们将从0和2开始。我们将查找连续2个更大的元素,并将其从可被视为可能倍数的元素列表中删除。一旦我们找到不在此列表中的2的倍数,我们就会停止生成。我们走了:
s(2) = [0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30]
离开:
[5,15]
作为两个潜在的其他候选人。您是否看到任何可被2整除的元素(例如4)将构成该列表的子集,因此不需要考虑?
集合中的剩余列表将从0开始并增加5,即我们的最小元素:
[0,5,10,15,20]
(请记住我们正在检查这些倍数的原始列表而不是截断列表 - 截断列表只是剩余候选列表。当候选列表为空时,我们知道我们将找到所有包含的集合在这个没有超集的人中。
更复杂的例子:
[0 2 3 4 5 6 7 8 9 10 12 13 14 15]
我们将从:
开始[0 2 4 6 8 10 12 14]
哪一片离开 [3 5 7 9 13 15]
作为候选人,反过来产生:
[0 3 6 9 12 15]
离开
[5 7 13]
生成
[0 5 10 15]
离开
[7 13]
生成
[0 7 14]
离开
[13]
生成
[0 13].
集合的总组合是:
[0 2 4 6 8 10 12 14]
[0 3 6 9 12 15]
[0 5 10 15]
[0 7 14]
[0 13].
此时,您拥有覆盖集合所需的所有集合的最小列表。从这里生成适当的[0,1 ... n] / a * n描述符应该是微不足道的。