2013-12-18 5 views
0

연속적인 정수 소자의 수를 계산 :다음과 같은 I 배열이 주어 배열

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

I는 연속 번호 시퀀스의 수를 카운트하고 싶다. 예를 들어 위의 배열에서 연속 번호 시퀀스 (또는 배열 슬라이스)는 다음과 같습니다.

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

따라서 3 개의 슬라이스가 있습니다. 이것을 계산하는 효율적인 알고리즘이란 무엇입니까? 나는 내가 그것을 할 수있는 방법을 알고있다. (N^2)하지만 나는 그것보다 나은 것을 찾고있다.

+0

나는 [생각하지 않는다 6,7,8] 쌍입니다. 모든 연속 시퀀스를 찾으십니까? –

+0

죄송합니다 - 예 연속 시퀀스. 질문 수정. –

+0

왜 [7,8] 유효한 쌍이 아닌가요? – Skyler

답변

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) 것을 볼 어렵지 않다..)

+6

방금 ​​Ruby 질문에 파이썬으로 대답했다고 생각합니다. –

+0

@JonClements는 중요하지 않습니다. -이 방법은 O (N)에서 할 수있는 방법을 이해해야합니다. Ruby로 직접 번역 할 수 있습니다. 이것은 좋아 보인다 :) –

+0

@JasdeepSingh 단 하나의'for' 루프가있다. 루프의 각 반복이 O (1)임을 확인하는 것은 어렵지 않습니다. – Skyler

0

이것은 O (N) 시간에 수행 할 수 있다고 생각합니다. 개수를 원할 경우

  1. 배열을 반복합니다. 카운터를 0으로 초기화하십시오.
  2. 다음 요소가 현재 요소보다 하나 또는 하나 작 으면 카운터를 증가시킵니다.
  3. 다음 요소가 현재 요소보다 하나 이상 작지 않을 때까지 계속 반복합니다.
  4. 끝까지 도달 할 때까지 2 단계와 3 단계를 반복하십시오.

당신은 배열을 통해 지속적으로 증가하는 연속적인 요소의 섹션 (귀하의 질문에서 명확하지)

  1. 반복 처리를합니다. 카운터를 0으로 초기화하십시오.
  2. 다음 요소가 현재 요소보다 하나 많으면 카운터를 증가시킵니다.
  3. 다음 요소가 현재 요소 중 하나가 아닐 때까지 계속 반복합니다.
  4. 끝까지 도달 할 때까지 2 단계와 3 단계를 반복하십시오.
+0

이 있으면, 다음 요소가 현재 요소보다 1 작음 확인을 위해 작동하지 않습니다. 나는 당신이'현재 원소가 다음 원소보다 1 작거나 다음 원소가 현재 원소보다 많다면' –

+0

@JasdeepSingh [1,2,1]을 연속적인 순서로 생각하지 않습니까? –

+0

'[1,2,1] 중 연속 번호에 대한 나의 이해에 따라'[1,2]'만이 연속적입니다. –

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 -method에 특별한 의미가 있습니다 : 그것은 항목이 삭제되도록합니다.

+0

아주 좋습니다 (+1). 또한 보너스로 불필요하게 실제 시퀀스를 계산하지 않습니다. –

+0

@undur_gongor 예, 그렇습니다 ... – steenslag

+1

네,하지만 즉각적인 형태는 아닙니다 [[6, 7, 8]'. 그것은 [[6, 7], [7, 8]]입니다. –

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 
관련 문제