배열 초기화에 저장


19

최근에 초기화 할 필요가없는 배열을 가질 수 있다는 것을 읽었습니다. 즉, 각 구성원을 기본값으로 설정하려고 할 때 시간을 소비하지 않고도 배열을 사용할 수 있습니다. 즉, 배열을 초기화하지 않고 기본값으로 초기화 된 것처럼 배열을 사용할 수 있습니다. (죄송합니다, 나는 이것을 어디서 읽었는지 기억하지 못합니다).

예를 들어 왜 이것이 놀라운 지에 대해 :

범위에서 정수 의 최악의 경우 해시 테이블 (각 삽입 / 삭제 / 검색에 대해 을 모델링하려고한다고 가정하십시오 .[ 1 , N 2 ]O(1)[1,n2]

비트 크기의 배열을 할당하고 개별 비트를 사용하여 해시 테이블에 정수의 존재를 나타낼 수 있습니다. 참고 : 메모리 할당은 시간으로 간주 됩니다.O ( 1 )n2O(1)

이제이 배열을 전혀 초기화하지 않아도된다면, 이 해시 테이블에 대한 연산 시퀀스는 최악의 경우 입니다.O ( N )nO(n)

따라서, 당신은 "완벽한"해시 구현을 가지는데, 그것은 연산 시퀀스에 공간을 사용하지만 시간에 실행됩니다!nΘ(n2)O(n)

일반적으로 런타임은 최소한 공간 사용량만큼 나빠질 것으로 예상합니다!

참고 : 위의 예는 희소 세트 또는 희소 행렬의 구현에 사용될 수 있으므로 이론적으로 관심이있는 것은 아닙니다.

따라서 질문은 다음과 같습니다.

초기화 단계를 건너 뛸 수있는 데이터 구조와 같은 배열을 어떻게 가질 수 있습니까?


@Aryabhata 언급 한 참조는 무엇입니까?
uli

1
"메모리 사용"은 "할당 된 메모리가 있지만 액세스하지 않은 메모리"와 동일하지 않으므로 동기 "역설"이 존재하지 않는다고 생각합니다.
Raphael

1
첫 번째 단락은 매우 명확하다고 생각합니다. 실제로 기본값을 사용하여 배열을 채우는 데 시간이 걸리지 않고 기본값이 있습니다. 경우 다른 사람의 대답은, 내가 전에 그것을 쓸 수있는 시간이 여기에있다 scholar.google.co.uk/... 내 블로그에 아주 간단한 설명도 있습니다 rgrig.blogspot.co.uk/2008/12/array가 -puzzle-solution.html
rgrig

@uli : 이것은 시드 질문입니다. 실제로 이것을 오랫동안 읽었습니다 .
Aryabhata

@Raphael : 처음 그런 이야기를 들었을 때 여전히 놀라운 일입니다. 역설의 대부분은 :-)되지 않습니다
Aryabhata

답변:


15

이것은 매우 일반적인 트릭으로, 해싱 이외의 다른 목적으로 사용될 수 있습니다. 아래에서는 구현 (의사 코드)을 제공합니다.

크기가 n 인 세 개의 초기화되지 않은 벡터 , PV 를 각각 보자 . 이를 사용하여 데이터 구조에서 요청한 작업을 수행합니다. 우리는 또한 변수 유지 P O . 작업은 다음과 같이 구현됩니다.APVnpos

init:
  pos <- 0

set(i,x):
if not(V[i] < pos and P[V[i]] = i) 
  V[i] <- pos, P[pos] <- i, pos <- pos + 1
A[i] <- x

get(i):
if (V[i] < pos and P[V[i]] = i) 
  return A[i] 
else 
  return empty 

어레이 단순히 통과 값 저장 S의 전자 t의 절차. 배열 VPA 에서 주어진 위치 가 초기화되었는지 알 수있는 인증서로 작동 합니다.AsetVPA

매 순간마다 0 에서 p o s - 1 범위의 요소 가 초기화됩니다. 따라서이 값을 A 의 초기화 된 값에 대한 인증서로 안전하게 사용할 수 있습니다 . 초기화 되는 A의 모든 위치 i 에 대해 벡터 P 의 값이 i와 같은 해당 요소가 있습니다. 이것은 V [ i ]로 표시 됩니다. 따라서 해당 요소를 보면 P [ V [ i ] ] 이고 그 값은 iP0pos1AiAPiV[i]P[V[i]]i, 우리는 가 초기화 되었다는 것을 안다 ( P는 절대로 고려하지 않기 때문에 고려하고있는 모든 요소가 초기화 되었기 때문에). 마찬가지로, A [ i ] 가 초기화되지 않은 경우 , V [ i ] 는 초기화되지 않았 음을 확신 할 때 P가 0 .. p o s - 1 범위를 벗어난 위치를 가리킬 수 있습니다. 해당 범위 내의 위치 그러나이 특정 P [ j ]A 의 다른 위치에 해당 하므로A[i]PA[i]V[i]P0..pos1P[j]A 이므로 A [ i ] 가 초기화되지 않았다는것을 알고있습니다.P[j]iA[i]

이러한 모든 작업이 일정한 시간에 수행된다는 것을 쉽게 알 수 있습니다. 또한, 사용되는 공간은 벡터의 각각에 대해, 및 O ( 1 ) 변수의 P O S 따라서, O ( N ) 전체이다.O(n)O(1)posO(n)


하지만 의한 우연한 것이 불가능 동일 I을 않고 [ 내가 ] 이제까지 설정되어 있습니까? P[V[i]]iA[i]
Robert S. Barnes

그러나 pos는 V [i]보다 작을 것입니다. 그렇지 않으면 우연히되지 않을 것입니다. V [i]보다 pos가 높기 때문에 인덱스 V [i]의 P 값을 선택한 특정 값, 즉 i로 설정했음을 의미합니다.
wolfdawn

이것은 (휴대용) C에서는 불가능한 일의 전형적인 예입니다.
TLW
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.