어떤 클래스의 데이터 구조를 영구적으로 만들 수 있습니까?


19

영구 데이터 구조 는 변경할 수없는 데이터 구조입니다. 이들에 대한 작업은 데이터 구조의 새로운 "복사"를 반환하지만 작업에 의해 변경됩니다. 이전 데이터 구조는 변경되지 않습니다. 효율성은 일반적으로 일부 기본 데이터를 공유하고 데이터 구조의 전체 복사를 피함으로써 달성됩니다.

질문 :

  • 동일하거나 매우 유사한 복잡성을 유지하면서 지속적으로 만들 수있는 데이터 구조 클래스에 대한 결과가 있습니까?

  • 동일하거나 매우 유사한 복잡성을 유지하면서 모든 데이터 구조를 지속적으로 만들 수 있습니까 ?

  • 동일하거나 매우 유사한 복잡성을 유지하면서 지속적으로 만들 수없는 데이터 구조가 있습니까?


1
임의의 요소에 액세스하기 위해 O (1) 복잡성을 유지하면서 벡터를 영속적으로 만들 수는 없습니다.
smossen


2
@smossen 증명할 수 있습니까?
Realz Slaw

1
첫 번째 질문은 매우 광범위한 질문입니다. 지속적으로 만들 수있는 데이터 구조 주제에 대한 많은 결과가 있습니다. 예를 들어, 오카 사키의 책 은 그 주제에 대한 고전입니다. 이 주제에 대해 조사한 적이 있습니까? 질문을 좁힐 수 있습니까? 그것이 의미하는 바와 같이, 나는 그것이이 사이트에 잘 맞지 않을 정도로 너무 넓을 것으로 생각합니다. 세 번째 질문을 별도의 질문으로 분리 할 수 ​​있습니까?
DW

@Realz Slaw : 공식적으로 증명할 수는 없지만 상식이라고 생각합니다. 벡터 (해시 테이블 포함)의 요소에 대한 O (1) 액세스는 주어진 하드웨어에서 주소 디코딩을위한 고정 시간에 따라 달라집니다. 지속성은 벡터 인덱스 외에 하나 또는 두 개의 차원을 추가합니다. 그러나 하드웨어 주소는 여전히 1 차원입니다.
smossen

답변:


22

긍정적 인 결과 : 지속성은 비용이 많이 들지 않습니다. 모든 데이터 구조가 최대 속도 저하 로 완전히 지속될 수 있음을 알 수 있습니다 .O(lgn)

증명 : 표준 데이터 구조 (예 : 균형 잡힌 이진 트리; 좀 더 자세한 내용은이 답변의 끝 부분 참조)를 사용하여 배열을 가져 와서 지속적으로 만들 수 있습니다. 이로 인해 속도 저하 가 발생합니다 . 각 어레이 액세스는 비 지속적 어레이 의 시간 대신 영구 데이터 구조에서 시간 이 걸립니다 . 이제 RAM 모델에서 실행 시간이 인 명령 알고리즘을 사용하십시오. 여기서 은 사용 된 메모리 양을 나타냅니다. 모든 메모리를 하나의 큰 배열 ( 요소가있는)로 표시하고 지속적 맵을 사용하여 지속적으로 만듭니다. 명령형 알고리즘의 각 단계는 최대 속도 저하가 발생하므로 총 실행 시간은 다음과 같습니다.O ( LG N ) O ( 1 ) O ( F ( N ) ) , N , N O ( LG N ) O ( F ( N ) 엑스 N )O(lgn)O(lgn)O(1)O(f(n))nnO(lgn)O(f(n)lgn) .

분명히 조금 더 잘하는 것이 가능합니다. 아래 인용 된 Demaine 논문의 기술을 사용하여 둔화 요인을 (예상, 상각 시간)으로 줄일 수는 있지만 분명히 익숙하지는 않습니다. 그 작업에 대한 자세한 내용은 본인이 보증 할 수 없습니다. 이 관찰에 대한 jbapple에 감사드립니다.O(lglgn)


부정적인 결과 : 일부 데이터 구조의 경우 속도 저하를 피할 수 없습니다. 세 번째 질문에 대답하기 위해 데이터 구조를 지속성으로 만드는 데 약간의 속도 저하가 발생하는 것으로 알려진 데이터 구조가 있습니다.

특히, 요소 배열을 고려하십시오 . 지속성이 없으면 각 어레이 액세스는 RAM 모델에서 시간 이 걸립니다 . 퍼시스턴스를 사용하면 임의의 요소에 액세스하기 위해 최악의 경우 최악의 복잡성을 갖는 퍼시 스턴트 배열을 구축 할 수있는 방법이 없다는 것이 분명해졌습니다 . 특히, 완전 영속 배열에 액세스 시간이 있어야한다는 것을 나타내는 하한이있는 것 같습니다 . 이 하한은 다음 논문의 3 페이지에서 확인되었습니다.O ( 1 ) O ( 1 ) Ω ( lg lg n )nO(1)O(1)Ω(lglgn)

하한은 Mihai Patrascu에 기인하지만,이 주장 된 하한의 증거에 대한 세부 사항을 제공하는 출처에 대한 인용은 없습니다.


풍부한 연구 영역. 우리가 임의의 데이터 구조 또는 알고리즘을 취한다면, 최대 속도 저하로 지속성을 유지할 수 있는지 여부는 약간의 문제 입니다. 나는 일반적인 분류 정리를 모른다. 그러나 효율적인 방식으로 특정 데이터 구조를 지속적으로 유지하는 방법에 대한 많은 연구가 있습니다.O(1)

함수형 프로그래밍 언어와도 밀접한 관련이 있습니다. 특히, 순전히 기능적인 방식으로 (돌연변이없이) 구현 될 수있는 모든 데이터 구조는 이미 영구적 인 데이터 구조입니다. (반드시 그럴 필요는 없습니다.) 눈을 가늘게 뜨고 싶다면 약한 부분 분류 정리로 간주 할 수 있습니다. 명령형 언어 인 경우 비 지속적 언어와 동일한 시간 범위를 갖는 지속적 데이터 구조가 있습니다. 나는 이것이 아마도 당신이 찾고있는 것이 아니라는 것을 알고 있습니다. 그것은 대부분 상황의 사소한 표현입니다.


영구 배열을 만드는 방법 최악의 액세스 시간 으로 완전 영구 배열을 작성하는 방법에 대한 구성은 설명하지 않습니다 . 그러나 기본 아이디어는 너무 복잡하지 않으므로 아이디어의 본질을 요약하겠습니다.O(lgn)

기본 아이디어는 바이너리 트리 데이터 구조를 가져 와서 path copying 기법을 사용하여 영구적으로 만들 수 있다는 것 입니다. 이진 트리가 있고 일부 리프 에서 값을 수정하려고한다고 가정합니다 . 그러나 지속성을 위해 해당 리프의 값을 제자리에 수정하지는 않습니다. 대신, 우리는 그 잎의 사본을 만들고 사본의 값을 수정합니다. 그런 다음 부모의 복사본을 만들고 복사본의 해당 자식 포인터를 새 리프를 가리 키도록 변경합니다. 루트에서 리프까지 경로의 각 노드를 복제하여이 방식으로 계속하십시오. 깊이 에서 리프를 수정 하려면 노드를 복사해야합니다 .d ddd

균형 잡힌 이진 트리에 노드가 있으면 모든 나뭇잎의 깊이는 이므로 이진 트리에서이 작업을 수행하는 데 시간이 걸립니다. 건너 뛰는 세부 사항이 있습니다 최악의 시간 을 달성 하려면 균형을 유지하기 위해 트리를 재조정해야 할 수도 있습니다. 그러나 이것이 요점을 알려줍니다.O ( lg n ) O ( lg n ) O ( lg n )nO(lgn)O(lgn)O(lgn)

다음 자료에서 예쁜 그림으로 더 많은 설명을 찾을 수 있습니다.

그것은 당신에게 주요 아이디어를 줄 것입니다. 처리해야 할 추가 정보가 있지만이 질문의 범위를 벗어납니다. 다행히도 이것은 모두 표준적인 내용이며 이러한 자료 구조를 구축하는 방법에 대한 많은 정보가 문헌에 나와 있습니다. 위의 리소스가 충분하지 않고 영구 배열 데이터 구조를 구축하는 데 대한 자세한 정보를 원하면 별도의 질문을 자유롭게하십시오.


첫 번째 단락을 이해하지 못합니다. 빨간색 나무를 사용하여 배열을 영구적으로 만드는 방법은 무엇입니까?
G. 바흐

G.Bach @, "이진 검색 나무"와 "랜덤 액세스 구조"에서 (특히, 트리 방식)라고 표시된 부분에서 꽤 좋은 설명있다 toves.org/books/persist/index.html은 . 또 다른 멋진 설명은 netcode.ru/dotnet/?artID=6592#BinaryTrees 및 일부 후속 섹션을 참조하십시오 . 그것은 당신에게 주요 아이디어를 줄 것입니다. 자세한 내용은이 질문의 범위를 벗어 났지만 모두 표준적인 내용입니다. 그러한 데이터 구조를 구축하는 방법에 대한 자세한 정보를 원하시면 별도의 질문을하시기 바랍니다.
DW

4
좋은 대답, DW 당신은 ​​시간을 (예상 된 상각) 줄일 수 있습니다 . 를 참조하십시오 . Demaine 등의 "효율적인 버전 관리에 대한 Confluently 영구 시도 횟수"O(lglgn)
jbapple
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.