计算数组中连续整数元素的数量

时间:2013-12-18 17:14:50

标签: ruby arrays performance algorithm

鉴于我有一个如下数组:

arr = [8, 13, 14, 10, 6, 7, 8, 14, 5, 3, 5, 2, 6, 7, 4]

我想计算连续数字序列的数量。例如,在上面的数组中,连续数字序列(或数组切片)是:

[13,14]
[6,7,8]
[6,7]

因此我们有3个这样的切片。什么是有效的算法来计算这个?我知道如何做到这一点O(N ^ 2)但我正在寻找比这更好的东西。

4 个答案:

答案 0 :(得分:4)

arr = [8, 13, 14, 10, 6, 7, 8, 14, 5, 3, 5, 2, 6, 7, 4]
p arr.each_cons(2).chunk{|a,b| a.succ == b || nil}.count #=> 3

nilchunk - 方法有特殊含义:它会导致项目被删除。

答案 1 :(得分:2)

arr = [8, 13, 14, 10, 6, 7, 8, 14, 5, 3, 5, 2, 6, 7, 4]
result = []
stage = []
for i in arr:
    if len(stage) > 0 and i != stage[-1]+1:
        if len(stage) > 1:
            result.append(stage)
        stage = []
    stage.append(i)
print result

输出:

    [[13, 14], [6, 7, 8], [6, 7]] 

此代码的时间复杂度为 O(n)。 (只有一个for循环。并且不难看出循环中的每次迭代都是O(1)。)

答案 2 :(得分:1)

我会使用Enumerable#slice_before执行以下操作:

a = [8, 13, 14, 10, 6, 7, 8, 14, 5, 3, 5, 2, 6, 7, 4]
prev = a[0]
hash = Hash[a.slice_before do |e|
  prev, prev2 = e, prev
  prev2 + 1 != e
end.map{|e| [e,e.size] if e.size > 1}]
hash # => {[13, 14]=>2, [6, 7, 8]=>3, [6, 7]=>2}
hash.size # => 3

答案 3 :(得分:0)

我认为这可以在O(N)时间内完成。如果您只想要计数,

  1. 遍历数组。将计数器初始化为0.
  2. 如果下一个元素比当前元素多一个或一个,则递增计数器。
  3. 继续迭代,直到下一个元素不比当前元素多一个或一个。
  4. 重复步骤2和3,直到结束。
  5. 如果您想要连续增加连续元素的部分(不清楚您的问题)

    1. 遍历数组。将计数器初始化为0.
    2. 如果下一个元素比当前元素多一个,则递增计数器。
    3. 继续迭代,直到下一个元素不是当前元素。
    4. 重复步骤2和3,直到结束。