2010-12-07 6 views
0

당신은 요소의 배열이 주어집니다. 일부 또는 전부가 복제본입니다. 그들을 0 (n) 시간과 0 (1) 공간에서 찾으십시오. 입력 속성 - 숫자는 1..n의 범위에 있으며 여기서 n은 배열의 한도입니다.중복 찾기

+1

어떻게 상수 공간에서 복제본을 열거 할 수 있습니까? –

+3

이것은 objective-c와 어떤 관련이 있습니까? 당신이 생각해내는 대답이 거의 모든 언어에서 작동 할 것 같습니다. –

+0

인터뷰에서 같은 질문을 한 적이 있습니다. 먼저 해시 테이블 (복잡성 O (n))에 요소를 넣은 다음 O (1)에서 요소를 찾아야합니다. – nacho4d

답변

4

O (1) 저장 장치가 추가 메모리에 대한 제한 사항이고 입력 배열을 수정할 수 없다는 표시가 아니라면 요소를 반복하면서 정렬하여 정렬 할 수 있습니다. 각 배치 된 요소를 그것의 "정확한"장소 - 이미 올바른 번호로 점령 된 경우 중복으로 인쇄하십시오. 그렇지 않으면 "부정확 한"기존 내용을 가져 와서 반복하기 전에 올바르게 배치하십시오. 이것은 차례로 공간을 만들기 위해 다른 요소를 수정해야 할 수도 있지만 최대 1의 스택이 있고 보정 단계의 총 수가 N으로 제한되어 N 단계 반복에 추가되어 2N이 여전히 O (N)입니다.

+0

좀 더 살살해야합니다. 가까이 있지만 O (n)으로 볼 수는 없습니다. 요소별로 배열 요소를 반복한다고 가정 할 때 _chain_ 값의 배치를 보장하는 O (1) 연산은 무엇입니까? 다시 말해서, a [3] = 12이고 스왑을 다시해야하기 때문에 a [3] = 7'과'a [7] = 12' 두 값을 서로 바꿀 수 없습니다. – paxdiablo

+0

나는 다른 변수를 임시 변수에 저장해야한다고 생각한다. 그런 다음 같은 접근법을 계속한다. –

+0

@ paxdiablo : 내 충실한 답변에서 언급했듯이, 그러한 수정 사슬의 총 길이는 전체 프로세스에서 <= N이어야합니다. 예를 들어 첫 번째 요소를 배치하는 것과 관련된 수정 사슬이 수정되어야 할 모든 요소를 ​​필요로한다면, 다른 요소들은 그 자리에 있으며, 단지 확증적인 반복이 남아 있습니다. 그래서 N^2가 캐주얼 한 것처럼 보일 때 2N과 비슷합니다. –

1

배열 의 요소 개수가 모두 n을 기준으로 가변적이므로이 작업을 수행 할 수 있다고 생각하지 않습니다. 내가 믿는, 그리고 내가 잘못 될 수있다처럼 볼 토니의 대답 :-) 다시 본다 : I 개인적으로 나는 그것을 의심하지 않지만, 나는 :-)

편집하기 전에 잘못 봤는데, 잘못 될 수있다 그는 그것을 못 박았을 수도 있습니다. 충분한 사람들이 나에 동의하면 나는이 대답을 삭제됩니다 또는 범위 (예를 들어, 1..m)에 고정 된 경우가

:-) 너무 많이을 downvoted됩니다, 당신은, 따라서 그것을 할 수 :

dim quant[1..m] 
for i in 1..m: 
    quant[m] = 0 
for i in 1..size(array): 
    quant[array[i]] = quant[array[i]] + 1 
for i in 1..m: 
    if quant[i] > 1: 
     print "Duplicate value: " + i 

대부분의 알고리즘에서 시간과 공간을 자주 교환 할 수 있기 때문에 효과가 있습니다. 그러나 범위는 입력 값에 따라 달라지기 때문에 시간과 공간 사이의 일반적인 상충 관계는 그럴싸하지 않습니다.

+0

다시 중복을 찾는 데 여분의 공간을 사용하고 있습니다. 배열 작업에서 하나의 요소를 사용하는 대신 각 요소에 대해 하나의 비트를 사용하여 공간 최적화를 수행하는 대신 최적화 할 수 있습니다. –

+0

@prp의 경우, 여분의 저장 공간은 입력 값에 의존하지 않고 상수'm'을 사용하므로 저장 조건에 아무런 영향을 미치지 않으므로 O (1)입니다. 그러나 'n'에 의존하는 질문 _의 범위 이후로는 논리적이지 않습니다. – paxdiablo

+0

당신의 솔루션은 m에 의존합니다. 나는 m에 의존하지 않고 일정한 공간으로 해결하려고 노력할 것입니다. –

관련 문제