Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 定位一个有序的间隔序列,以便与另一个固定间隔序列最大对齐_Algorithm_Intervals - Fatal编程技术网

Algorithm 定位一个有序的间隔序列,以便与另一个固定间隔序列最大对齐

Algorithm 定位一个有序的间隔序列,以便与另一个固定间隔序列最大对齐,algorithm,intervals,Algorithm,Intervals,我有两个间隔序列 第一个是固定的且不重叠的,因此类似于: [1..10], [12..15], [23..56], [72..89], ... 第二个不是固定的,所以它只是一个区间长度的有序列表: [7, 2, 5, 26, ...] 目前的任务是: 将第二个列表中的每个间隔放置在给定的起点,以便第二个列表成为固定的、不重叠的间隔列表,就像第一个列表一样,同时保持其顺序 查找使某个列表中某个时间间隔内的整数数量最少,但不在另一个列表的任何时间间隔内的整数数量最少的对齐方式 非常简单的例子

我有两个间隔序列

第一个是固定的且不重叠的,因此类似于:

[1..10], [12..15], [23..56], [72..89], ...
第二个不是固定的,所以它只是一个区间长度的有序列表:

[7, 2, 5, 26, ...]
目前的任务是:

  • 将第二个列表中的每个间隔放置在给定的起点,以便第二个列表成为固定的、不重叠的间隔列表,就像第一个列表一样,同时保持其顺序
  • 查找使某个列表中某个时间间隔内的整数数量最少,但不在另一个列表的任何时间间隔内的整数数量最少的对齐方式
非常简单的例子:

[25..26], [58..68], [74..76], [78..86]

[10, 12]
最佳解决方案是将长度为10的间隔放置在[58..68]处,将长度为12的间隔放置在[74..86]处,这将导致只有数字25、26和77在一个列表中,而不是在另一个列表中

我想到的唯一一件似乎有点帮助的事情是,如果我把时间间隔按顺序排列,我知道我已经创建了多少“惩罚”时间间隔,所以我有一个分数的上限,这意味着我有一个可接受的启发式,我可以做一个*搜索,而不是查看整个树。然而,数字的总范围从0到大约34M,所以我想要更好的


任何帮助都是热的

好的,这里有一个考虑不周的答案。它应该在多项式时间内工作,但我没有费心检查索引是什么。很有可能得到一个比这里列出的答案更好的索引。细节留给读者作为练习:-)我希望不要太不清楚

我将解决方案的分数定义为两个区间列表中出现的整数数。设f(i,m)为仅使用第一个i区间长度可能得到的最高分数,前提是没有任何区间超过m。对于固定i,函数f本质上是从整数到整数的有界子集的(非严格)递增函数。因此:

  • 当m>0时,f(i,m)的所有值都相等,只有有限多个例外
  • 当m<0时,f(i,m)的所有值都相等,只有有限的例外
这意味着可以使用有限的数据结构来表示f(i,m)的所有值(仍然考虑i的固定值)

现在让F(i)是这个数据结构的值,表示F(i,m)的所有值。我声称,给定F(I),可以计算F(I+1)。要做到这一点,我们只需要为所有x回答以下问题:如果我将新的间隔设置为x,那么我能得到的最佳解决方案有多好?但我们知道这是什么-这只是f(i,x)+我们从这个区间得到的分数

因此,如果n是第二个列表中的区间数,则最佳解的分数为F(n)

要真正找到解决方案,您可以从这一点开始反向工作

你知道你能得到的最好分数是多少。说它是_0。然后将最后一个间隔放在尽可能左的位置,条件是它允许你得分s_0。也就是说,求最小的m,使得f(n,m)=s_0;放置间隔,使其仅停留在m的边界内

然后,让s_1成为从所有其他时间段获得的分数,以获得s_0的总数。将下一个最后一个间隔放在尽可能左的位置,前提是您仍然可以得分s_1。也就是说,求最小的m,使得f(n,m)=s_1;放置间隔,使其仅停留在m的边界内


等等…

有趣的问题。它与最佳匹配内存分配并不完全相同,因为您希望对整个集合进行最佳匹配,而不是一次只对一个长度进行最佳匹配,但类似的是,您的可用范围是不重叠的。实际上,您并不关心使用哪个块,因此等长块是可替换的;这样可以让您进行更简单的搜索,然后扩展结果。预先计算存在的组合长度(即,在简单的情况下,知道任何范围都可以接受24的长度,这立即就是最佳解决方案)也可以加快速度。。。祝你玩得开心…我闻到了动态规划的味道..re:动态规划,我没看到。如果递归函数被定义为在确定了一个区间后找到最佳匹配,那么这个问题就没有相同的子问题(即,根据放置第一个区间的位置,放置其他区间是一项不同的任务)。有几件事我不想在这里绞尽脑汁,但大多数情况下,我根本不明白这是如何保证最佳性的。你知道f(0,m)代表任何m:它是0。你可以得到f(1,m),你可以看到你能得到的最好分数是加上第一个间隔,因为没有模糊的地方,它被允许去。但是对于f(2,m),加上第二个音程可以得到的最佳分数取决于你把第一个音程放在哪里。你的算法的哪一部分实际上将分数限定为除总和(间隔中的间隔的长度(间隔))以外的任何值?这句话用错了:忽略关于界限的最后一个问题。从本质上说,我的问题是,要从f(i)到f(i+1),你需要遍历f(i)的所有最优解的列表,将它们作为添加区间i+1的基础,因为重叠是被禁止的。最佳解决方案的列表呈指数增长。我从(稍微)简单的任务开始,找出最佳解决方案有多好,而不是真正找到解决方案。假设我们知道F(i),并且想要计算F(i+1)。对于任意m,我们可以在新区间从m开始的条件下找到可能的最佳分数;它只是f(i+m)+(新区间的得分)。注意:我们只需要f(i,m),而不需要解决方案的细节。把这个分数叫做g(i,m)。设w为新区间的宽度;那么这类解的界是m+w。所以f(i+1,m'+w)是所有g(i,m)的最大值,对于m,好的,我不理解