오카 사키 이후 순수하게 기능적인 데이터 구조의 새로운 기능


563

크리스 오카 사키의 1998 년 책 "순전히 기능적인 데이터 구조"이후로, 나는 전혀 새로운 흥미로운 순전히 기능적인 데이터 구조가 나타나는 것을 보지 못했습니다. 나는 몇 가지 이름을 지정할 수 있습니다.

  • IntMap (1998 년 오카 사키가 발명했지만 그 책에는 존재하지 않음)
  • 핑거 트리 (및 모노 이드에 대한 일반화)

"불변 유형"또는 "일반 대수 데이터 유형"을 사용하여 트리 불변을 보장하는 등 이미 알려진 데이터 구조를 구현하는 흥미로운 방법도 있습니다.

1998 년 이후이 분야에서 어떤 다른 새로운 아이디어가 나타 났습니까?


20
좋은 질문. 나는 방금 이것에 대해 묻는 학생이 있었고 대답을 몰랐습니다.
Suresh Venkat

이것은 괜찮지 만 스택 오버플로에 대한 더 나은 답변을 얻을 수 있습니다. 당신이 거기에 묻는다면, 여기에 토론에 연결하십시오.
Charles Stewart

3
Haskell Reddit은 이것을 보았으므로 거기에서도 좋은 답변이 나오지만 훌륭한 질문이 있습니다. 오카 사키의 책을 반쯤봤을 때 저도 같은 생각이 궁금합니다. +1
Robert Massaioli


답변:


553

1998 년 이후로 출판 된 새로운 순전히 기능적인 데이터 구조 :

  • 2001 년 : Phil Bagwell의 Ideal Hash Trees 와 2000 년의 전신 인 빠르고 공간 효율적인 트리 검색 : Clojure 표준 라이브러리의 기본 빌딩 블록으로 사용되었습니다.

  • 2001 : Ralf Hinze의 Priority Search Queue에 대한 간단한 구현 기술 :이 중요한 데이터 구조를 구현하기위한 정말 간단하고 아름다운 기술 (Dijkstra 알고리즘에 유용함). 구현은 "보기 패턴"을 많이 사용하기 때문에 특히 아름답고 읽을 수 있습니다.

  • 2002 : Ralf Hinze의 일방적 유연한 어레이 부트 스트랩 : 오카 사키의 랜덤 액세스 목록과 유사하지만 cons인덱싱 사이의 시간 균형을 변경하도록 조정할 수 있습니다 .

  • 2003 : Radu Mihaescu와 Robert Tarjan의 새로운 catenable 및 non-catenable deques : 오카 사키가 인용 한 오래된 작품들 (Kaplan과 Tarjan의 새로운 작품)은 2000 년에 출판되었다 . 이 버전은 몇 가지면에서 더 간단합니다.

  • 2005 : Chris Okasaki의 Maxiphobic heaps ( 종이코드 ) : 새롭고보다 효율적인 구조가 아니라 우선 순위 대기열을 가르치는 방법으로 제시되었습니다.

  • 2006 : 순수 기능 최악 일정 시간 Catenable 정렬 된 목록 Gerth Stølting Brodal, 크리스토스 Makris 및 코스타스 Tsichlas로는 : O (LG 전자 N)를 삽입, 검색과 구조를 보여줌으로써 카플란과 Tarjan의 뛰어난 질문에 답변하고, 삭제하고 O (1) 연결

  • 2008 : 효율적인 버전 관리에 대한 Confluently 영구 시도 횟수 에릭 D. Demaine, 스테판 Langerman, 에릭 가격 기준은 : 잎 근처 효율적으로 탐색 및 수정을 시도에 대한 몇 가지 데이터 구조를 표시합니다. 일부는 순전히 기능적입니다. 다른 사람들은 실제로 Dietz 등의 오랜 데이터 구조를 개선합니다. 완전히 영속적 인 (완전히 영속적이거나 순수하게 기능하지는 않는) 어레이를 위해. 이 문서는 또한 때로는 "동적 나무"라고하는 순전히 기능적인 링크 컷 트리를 제시 합니다.

  • 2010 : Matt Might 의 Red-black tree를 위한 완전히 새로운 기능의 삭제 알고리즘 : 오카 사키의 Red-black tree 삽입 알고리즘과 마찬가지로 이것은 새로운 데이터 구조 나 데이터 구조에 대한 새로운 작업이 아니라 새롭고 간단한 방법입니다 알려진 작업을 작성하십시오.

  • 2012 : RRB-Trees : 효율적인 불변 벡터 , Phil Bagwell 및 Tiark Rompf : Hash Array Mapped Tries의 확장으로 불변 벡터 연결, 인서트 및 O (lg n) 시간 분할을 지원하면서 인덱스, 업데이트 유지 및 원래의 불변 벡터의 삽입 속도.

1997 년에 알려져 있지만 오카 사키의 책에서는 논의되지 않았습니다 :

  • 다른 많은 스타일의 균형 검색 트리 . AVL, 형제, 순위 균형, 경계 균형 및 기타 여러 균형 검색 트리는 경로 복사를 통해 순전히 기능적으로 구현 될 수 있습니다. 특별히 언급 할 가치가있는 것은 다음과 같습니다.

  • Martín Escardó의 빠른 검색을 허용하는 무한 세트 : 아마도 데이터 구조 자체가 아닐 수도 있습니다.

  • Chris Okasaki의 Braun Trees에 대한 3 가지 알고리즘 : Braun Tree 는 최악의 경우 O (lg n)로 많은 스택 연산을 제공합니다. 이 범위는 다른 많은 데이터 구조를 능가하지만 Braun 트리는cons두 번째 인수에서 연산이 지연되어 다른 구조로는 불가능한 방식으로 무한 스택으로 사용될 수 있습니다.

  • 완화 된 최소-최대 힙 : 병합 가능한 이중 엔드 우선 순위 큐KD 힙 : Yuzheng Ding 및 Mark Allen Weiss 의 효율적인 다차원 우선 순위 큐 :이 문서에서는 다루지 않았지만 순전히 기능적입니다. . 나는 달성 한 시간이 k 트리 우선 순위 대기열로 Hinze & Paterson 또는 Kaplan & Tarjan의 핑거 트리를 사용하여 달성 할 수있는 시간보다 낫다고 생각하지 않지만 Ding & Weiss의 구조는 공간을 덜 사용한다고 생각합니다. .

  • Gérard Huet 의 Zipper : Hinze & Paterson의 핑거 트리와 같은 다른 많은 데이터 구조에서 사용되는 데이터 구조는 내부에서 외부로 전환하는 방법입니다.

  • 차이 목록 은 일반적인 cons목록으로 O (n) 변환 된 O (1) 범주 목록입니다 . 그들은 Prolog 커뮤니티에서 고대부터 알려졌으며, 일반적인 cons목록으로 의 O (1) 변형이 있습니다. 전통적인 함수형 프로그래밍에서는 O (1) 변환이 불가능 해 보이지만 POPL '98의 Minamide 's hole abstraction 은 순수한 함수형 프로그래밍 내에서 O (1) 추가 및 O (1) 변환을 허용하는 방법을 설명합니다. 함수 클로저를 기반으로하는 차이점 목록의 일반적인 기능적 프로그래밍 구현과 달리 구멍 추상화는 본질적으로 사용 및 구현 측면에서 프롤로그 차이 목록과 동일합니다. 그러나 몇 년 동안이 사실을 알게 된 유일한 사람은Minamide의 검토 자 중 하나입니다 .

  • O(n)Θ(nlgn)Θ(nlgn)Θ(lg2n)

오카 사키의 책 전, 도중 및 후에 주로 기능적인 데이터 구조 :

  • O(m)mO(lglgn)

  • 1989 : 무작위 검색 나무 세실리아 R. 아라곤과 레이먼드 세이 델로 :이에 가이 E. Blelloch와 마가렛 리드 - 밀러 순수하게 기능 설정에서 논의되었다 Treaps를 사용하여 빠른 설정 작업 에 댄 블랜드 포드와 가이 블 렐록에 의해 함께 기능 설정 운영 처리 ( 코드). 그것들은 순전히 기능적인 핑거 트리와 편향된 검색 트리의 모든 동작을 제공하지만, 임의의 소스가 필요하기 때문에 순전히 기능하지 않습니다. 이것은 또한 작업을 시간을 정하고 긴 작업을 반복 할 수있는 적을 가정 할 때 가두에 대한 작업의 시간 복잡성을 무효화 할 수 있습니다. (이것은 명령형 상각 인수가 지속적인 설정에서 유효하지 않지만 스톱워치가있는 적을 요구하는 것과 같은 이유입니다)

  • 1997 : Xavier Messeguer와 건너 뛰기 목록과 이진 검색 트리의 이중성을 탐색 하는 동시 접근 방식의 건너 뛰기 목록에 대한 대체 데이터 구조 인 건너 뛰기 트리 : Brian C. Dean과 Zachary H. Jones : 건너 뛰기 목록은 순수한 것은 아닙니다. 기능적이지만 트리로 기능적으로 구현할 수 있습니다. treap과 마찬가지로 임의 비트 소스가 필요합니다. (건너 뛰기 목록을 결정 론적으로 만들 수는 있지만, 트리로 변환 한 후에는 2-3 개의 나무를 보는 또 다른 방법이라고 생각합니다.)

  • 1998 : 오카 사키의 책에서 상각 된 모든 구조! 오카 사키는 이전에는 양립 할 수 없었던 상각과 기능적 데이터 구조를 혼합하는이 새로운 방법을 발명했습니다. Kaplan과 Tarjan이 언급했듯이 메모는 실제로 부작용입니다. 경우에 따라 ( 성능상의 이유로 SSD의 PFDS와 같은 ), 이것은 부적절 할 수 있습니다.

  • 1998 : Haim Kaplan, Chris Okasaki 및 Robert E. Tarjan의 간단한 Confluently Persistent Catenable List : 후드 아래의 수정을 사용하여 상각 된 O (1) catenable deque를 제공하여 이전과 완전히 동일한 인터페이스를 제공합니다. )는 오카 사키의 책에 등장합니다. Kaplan과 Tarjan은 이전에 순전히 기능적인 O (1) 최악의 구조를 만들었지 만 실제로는 훨씬 더 복잡합니다.

  • 2007 :이 페이지의 다른 답변에서 언급했듯이 Sylvain Conchon과 Jean-Christophe Filliâtre의 반영구적 데이터 구조영구 조합 찾기

오카 사키의 책 전, 도중 및 후에 기능적 데이터 구조를 검증하는 기술 :

오카 사키의 책에서는 다루지 않았지만 순전히 기능적인 데이터 구조와 관련된 명령형 데이터 구조 또는 분석 :

  • Soft Heap : Bernard Chazelle의 오류율이 최적 인 대략적인 우선 순위 대기열 :이 데이터 구조는 배열을 사용하지 않으므로 #haskell IRC 채널 그 이후의 스택 오버 플로우 사용자를 먼저 유혹했지만deleteo (lg n) , 이는 일반적으로 기능적 설정에서는 불가능하며 명령형 상각 분석으로 순전히 기능적 설정에서는 유효하지 않습니다.

  • O (1) 핑거 업데이트로 균형 잡힌 이진 검색 트리 . 에서 데이터 구조가 영구 만들기 , 제임스 R 스콜, 닐 Sarnak, 다니엘 D. Sleator, 로버트 E. Tarjan는 지속적인 업데이트는 O (1) 공간이 필요 있도록 레드 - 블랙 트리의 노드를 그룹화하는 방법을 제시한다. Tarjan, Kaplan 및 Mihaescu가 설계 한 순전히 기능적인 deque와 핑거 트리는 모두 매우 유사한 그룹화 기술을 사용하여 양쪽 끝에서 O (1) 업데이트를 허용합니다. Athanasios K. Tsakalidis의 지역화 된 검색위한 AVL 트리 도 비슷하게 작동합니다.

  • 페어링 힙에 대한 빠른 페어링 힙 또는 더 나은 경계 : Okasaki의 책이 출판 된 이후, 필수적 페어링 힙의 몇 가지 새로운 분석을 포함, 등장 O와 페어링 힙 (N 로그 기록) 비용 감소 므르 Elmasry로와 페어링 힙의 최종 분석을 향해 로를 세스 쁘띠 이 작업 중 일부를 오카 사키의 게으른 페어링 힙에 적용 할 수 있습니다.

  • 결정적 바이어스 손가락 나무는 :에서 바이어스 건너 뛰기 목록 아미타 Bagchi, 아담 L. Buchsbaum, 마이클 T. 굿 리치에 의해, 디자인은 결정 론적 편견 스킵 목록을 제시한다. 위에서 언급 한 건너 뛰기 목록 / 트리 변환을 통해 결정적인 바이어스 검색 트리를 만들 수 있습니다. 병합 가능한 사전 에서 John Iacono와 Özgür Özkan이 설명한 손가락 바이어스 건너 뛰기 목록은 바이어스 건너 뛰기 트리에서 가능할 수 있습니다. 바이어스 된 핑거 트리는 Demaine et al. 시도에서 손가락 업데이트의 시간과 공간을 줄이는 방법으로 순전히 기능적인 시도 (위 참조)에 대한 논문에서

  • 문자열 B- 트리 : Paolo Ferragina와 Roberto Grossi의 외부 메모리 및 응용 프로그램에서 문자열 검색을위한 새로운 데이터 구조 는 시도와 B- 트리의 이점을 결합한 잘 연구 된 데이터 구조입니다.


5
이 답변에서 "커뮤니티 위키"상자를 체크하는 것을 기억하지 않습니다. 이를 취소 할 수있는 방법이 있습니까?
jbapple

7
@jbapple : 일정 수의 수정 후 모든 게시물이 커뮤니티 위키가됩니다. 거기에 대한 철저한 검토입니다. 감사합니다.
Phil Miller

29
훌륭한 목록! 오카 사키가 제 2 판을 출판하기를 바랍니다.
Radu GRIGore

4
Isabelle / HOL은 SML, OCaml, Haskell, Scala에 대한 코드를 생성 할 수 있습니다. Haskabelle 도구는 Haskell을 Isabelle / HOL로 가져올 수도 있습니다.
Makarius

2
"프로그램 추출"이라는 용어는 Coq 중 하나입니다. 당신은 건설적인 증거를 취하고 그로부터 실행 가능한 프로그램을 만들어 어떤 것들을 제거합니다. Isabelle에서는이를 "코드 생성"이라고 하며 증거가 아닌 의사 코드로 HOL 사양 을 사용하여 다르게 작동합니다 . Berghofer에 따르면 Isabelle / HOL에서 증명 추출은 Coq와 같이 작동하지만 요즘에는 거의 사용되지 않습니다.
Makarius

63

이미 훌륭한 노트에 Zippers를 추가하겠습니다 .

Huet, Gerard. "기능성 진주 : 지퍼"기능 프로그래밍 저널 7 (5) : 549-554, 1997 년 9 월.

Wikipedia : 지퍼 (데이터 구조)


4
지퍼는 굉장합니다. 많은 사용 사례, 그들은 트리 기반의 표현이 조금 더 복잡한 것, 그렇지 않으면 다양한 종류의 데이터에 대해 "오른쪽"선택 될 수 있도록
카터 Tazio Schonwald

1
XML 조작에 사용하는 예 : anti-xml.org/zippers.html
기계식 달팽이

40

Conchon, Filliatre, 지속적인 UNION-FIND 데이터 구조 및 반영구적 데이터 구조 .


와, 끊임없는 UNION-FIND! 감사!
jkff

3
글쎄요 ... 기사를 참조하십시오.
Radu GRIGore

1
... 또는 원하는 경우 일부 코드 (Matt Parkinson 제공) github.com/septract/jstar/blob/master/src/utils/…
Radu GRIGore

5
이제 왜 ".."라는 의견이 공감대에 빠졌는지 알 수 있습니다. 거의 독점적으로 지속성을 사용하지 않거나 항상 역 추적하는 경우에만 우수한 성능을 발휘합니다. "새"버전과 "오래된"버전을 자주 사용하는 경우 문제가 발생합니다. 근사한 근본 아이디어.
jkff

라두의 링크는 지금에서 찾을 수 있습니다 github.com/septract/jstar-old/blob/...
jbapple


14

레인지 맵

특수한 데이터 구조이지만 속성이 약간 다른 Martin Erwig의 DIET을 대신 할 수 있으므로 적어도 하나의 기존 데이터 구조와 비교할 수 있습니다. DIET 자체는 1998 년 JFP의 기사에 설명되었으므로 순수 기능적 데이터 구조에는 포함되어 있지 않을 수 있습니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.