【问题标题】:Dynamic Programming On Intervals区间动态规划
【发布时间】:2020-06-20 23:51:27
【问题描述】:

你是一个给定的连续间隔数组,即{ [a,b],[b,c],[c,d],...,[g,h],[h,i] }
给定一个n m k类型的查询,我们需要输出包含kn,m (inclusive, 1-based indexing)之间的间隔数。

我的方法:(天真地检查n,m 之间的所有间隔并保留一个计数器。)

如果m-n 和查询的数量很小,这将有效,但对于较大的n,m 值和多个查询,这将是非常低效的。

所以我正在考虑一种动态编程方法,这样我们可以将包含 z 的区间数保存到数组 x 中编号为 x 的区间内,然后我可以将任何查询 n m k 回答为 @ 987654332@。但是,如果数组中给定的间隔太大,这也会失败,因为构造 dp 数组需要更多时间。

我该如何解决这个问题,或者我是否缺少更简单的方法?

任何提示都会有所帮助。

例子:

数组:{ [1,3],[3,2],[2,1],[1,5],[5,3] }

查询:{ 1 2 2 }{ 1 3 3 }{ 2 2 4 }

输出:{ 2 }{ 2 }{ 0 }

【问题讨论】:

  • 请添加一些输入示例和您的问题的预期输出。
  • 你能解释一下这种天真的方法有什么问题吗?对我来说它是 O(N) 并且不依赖于间隔的长度。我错了吗?
  • @Sarmon:问题是如何针对多个查询进行优化。

标签: algorithm data-structures hashtable


【解决方案1】:

我会通过以下方式解决这个问题。

首先我要介绍另一个数组形式的数据结构:

[(ai,bi,ci)]

在哪里

ai - interval start
bi - interval end
ci - count of intervals of original sequence hitting interval [ai,bi]

ai < bi
a(i+1) = bi

所以这个新的数据结构覆盖了原始结构的整个范围,它正在增加并且它具有所需的原始间隔计数。

现在要找到计数,我们只需要 k 并执行某种二进制搜索来找到间隔。

【讨论】:

  • 你能用给定的例子解释一下吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-05
  • 2020-11-20
  • 2011-09-23
  • 2019-04-14
  • 1970-01-01
相关资源
最近更新 更多