Có một khái niệm cho một thuật toán tính toán một hàm bằng cách trước tiên tìm một thuật toán khác không?


14

Nếu tôi hiểu chính xác, thuật toán tính giá trị của hàm thực có độ phức tạp tính toán O ( g ( n ) ) nếu sau đây giữ: Khi chúng ta tính f với độ chính xác δ yêu cầu theo thứ tự các bước g ( n ) .fO(g(n))fδg(n)

Tuy nhiên, điều gì sẽ xảy ra nếu chúng ta có một thuật toán đầu tiên "tìm ra thuật toán hiệu quả hơn để tính ", sau đó tính f ?ff

Nói cách khác, điều gì xảy ra nếu chúng ta có một thuật toán thực hiện như sau:Một

  1. Tìm một thuật toán hiệu quả để tính toán f .Bf

  2. sử dụng để tính f .Bf

Trong trường hợp đó, chúng ta không còn có thể nói về thời gian tính toán cần thiết để tính , vì nó hoàn toàn phụ thuộc vào việc Thuật toán A đã tìm thấy thuật toán B chưa . Nói cách khác, thời gian tính toán cần thiết để tính f ( 5 ) nếu 5 là số được tính toán đầu tiên lớn hơn nhiều so với thời gian tính toán cần thiết để tính f ( 5 ) sau khi f ( 3 ) đã được tính.f(5)MộtBf(5)5f(5)f(3)

Câu hỏi của tôi là, có một khái niệm / lý thuyết về loại thuật toán này lần đầu tiên tìm thấy một thuật toán khác trước khi tính toán một hàm không? Cụ thể tôi đang tự hỏi về phân tích độ phức tạp tính toán của các thuật toán như vậy.


1
Bạn có thể nói Mathicala về cơ bản làm những gì bạn đang yêu cầu? Bạn đưa ra phương trình để giải và nó tự động tìm ra thuật toán nào sẽ sử dụng để giải các phương trình đó, sau đó giải chúng.
dùng541686

Hãy xem itu.dk/people/sestoft/pebook , nó có liên quan.
Nathan Ringo

Câu trả lời:


18

Có một thuật toán nổi tiếng, thuật toán tìm kiếm phổ quát của Levin, có chế độ hoạt động giống hệt nhau. Ví dụ, xem xét vấn đề tìm một bài tập thỏa mãn cho một công thức được đảm bảo là thỏa đáng. Tìm kiếm phổ quát của Levin chạy song song tất cả các thuật toán tiềm năng và nếu bất kỳ thuật toán nào đưa ra một phép gán thỏa mãn, hãy dừng và xuất ra phép gán này. Nếu thuật toán tối ưu cho sự cố chạy trong thời gian , thì thuật toán của Levin chạy trong thời gian O ( f ( n ) ) (với hằng số rất lớn có thể) nếu được triển khai chính xác.f(n)Ôi(f(n))

Mặc dù thuật toán của Levin là không thực tế (do các hằng số lớn có liên quan), nhưng về mặt lý thuyết thì nó rất thú vị. Xem bài viết của Học viện để biết thêm về tìm kiếm phổ quát.


10

Giả sử chúng ta có một hàm flấy một đối số xcủa kiểu Avà xuất ra một hàm khác lấy một đối số ycủa kiểu Bvà trả về kết quả của kiểu C. Theo cách nói của bạn, flấy một đối số xvà trả về một "thuật toán" lấy đầu vào của loại Bvà kết quả đầu ra của loại C.

Hàm fcó kiểu

A → (B → C)

Thật vậy, nó có x : Avà trả về một hàm kiểu B → C. Nhưng như vậy flà tương đương với một chức năng g : A × B → Cmất cả hai xycùng một lúc và cung cấp cho bạn kết quả cuối cùng. Thật vậy, có một sự đẳng cấu giữa các loại

A → (B → C)

A × B → C

bởi vì chúng ta có thể định nghĩa gvề fnhư

g(x, y) := f(x)(y)

và chúng ta có thể xác định fvề mặt gnhư

f(x) := (y ↦ g(x,y))

Hoạt động chuyển từ gđến fđược gọi là currying và các lập trình viên chức năng sử dụng nó mọi lúc. Trong lý thuyết tính toán, ý tưởng lấy một đầu vào và đầu ra một hàm (thuật toán) được thể hiện trong định lý smn .

Câu trả lời cho câu hỏi của bạn là "có, mọi người làm điều này mọi lúc". Nhưng cũng có một đạo đức: một thuật toán tìm ra thuật toán vẫn chỉ là một thuật toán.


1
+1 cho câu cuối cùng đó. Nói hay lắm.
John Coleman

"Một thuật toán tìm ra thuật toán vẫn chỉ là một thuật toán". Vâng, đó là sự thật, nhưng có một sự khác biệt cơ bản. Nếu thuật toán "trực tiếp" tính f(5)c+ccf(5)f(5)c1+c2c1c2c1>c2

@ Lập trình2134 tối ưu hóa trình biên dịch sẽ là khái niệm bạn quan tâm? Tôi không chắc chắn về lý thuyết đằng sau điều này (đặc biệt là sự tương tác của nó với lý thuyết phức tạp), nhưng đây có thể là một ví dụ tiềm năng
Đánh dấu

Từ thông dụng cần tìm là "đánh giá một phần".
Andrej Bauer
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.