Các thuật toán bậc cao


35

Hầu hết các thuật toán nổi tiếng là thứ nhất, theo nghĩa là đầu vào và đầu ra của chúng là dữ liệu "đơn giản". Một số là thứ tự thứ hai theo cách tầm thường, ví dụ như sắp xếp, hàm băm hoặc hàm và bản đồ: chúng được tham số hóa bởi một hàm, nhưng chúng không thực sự làm gì thú vị với nó ngoại trừ gọi nó trên các phần của dữ liệu đầu vào khác.

Một số cũng là thứ hai nhưng có phần thú vị hơn:

  • Ngón tay được tham số hóa bởi các đơn sắc
  • Tách một ngón tay trên một vị ngữ đơn điệu
  • Các thuật toán tổng tiền tố, một lần nữa thường được tham số hóa bởi một đơn vị hoặc một vị ngữ, v.v.

Cuối cùng, một số thứ tự "thực sự" cao hơn theo nghĩa thú vị nhất đối với tôi:

  • Tổ hợp Y
  • Danh sách khác biệt

Có tồn tại các thuật toán bậc cao không cần thiết khác không?

Trong nỗ lực làm rõ câu hỏi của tôi, theo "đơn hàng cao hơn không cần thiết", ý tôi là "sử dụng các phương tiện bậc cao của hình thức tính toán theo cách thức quan trọng trong giao diện và / hoặc triển khai thuật toán"


3
Tôi đã hỏi một cái gì đó tương tự một lần. Một vài câu trả lời ở đây: caml.inria.fr/pub/ml-archives/caml-list/2004/09/ săn
Radu GRIGore

Các bạn có nói về các thuật toán lấy thuật toán và / hoặc trả về thuật toán không?
Pratik Deoghare

Câu trả lời:


13

Có rất nhiều hàm bậc cao hơn trên http://math.andrej.com/ , ví dụ như trong bài viết về số mũ đôi , loại Haskell sau xuất hiện (với các từ đồng nghĩa loại được mở rộng):

shift :: Bool -> ((Int -> Bool) -> Bool) -> ((Int -> Bool) -> Bool)

Bạn cũng có thể có rất nhiều niềm vui với bài đăng A Haskell Monad for Infinite Search in Finite Time - ví dụ:

newtype S a = S ((a -> Bool) -> a)
bigUnion :: S (S a) -> S a

Tôi đoán loại bigUnion là thứ 4 hoặc thứ 5!


22

có một loạt các thuật toán là "thứ 2 thực sự" mặc dù thường không được mô tả rõ ràng trong các thuật ngữ này. Bất cứ khi nào chúng ta có các thuật toán thời gian tuyến tính phụ, ẩn là một loại truy cập tiên tri vào đầu vào, tức là thực sự coi đầu vào là một hàm.

Ví dụ:

(1) Các thuật toán Ellipsoid khi làm việc với "tiên tri tách" (ví dụ: http://math.mit.edu/~vempala/18.433/L18.pdf )

(2) Tối thiểu hóa chức năng mô đun (ví dụ: http : //people.c Commerce.ubc.ca/facemony/mccormick/sfmchap8a.pdf )

(3) Toàn bộ lĩnh vực kiểm tra tài sản thực sự thuộc dạng này ( http://www.wisdom.weizmann.ac.il/~oding/test.html )

(4) Đấu giá kết hợp trong mô hình truy vấn (ví dụ: http://pluto.huji.ac.il/~blumrosen/ con /iter.pdf )


15

Có một câu trả lời khác cho câu hỏi này: không có câu trả lời nào. Cụ thể hơn, bất kỳ thuật toán bậc cao nào (có thể thực hiện được) như vậy đều tương đương về mặt cơ học với thuật toán bậc nhất, sử dụng hàm khử .

Hãy để tôi chính xác hơn: trong khi thực sự có các thuật toán bậc cao thực tế, trong thực tế, luôn có thể viết lại mỗi trường hợp như một chương trình hoàn toàn đầu tiên. Nói cách khác, không có chương trình bậc cao bão hòa - về cơ bản vì đầu vào / đầu ra của chương trình là các chuỗi bit. [Vâng, những chuỗi bit đó có thể đại diện cho các chức năng, nhưng đó là điểm chính: chúng đại diện cho các chức năng, chúng không phải là các chức năng].

Các câu trả lời đã được đưa ra là tuyệt vời, và câu trả lời của tôi không nên được coi là mâu thuẫn với chúng. Nó nên được coi là trả lời câu hỏi từ trong một bối cảnh lớn hơn một chút (các chương trình hoàn chỉnh thay vì các thuật toán độc lập). Và sự thay đổi bối cảnh này thay đổi câu trả lời khá triệt để. Quan điểm của câu trả lời của tôi là nhắc nhở mọi người về điều này, điều này quá dễ để quên.


Tôi đồng ý rằng bất kỳ thuật toán bậc cao nào cũng tương đương với một số thuật toán bậc nhất có cùng đặc điểm kỹ thuật bên ngoài, nhưng điều này không ngăn cản chúng ta tranh luận về các thuộc tính bên trong của chúng. Không có sự khác biệt giữa đại diện cho một cái gì đó và là một cái gì đó.
jkff

1
@jkff: Tôi đồng ý với quan điểm đầu tiên của bạn - chúng tôi chắc chắn nên thảo luận về các thuộc tính nội bộ này. Tôi hoàn toàn không đồng ý với điểm thứ hai: bằng cách nào đó bạn cho rằng các phần mở rộng và các mức độ là "giống nhau", điều này hoàn toàn sai. [Nhắc tôi về bức tranh Matisse 'đây không phải là một đường ống']
Jacques Carette

À, vâng, "Sự phản bội của chuyển đổi Eta". (\\() -> "Ceci n'est pas une fonction") ()
CA McCann

Tôi khẳng định rằng nếu hai thứ tương đương (bằng cách đại diện cho nhau), bạn không thể phủ nhận sự tồn tại của một trong số chúng :)
jkff

@jkff: khó đồng ý với điều đó!
Jacques Carette

13

Trong các thư viện kết hợp bộ phân tích cú pháp, thứ tự của hàm nói chung là khá cao. Kiểm tra các hàm bậc cao hơn để phân tích cú pháp hoặc tại sao mọi người sẽ muốn sử dụng hàm thứ sáu? của Chris Okasaki. Tạp chí lập trình chức năng , 8 (2): 195-199, tháng 3 năm 1998.


Đây là một bài báo tuyệt vời, nhưng không hoàn toàn là điều mà tôi đang tìm kiếm. Mặc dù các tổ hợp có thứ tự cao hơn, chúng rất đơn giản và độc lập, và bất kỳ một trong số chúng hầu như không được tính là một thuật toán / cơ sở hạ tầng không tầm thường (tuy nhiên, có lẽ chính các trình phân tích cú pháp kết hợp sẽ). Ngược lại, bộ kết hợp Y là một thuật toán không cần thiết để tìm một điểm cố định và các danh sách khác biệt là một cơ sở hạ tầng thông minh được xây dựng hoàn toàn từ các hàm bậc cao hơn. (Tôi không làm suy yếu câu trả lời của bạn, chỉ cố gắng làm rõ câu hỏi của tôi)
jkff

13

Phân tích tính toán đặc trưng cho các số thực theo chương trình, vì các số thực chứa một lượng thông tin không giới hạn, và do đó các thao tác trên các số thực có thứ tự cao hơn theo nghĩa câu hỏi. Thông thường, các số thực được trình bày bằng cách sử dụng chế độ xem tô pô trên luồng bit vô hạn, không gian Cantor, cho vay đối với lĩnh vực cấu trúc liên kết tính toán rộng hơn.

Klaus Weihrach đã nói về điều này như là hệ thống phân cấp hiệu quả loại hai của cấu trúc liên kết tính toán. Để biết thêm về điều này, hãy xem Weihrach & Grubba, 2009, Cấu trúc liên kết tính toán cơ bản và tại trang nghiên cứu của John Tucker, Tính toán với dữ liệu tô pô . Tôi đề cập đến trang Tucker trong câu hỏi của tôi, Ứng dụng của Cantor Space .


Và điều này mở rộng khá tự nhiên cho các đối tượng toán học có thể tính toán nói chung: các số tính toán khác (không nhất thiết là số thực), các phần tử tính toán của các nhóm vô hạn (vòng, đại số, ...), các điểm tính toán trong không gian, v.v. Trong tất cả các trường hợp như vậy, thuật toán lý thuyết liên quan đến việc trích xuất thông tin từ biểu diễn chức năng (về cách tính toán đối tượng toán học) chứ không phải từ chính đối tượng.
ex0du5

13

Một mô-đun của chức năng liên tục là một bản đồ mchấp nhận chức năng (liên tục) F : (nat -> nat) -> natvà đưa ra một số ksao cho F f = F gbất cứ khi nào f i = g icho tất cả i < k. Có các thuật toán để tính toán mô đun liên tục (không phải là rất hiệu quả), do đó, nó làm cho nó trở thành một ví dụ của thuật toán bậc 3.


9

Để bổ sung cho câu trả lời của Noam , cũng có một số tình huống quan trọng là phải có đầu ra (một biểu diễn rõ ràng) của một hàm.

C:0,1n0,1mA (α,L,ϵ)CnAM1,,ML

w0,1m,PrA[m, (Ag(C(m),w)α i[L], j[n], PrMi[Mi(j)=mj]1ϵ)]2/3

AgA2/3ϵmmα


5

Trong các thuật toán đồ thị, các đỉnh và các cạnh thường được coi là dữ liệu đơn giản nhưng chúng thực sự có thể được khái quát hóa một cách hiệu quả để chúng được lập trình theo yêu cầu.

Trong tiến sĩ của tôi (về hóa học tính toán), tôi đã triển khai nhiều thuật toán đồ thị ở dạng bậc cao hơn để áp dụng chúng vào phân tích đồ thị ẩn, chủ yếu là vì đồ thị thực tế của tôi là vô hạn nên tôi không đủ khả năng để lưu trữ chúng một cách rõ ràng! Cụ thể, tôi đang nghiên cứu cấu trúc liên kết của các vật liệu vô định hình được biểu thị dưới dạng 3D của các ô đơn vị (siêu lớp).

Ví dụ: bạn có thể viết một hàm để tính toán lớp vỏ lân cận gần thứ n của một đỉnh gốc inhư thế này:

nth i 0 = {i}
nth i 1 = neighbors i
nth i n = diff (diff (fold union empty (map neighbors (nth i (n-1)))) (nth i (n-1))) (nth i (n-2))

trong đó neighborsmột hàm trả về tập hợp các đỉnh lân cận với đỉnh đã cho.

Ví dụ: mạng ô vuông 2D:

neighbors (x, y) = {(x-1, y), (x+1, y), (x, y-1), (x, y+1)}

Các thuật toán thú vị khác trong bối cảnh này bao gồm số liệu thống kê vòng đường đi ngắn nhất của Franzblau.


Điều này đưa tôi đến một câu hỏi tôi đã có một lần. Nếu có những cách lập trình xác định đồ thị theo cách này, thì có cách nào để xác định đồ thị nghịch lý tự tham chiếu không?
Suresh Venkat

1
{x:xx}{x:xx}

Chắc chắn rồi. Nhưng đó có phải là một biểu đồ tự tham khảo ?
Suresh Venkat

@Suresh: Đây là một biểu đồ được xác định theo ngôn ngữ chức năng theo nghĩa là có một loại Uđỉnh và chức năng U -> U -> Boolcủa các cạnh.
sdcvvc
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.