【问题标题】:Counting contigious subsequences in an array with given pair of indices使用给定的索引对计算数组中的连续子序列
【发布时间】:2015-08-10 11:58:42
【问题描述】:

给定一个长度为 n 的数组,对于每个索引 i 都有一个整数 xi (xi

我能有更好的方法吗?可能是 O(NLOGN) 或更少?

【问题讨论】:

  • 您能否澄清一下输入的具体内容以及您需要用它做什么?
  • 不知道你这个问题是什么意思。请澄清
  • 我的意思是对于每个索引 i ,我都有一个对应的索引 x[i](0
  • 我真的很抱歉,但我仍然不知道你在说什么。为什么 i=0 应该计算 5 个段,但 i=1 没有?
  • 对于 i=0,i 应该在我的子数组中同时包含 x[0]=0 和 0(相同)索引,这意味着当我们来到 i= 时,我计算所有包含索引 0 的子数组1 我们应该包括 i=1 和 x[1]=0(索引 0 和 1),这意味着包括索引 0 和 1 并计算子数组,但所有子数组都已经计算在内,所以这里我没有添加

标签: algorithm subsequence


【解决方案1】:

解决方案非常简单明了。

假设我们正在为 索引 i 执行此操作。

我们通过将子序列扩展到限制(索引)x[i]i 之外来生成子序列,因为子序列将始终从 获取数组元素x[i] 到 i,如果我们只扩展,我们的子序列将始终具有索引 x[i]i

当然,我们还将涵盖从 x[i]i 的明显子序列,这是第一个子序列。

编辑:为避免重复,我们必须检查给定的左右边界组合是否已经尝试过

为此,我们将制作一个邻接列表,其中将包含

N 个链表。

所有链表最初都是空的。

现在一个给定的具有相应左右边界的子序列之前没有被尝试过当且仅当

linked list arr[left] does not contain element right.

如果链表 arr[left] 包含元素 right 则表示该子序列之前已经打印过。

首先我们将子序列的左边界固定为 x[i],然后使用新的左边界尝试所有可能的新右边界:

i,i+1,i+2 ....... N-1 , N is equal to length of array a.

Corresponding subsequenes being
if(a[j] linked list does not contain i)
 {
   print the subsequence a[j],a[j+1],......a[i]
   add i to arr[j]
 }
if(a[j] linked list does not contain i+1)
 {
   print the subsequence a[j],a[j+1],.........a[i+1]
   add i+1 to a[j]
 }

and similar if condition before all subsequences given below.      

a[j],a[j+1],...............a[i+2]
. 
.
a[j],a[j+1]..........................a[N-1]

j is x[i] for the above subsequences.

然后我们将左边界固定为 x[i]-1,然后使用新的左边界尝试所有可能的新右边界:

i,i+1,i+2 ....... N-1 

对应的子序列是

similar if condition as given above before all subsequences given below.      
and they will be printed if and only if the condition is true.

a[j],a[j+1],.........a[i]
a[j],a[j+1],...............a[i+1]
. 
.
a[j],a[j+1]..........................a[N-1]

j is x[i]-1 for the above subsequences.

我们这样做直到 j 变为 0,这将是最后一次迭代。

现在来看看这个算法的效率,因为在每一步我都在生成一个新的子序列,并且没有一个步骤浪费在生成一个不包含两个索引的子序列上,所以我认为它非常有效。

【讨论】:

  • 不幸的是,这不会起作用。比如 pair(i,x[i]) =(1 ,4) 和 (j,x[j])=(2,3) i认为上面的算法会得到错误的解决方案,它不会包含一些重复,但我不想计算一个序列两次。
  • @oflocon 但是你说 xi
  • @oflocon 请澄清一下。
  • 哦,对不起,我的意思是 (x[i],i)=(1,4) 和 (x[j],j)=(2,3) 在这种情况下,当您计算序列时用你的方法为 i=3 然后转到 i=4 ,它之前已经有一些了。
  • 不会有重复我的朋友,即使你取对(1,4),输出也正好是两个子序列(2,3,4,5)和(1,2, 3,4,5)。
猜你喜欢
  • 2015-11-05
  • 2014-12-19
  • 1970-01-01
  • 2022-01-23
  • 2014-02-14
  • 2020-07-17
  • 2018-04-14
  • 2017-03-06
  • 1970-01-01
相关资源
最近更新 更多