이 스레드에는 많은 혼란과 잘못된 정보가 있습니다. 사실, 인접성 매트릭스 (및 일반적으로 모든 어레이)의 초기화 비용을 피하는 방법이 있습니다. 그러나 Java 기본 요소가 기본 값으로 초기화되므로 메소드를 Java 기본 요소와 함께 사용할 수 없습니다.
data[0..n]
어레이가 자동 초기화되지 않았다고 가정 해보십시오. 시작하기 전에 그것은 이전에 기억에 있던 것에서부터 쓰레기로 가득 차 있습니다. O (n) 시간을 덮어 쓰지 않으려면 정크 데이터에서 추가 한 좋은 데이터를 구별하는 방법이 필요합니다.
"트릭"은 좋은 데이터가 포함 된 셀을 추적하는 보조 스택을 사용하는 것입니다. 우리가 처음으로 data[i]
에 쓸 때 색인에 i
을 추가합니다. 스택은 스택을 추가 할 때만 커지기 때문에 걱정할 필요가없는 쓰레기는 절대 포함되지 않습니다.
이제 data[k]
에 액세스 할 때마다 k
의 스택을 스캔하여 정크인지 아닌지 확인할 수 있습니다. 그러나 그것은 각 읽기에 대해 O (n) 시간이 걸리고, 처음에 배열의 포인트를 물리칩니다!
이 문제를 해결하기 위해 또 하나의 보조 배열 stack_check[0..n]
도 쓰레기로 가득 차 있습니다. 이 배열에는 스택의 요소에 대한 포인터가 들어 있습니다. 이제 data[i]
에 처음 쓸 때 i
을 스택에 넣고 stack_check[i]
을 새 스택 요소를 가리 키도록 설정합니다.
data[k]
이 양호한 데이터 인 경우 stack_check[k]
은 k
을 보유하는 스택 요소를 가리 킵니다. data[k]
이 정크이면 stack_check[k]
의 정크 값은 스택 외부를 가리키거나 k
이외의 스택 요소를 가리 킵니다 (k
은 절대로 스택에 저장되지 않았기 때문에). 이 속성을 확인하는 데는 O (1) 시간이 걸리므로 배열 액세스가 여전히 빠릅니다.
모두 가져 오면 배열과 도우미 구조를 O (1) 시간으로 정크하게 가득 채워서 만들 수 있습니다. 각 읽기 및 쓰기에서 우리는 주어진 셀에 우리의 도우미를 사용하여 O (1) 시간의 정크가 포함되어 있는지 확인합니다. 우리가 쓰레기를 쓰고 있다면 셀을 유효한 데이터로 표시하도록 도우미 구조를 업데이트합니다. 우리가 쓰레기를 읽으면 주어진 문제에 적절한 방법으로 처리 할 수 있습니다. 예를 들어 0과 같은 기본값을 반환 할 수 있습니다 (이제는 초기화하지 않았다고 말할 수도 없습니다!) 또는 예외를 throw 할 수 있습니다.
인접성 매트릭스의 스파 스 표현은 인접성 목록입니다. –