크리스 오카 사키의 1998 년 책 "순전히 기능적인 데이터 구조"이후로, 나는 전혀 새로운 흥미로운 순전히 기능적인 데이터 구조가 나타나는 것을 보지 못했습니다. 나는 몇 가지 이름을 지정할 수 있습니다.
"불변 유형"또는 "일반 대수 데이터 유형"을 사용하여 트리 불변을 보장하는 등 이미 알려진 데이터 구조를 구현하는 흥미로운 방법도 있습니다.
1998 년 이후이 분야에서 어떤 다른 새로운 아이디어가 나타 났습니까?
크리스 오카 사키의 1998 년 책 "순전히 기능적인 데이터 구조"이후로, 나는 전혀 새로운 흥미로운 순전히 기능적인 데이터 구조가 나타나는 것을 보지 못했습니다. 나는 몇 가지 이름을 지정할 수 있습니다.
"불변 유형"또는 "일반 대수 데이터 유형"을 사용하여 트리 불변을 보장하는 등 이미 알려진 데이터 구조를 구현하는 흥미로운 방법도 있습니다.
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) 시간 분할을 지원하면서 인덱스, 업데이트 유지 및 원래의 불변 벡터의 삽입 속도.
다른 많은 스타일의 균형 검색 트리 . 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의 검토 자 중 하나입니다 .
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의 반영구적 데이터 구조 및 영구 조합 찾기
팬텀 유형 은 잘못된 형식의 작업을 허용하지 않는 API를 생성하는 오래된 방법입니다. Oleg Kiselyov와 Chung-chieh Shan의 Lightweight Static Capabilities 에서 정교한 사용법을 찾을 수 있습니다 .
중첩 유형 은 실제로 1998 년보다 최신이 아닙니다. 오카 사키는 심지어 그의 책에서 그것들을 사용합니다. 오카 사키의 책에없는 다른 많은 예들이 있습니다; 일부는 새롭고 일부는 오래되었습니다. 그들은 다음을 포함합니다 :
GADT 도 그다지 새로운 것은 아닙니다. 그들은 최근 Haskell과 일부 ML에 추가되었지만 1970 년대 이후 다양한 유형의 람다 계산법 에 존재한다고 생각 합니다 .
2004-2010 : 정확성을위한 Coq 및 Isabelle . 몇몇 사람들은 정리 기능을 사용하여 순전히 기능적인 데이터 구조의 정확성을 검증했습니다. Coq는 이러한 검증을 Haskell, OCaml 및 Scheme의 작업 코드로 추출 할 수 있습니다. Isabelle은 Haskell, ML 및 OCaml로 추출 할 수 있습니다.
2007 : Joshua Dunfield의 Stardust를 사용한 정제 된 유형 검사 :이 논문은 ML에 대한 정제 유형을 사용하여 SMLNJ의 적-검정 트리 삭제 기능에서 오류를 찾습니다.
2008 : Nils Anders의 순수 기능 데이터 구조 에 대한 경량 준공식 시간 복잡도 분석 Danielsson : Agda를 수동 주석과 함께 사용하여 일부 PFDS의 시간 제한을 증명합니다.
Soft Heap : Bernard Chazelle의 오류율이 최적 인 대략적인 우선 순위 대기열 :이 데이터 구조는 배열을 사용하지 않으므로 #haskell IRC 채널 과 그 이후의 스택 오버 플로우 사용자를 먼저 유혹했지만delete
o (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- 트리의 이점을 결합한 잘 연구 된 데이터 구조입니다.
이미 훌륭한 노트에 Zippers를 추가하겠습니다 .
Huet, Gerard. "기능성 진주 : 지퍼"기능 프로그래밍 저널 7 (5) : 549-554, 1997 년 9 월.
Conchon, Filliatre, 지속적인 UNION-FIND 데이터 구조 및 반영구적 데이터 구조 .
특수한 데이터 구조이지만 속성이 약간 다른 Martin Erwig의 DIET을 대신 할 수 있으므로 적어도 하나의 기존 데이터 구조와 비교할 수 있습니다. DIET 자체는 1998 년 JFP의 기사에 설명되었으므로 순수 기능적 데이터 구조에는 포함되어 있지 않을 수 있습니다.
위에 링크 된 2012 년 논문에 이어 RRB 벡터에 대한 연구는 ICFP'15에서 확장 및 출판되었습니다.
RRB 벡터 : 실용적인 범용 불변 시퀀스 http://dl.acm.org/citation.cfm?id=2784739