Có gì mới trong cấu trúc dữ liệu chức năng thuần túy kể từ Okasaki?


563

Kể từ cuốn sách "Cấu trúc dữ liệu chức năng thuần túy" năm 1998 của Chris Okasaki, tôi đã không thấy quá nhiều cấu trúc dữ liệu chức năng thuần túy thú vị mới xuất hiện; Tôi chỉ có thể đặt tên cho một vài:

  • IntMap (cũng được phát minh bởi Okasaki năm 1998, nhưng không có trong cuốn sách đó)
  • Cây ngón tay (và khái quát hóa của chúng trên các đơn sắc)

Ngoài ra còn có một số cách thú vị để thực hiện các cơ sở dữ liệu đã biết, chẳng hạn như sử dụng "kiểu lồng nhau" hoặc "kiểu dữ liệu đại số tổng quát" để đảm bảo bất biến cây.

Những ý tưởng mới nào khác đã xuất hiện từ năm 1998 trong lĩnh vực này?


20
Câu hỏi hay. Tôi vừa có một sinh viên hỏi tôi về điều này, và không biết câu trả lời.
Suresh Venkat

Điều này là ổn ở đây, nhưng bạn có thể nhận được câu trả lời tốt hơn trên Stack Overflow. Nếu bạn hỏi ở đó, hãy chắc chắn và liên kết đến các cuộc thảo luận ở đây.
Charles Stewart

3
Vâng, Haskell Reddit đã thấy điều này vì vậy sẽ có một số câu trả lời hay đến từ đó nhưng câu hỏi tuyệt vời. Vừa đi được nửa cuốn sách của Okasaki tôi cũng tự hỏi chính mình. +1
Robert Massaioli


Câu trả lời:


553

Cấu trúc dữ liệu hoàn toàn chức năng mới được công bố từ năm 1998:

Được biết đến vào năm 1997, nhưng không được thảo luận trong cuốn sách của Okasaki:

  • Nhiều phong cách khác của cây tìm kiếm cân bằng . AVL, anh em, cân bằng xếp hạng, cân bằng giới hạn và nhiều cây tìm kiếm cân bằng khác có thể (và đã được) thực hiện hoàn toàn theo chức năng bằng cách sao chép đường dẫn. Có lẽ đáng được đề cập đặc biệt là:

    • Cây tìm kiếm thiên vị , của Samuel W. Bent, Daniel D. Sleator và Robert E. Tarjan : Một yếu tố quan trọng trong bài báo năm 2006 của Brodal et al. Và bài báo năm 2008 của Demaine và cộng sự.
  • Bộ vô hạn thừa nhận tìm kiếm toàn diện nhanh chóng , bởi Martín Escardó : Có lẽ không phải là cấu trúc dữ liệu mỗi se .

  • Ba thuật toán trên Braun Plants , của Chris Okasaki : Cây Braun cung cấp nhiều hoạt động ngăn xếp trong trường hợp xấu nhất O (lg n). Ràng buộc này bị vượt qua bởi nhiều cấu trúc dữ liệu khác, nhưng cây Braun có mộtconsthao tác lười biếng trong đối số thứ hai của nó và do đó có thể được sử dụng như các ngăn xếp vô hạn theo một số cách mà các cấu trúc khác không thể.

  • Heap tối thiểu thoải mái: Hàng đợi ưu tiên hai đầu có thể kết hợpHeap KD: Hàng đợi ưu tiên đa chiều hiệu quả , bởi Yuzheng Đinh và Mark Allen Weiss : Những điều này xảy ra hoàn toàn là chức năng, mặc dù điều này không được thảo luận trong các bài báo . Tôi không nghĩ rằng giới hạn thời gian đạt được là tốt hơn bất kỳ giới hạn nào có thể đạt được bằng cách sử dụng cây ngón tay (của Hinze & Paterson hoặc Kaplan & Tarjan) làm hàng đợi ưu tiên k chiều, nhưng tôi nghĩ rằng các cấu trúc của Ding & Weiss sử dụng ít không gian hơn .

  • The Zipper , bởi Gérard Huet : Được sử dụng trong nhiều cấu trúc dữ liệu khác (như cây ngón tay của Hinze & Paterson), đây là một cách để biến cấu trúc dữ liệu từ trong ra ngoài.

  • Danh sách khác biệtdanh sách có thể thay đổi O (1) với phép biến đổi O (n) thành consdanh sách thông thường . Chúng rõ ràng đã được biết đến từ thời cổ đại trong cộng đồng Prolog, nơi chúng có phép biến đổi O (1) thành conscác danh sách thông thường . Phép biến đổi O (1) dường như là không thể trong lập trình chức năng truyền thống, nhưng sự trừu tượng hóa lỗ của Minamide , từ POPL '98, thảo luận về cách cho phép nối O (1) và biến đổi O (1) trong lập trình hàm thuần túy. Không giống như các triển khai lập trình chức năng thông thường của các danh sách khác nhau, dựa trên các lần đóng chức năng, các tóm tắt lỗ về cơ bản là giống nhau (cả về cách sử dụng và cách thực hiện của chúng) như danh sách khác biệt của Prolog. Tuy nhiên, dường như trong nhiều năm, người duy nhất nhận thấy điều này làmột trong những người đánh giá của Minamide .

  • Từ điển đại diện duy nhất hỗ trợ chèn, cập nhật và tra cứu với hạn chế là không có hai cấu trúc giữ các thành phần giống nhau có thể có hình dạng riêng biệt. Để đưa ra một ví dụ, các danh sách liên kết đơn được sắp xếp được trình bày duy nhất, nhưng cây AVL truyền thống thì không. Tries cũng được đại diện duy nhất. Tarjan và Sundar, trong "Các biểu diễn cây tìm kiếm nhị phân duy nhất và kiểm tra tính bằng nhau của các tập hợp và trình tự" , đã cho thấy một từ điển đại diện duy nhất có chức năng duy nhất hỗ trợ các tìm kiếm trong thời gian logarit và cập nhật theo thời gian . Tuy nhiên, nó sử dụng không gian . Có một đại diện đơn giản sử dụng cây Braun chỉ sử dụng không gian tuyến tính nhưng có thời gian cập nhật làΘ(nlgn)Θ(O(n)Θ(nlgn)Θ(lg2n)Θ(nlgn) và thời gian tìm kiếm củaΘ(lg2n)

Chủ yếu là các cấu trúc dữ liệu chức năng, trước, trong và sau cuốn sách của Okasaki:

  • Nhiều thủ tục để làm cho cấu trúc dữ liệu bền bỉ, hoàn toàn bền bỉ hoặc liên tục liên tục : Haim Kaplan đã viết một cuộc khảo sát tuyệt vời về chủ đề này . Xem thêm ở trên công trình của Demaine và cộng sự, người chứng minh một mảng hoàn toàn bền bỉ trong không gian (trong đó là số lượng hoạt động từng được thực hiện trên mảng) và thời gian truy cập dự kiến .m O ( lg lg n )O(m)mO(lglgn)

  • 1989: Cây tìm kiếm ngẫu nhiên của Cecilia R. Aragon và Raimund Seidel : Chúng được thảo luận trong một bối cảnh hoàn toàn chức năng của Guy E. Blelloch và Margaret Reid-Miller trong các hoạt động tập hợp nhanh bằng cách sử dụng Treaps và bởi Dan Blandford và Guy Blelloch trong Bộ điều hành chức năng với Treaps ( ). Họ cung cấp tất cả các hoạt động của các đầu ngón tay hoàn toàn chức năng và các cây tìm kiếm thiên vị, nhưng đòi hỏi một nguồn ngẫu nhiên, làm cho chúng không hoàn toàn hoạt động. Điều này cũng có thể làm mất hiệu lực độ phức tạp thời gian của các hoạt động trên các treap, giả sử một kẻ thù có thể điều hành thời gian và lặp lại các hoạt động dài. (Đây là cùng một lý do tại sao các đối số khấu hao bắt buộc không hợp lệ trong một cài đặt liên tục, nhưng nó đòi hỏi một đối thủ với đồng hồ bấm giờ)

  • 1997: Skip-cây, một cấu trúc dữ liệu thay thế cho danh sách Bỏ qua theo cách tiếp cận đồng thời , bởi Xavier Messeguer và Khám phá tính hai mặt giữa Danh sách bỏ qua và Cây tìm kiếm nhị phân , bởi Brian C. Dean và Zachary H. Jones : Danh sách bỏ qua không hoàn toàn chức năng, nhưng chúng có thể được thực hiện chức năng như cây. Giống như treaps, chúng đòi hỏi một nguồn bit ngẫu nhiên. (Có thể lập danh sách bỏ qua xác định, nhưng, sau khi dịch chúng sang cây, tôi nghĩ rằng chúng chỉ là một cách khác để xem 2-3 cây.)

  • 1998: Tất cả các cấu trúc được khấu hao trong cuốn sách của Okasaki! Okasaki đã phát minh ra phương pháp mới này để trộn khấu hao và cấu trúc dữ liệu chức năng, trước đây được cho là không tương thích. Nó phụ thuộc vào việc ghi nhớ, mà, như Kaplan và Tarjan đôi khi đã đề cập, thực sự là một tác dụng phụ. Trong một số trường hợp ( chẳng hạn như PFDS trên SSD vì lý do hiệu suất ), điều này có thể không phù hợp.

  • 1998: Các danh sách có thể thay đổi liên tục đơn giản , bởi Haim Kaplan, Chris Okasaki, và Robert E. Tarjan : Sử dụng sửa đổi dưới mui xe để đưa ra các công cụ có thể thay thế O (1) được khấu hao, trình bày giao diện giống như trước đó (hoàn toàn là chức năng ghi nhớ ) phiên bản xuất hiện trong cuốn sách của Okasaki. Kaplan và Tarjan trước đó đã tạo ra một cấu trúc trường hợp xấu nhất hoàn toàn có chức năng O (1), nhưng về cơ bản thì nó phức tạp hơn.

  • 2007: Như đã đề cập trong một câu trả lời khác trên trang này, các cấu trúc dữ liệu bán liên tụcliên kết tìm kiếm liên tục của Sylvain Conchon và Jean-Christophe Filliâtre

Kỹ thuật xác minh cấu trúc dữ liệu chức năng, trước, trong và sau cuốn sách của Okasaki:

Các cấu trúc dữ liệu hoặc phân tích bắt buộc không được thảo luận trong cuốn sách của Okasaki, nhưng liên quan đến các cấu trúc dữ liệu chức năng thuần túy:

  • Heap mềm: Hàng đợi ưu tiên gần đúng với tỷ lệ lỗi tối ưu , bởi Bernard Chazelle : Cấu trúc dữ liệu này không sử dụng mảng và do đó đã cám dỗ đầu tiên kênh #haskell IRC sau đó là người dùng Stack Overflow , nhưng nó bao gồmdeletetrong o (lg n) , thường không thể thực hiện được trong cài đặt chức năng và phân tích khấu hao bắt buộc, không hợp lệ trong cài đặt chức năng thuần túy.

  • Cây tìm kiếm nhị phân cân bằng với cập nhật ngón tay O (1) . Trong việc tạo cấu trúc dữ liệu liên tục , James R Driscoll, Neil Sarnak, Daniel D. Sleator và Robert E. Tarjan trình bày một phương pháp để nhóm các nút trong một cây đen đỏ để các cập nhật liên tục chỉ cần không gian O (1). Tất cả các công cụ và cây ngón tay hoàn toàn chức năng được thiết kế bởi Tarjan, Kaplan và Mihaescu đều sử dụng một kỹ thuật phân nhóm rất giống nhau để cho phép cập nhật O (1) ở cả hai đầu. Cây AVL để tìm kiếm địa phương bởi Athanasios K. Tsakalidis hoạt động tương tự.

  • Đống cặp đôi nhanh hơn hoặc giới hạn tốt hơn cho đống cặp đôi : Kể từ khi cuốn sách Okasaki được xuất bản, một số phân tích mới của đống cặp mệnh lệnh đã xuất hiện, trong đó có đống Ghép với O (log log n) giảm chi phí bằng cách Amr Elmasry và Hướng tới một phân tích cuối cùng của Pairing Heaps bởi Seth Pettie. Có thể áp dụng một số công việc này vào đống ghép lười biếng của Okasaki.

  • Cây ngón tay thiên vị xác định : Trong Danh sách bỏ qua thiên vị, của Amitabha Bagchi, Adam L. Buchsbaum và Michael T. Goodrich, một thiết kế được trình bày cho danh sách bỏ qua thiên vị xác định. Thông qua danh sách bỏ qua / chuyển đổi cây được đề cập ở trên, có thể tạo ra các cây tìm kiếm sai lệch xác định. Các danh sách bỏ qua thiên vị ngón tay được mô tả bởi John Iacono và zgür zkan trong Từ điển hợp nhất có thể có thể trên các cây bỏ qua thiên vị. Một cây ngón tay thiên vị được đề xuất bởi Demaine et al. trong bài viết của họ về các lần thử hoàn toàn chức năng (xem ở trên) như một cách để giảm thời gian - và giới hạn không gian trên cập nhật ngón tay trong các lần thử.

  • Cây chuỗi B: Cấu trúc dữ liệu mới cho tìm kiếm chuỗi trong bộ nhớ ngoài và các ứng dụng của nó bởi Paolo Ferragina và Roberto Grossi là cấu trúc dữ liệu được nghiên cứu kỹ lưỡng kết hợp lợi ích của cây cố và cây B.


5
Tôi không nhớ đã đánh dấu vào ô "wiki cộng đồng" trong câu trả lời này. Có cách nào để hoàn tác điều đó?
jbapple

7
@jbapple: sau một số lần chỉnh sửa nhất định, tất cả các bài đăng đều trở thành wiki cộng đồng. Đó là một đánh giá kỹ lưỡng ấn tượng ở đó. Cảm ơn bạn.
Phil Miller

29
Danh sách tuyệt vời! Điều đó khiến tôi ước Okasaki sẽ xuất bản phiên bản thứ hai.
Radu GRIGore

4
Lưu ý rằng Isabelle / HOL có thể tạo mã cho SML, OCaml, Haskell, Scala. Công cụ Haskabelle cũng có thể nhập Haskell vào Isabelle / HOL.
Makarius

2
Thuật ngữ của "trích xuất chương trình" là một trong Coq: bạn lấy một bằng chứng mang tính xây dựng và tạo ra một chương trình thực thi từ nó, tước đi một số thứ. Trong Isabelle, đây được gọi là "tạo mã" và hoạt động khác nhau, sử dụng các đặc tả HOL làm mã giả, không phải là bằng chứng. Khai thác bằng chứng trong Isabelle / HOL theo Berghofer không hoạt động như Coq, nhưng hiếm khi được sử dụng trong những ngày này.
Makarius

63

Để ghi chú tuyệt vời đã được thực hiện, tôi sẽ thêm Dây kéo .

Huet, Gerard. Viên ngọc chức năng của hoàng tử: Tạp chí Zipper của Tạp chí lập trình chức năng 7 (5): 549-554, tháng 9 năm 1997.

Wikipedia: Zipper (cấu trúc dữ liệu)


4
Khóa kéo là TUYỆT VỜI. Đối với nhiều trường hợp sử dụng, chúng cho phép các biểu diễn dựa trên cây trở thành lựa chọn "đúng" cho nhiều loại dữ liệu trong khi nếu không thì sẽ phức tạp hơn một chút
Carter Tazio Schonwald

1
Một ví dụ về việc sử dụng chúng để thao tác XML: anti-xml.org/zippers.html
Ốc cơ khí

40

Wow, một ĐOÀN KẾT dai dẳng! Cảm ơn!
jkff

3
Chà, loại ... Xem bài viết.
Radu GRIGore

1
... hoặc, nếu bạn thích, hãy xem một số mã (của Matt Parkinson) github.com/septract/jstar/blob/master/src/utils/
trộm

5
Bây giờ tôi thấy lý do tại sao bình luận "loại .." có một upvote. Chúng chỉ có hiệu suất tốt khi hầu như không sử dụng bền bỉ hoặc quay lui mọi lúc: nếu bạn thường sử dụng cả hai phiên bản "mới" và "cũ", bạn sẽ bị lừa. Ý tưởng khởi động lại mát mẻ mặc dù.
jkff

Liên kết của Radu hiện có thể được tìm thấy tại github.com/septract/jstar-old/blob/
mẹo

20

Tôi muốn thêm phiên bản khóa kéo của McBride làm dẫn xuất của các loại dữ liệu.


Tôi yêu những thứ đó. Thật tuyệt vời khi công cụ phái sinh có một ứng dụng rất khác so với việc tìm kiếm tỷ lệ thay đổi!
SamB

3
SamB, bạn cũng có thể quan tâm đến các dẫn xuất của biểu thức chính quy (nếu bạn chưa biết về chúng).
jbapple


14

Rangemaps

Nó là một cấu trúc dữ liệu chuyên biệt, nhưng nó có thể được sử dụng thay thế cho DIET của Martin Erwig, với các thuộc tính hơi khác nhau, vì vậy ít nhất có một cấu trúc dữ liệu hiện có để so sánh với nó. Bản thân DIET đã được mô tả trong một bài báo trên JFP vào năm 1998, vì vậy có lẽ nó không được bao gồm trong Cấu trúc dữ liệu chức năng thuần túy.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.