使用给定的索引对计算数组中的有余子序列

时间:2015-08-10 11:58:43

标签: algorithm subsequence

给定长度为n的数组,对于每个索引,我有一个整数xi(xi <= i)。我需要计算包含这两个指数的所有连续子序列,也就是说不应该重复。 我已经计算了子序列[1,4]为(i = 4&amp;&amp; x4 = 0),然后如果为next(i = 5&amp;&amp; x5 = 1)我不应该包括相同的连续序列两次。我需要找到所有这些子序列的数量。我试过蛮力的方法,不足以打败时间。

我可以有更好的方法吗?可能是O(NLOGN)还是不到那个?

1 个答案:

答案 0 :(得分:1)

解决方案非常简单明了。

假设我们正在为索引i。

执行此操作

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

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

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

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

N个链接列表。

并且所有链接列表最初都是空的。

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

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

如果链接列表arr [left]包含右边的元素,则表示之前已打印过子序列。

首先我们将子序列的左边界固定为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,这将是最后一次迭代。

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