2012-06-10 31 views
11

Đặt tính toán bao gồm các công đoàn, nút giao và sự khác biệt thường có thể được diễn tả theo nhiều cách khác nhau. Có bất kỳ lý thuyết hoặc triển khai cụ thể nào cố gắng giảm thiểu số lượng tính toán cần thiết để đạt được một câu trả lời nhất định không? Ví dụ, lần đầu tiên tôi nhìn thấy một ứng dụng thực tế của điều này khi cố gắng phân hủy các nguyên tử trong mô phỏng vật liệu vô định hình thành vỏ láng giềng nơi vỏ đầu tiên là hàng xóm ngay lập tức của một số nguyên tử gốc và vỏ thứ hai là các nguyên tử là hàng xóm của vỏ đầu tiên không có trong vỏ đầu tiên hoặc vỏ trước đó:Bộ chức năng thông minh hoàn toàn

nth 0 = singleton i 
nth 1 = neighbors i 
nth n = reduce union (map neighbors (nth(n-1))) - nth(n-1) - nth(n-2) 

Có nhiều cách khác nhau để giải quyết vấn đề này. Bạn có thể từng bước kiểm tra tư cách thành viên trong mỗi bộ trong khi soạn kết quả hoặc bạn có thể tính toán liên minh của ba vỏ lân cận và sử dụng giao điểm để loại bỏ hai vỏ trước đó rời khỏi phần ngoài cùng. Trong thực tế, các giải pháp yêu cầu xây dựng các bộ trung gian lớn là chậm hơn.

Có lẽ triển khai tập hợp thông minh có thể soạn biểu thức được đánh giá và sau đó tối ưu hóa nó (ví dụ: để giảm kích thước bộ trung gian) trước khi đánh giá để cải thiện hiệu suất. Thực hiện các cài đặt như vậy có tồn tại không?

+1

Vâng, tôi đoán cơ sở dữ liệu SQL với các bảng một cột cơ bản được đặt bằng bộ tối ưu hóa ngôn ngữ truy vấn. Tôi không có ý tưởng cho dù bất kỳ người trong số họ có tối ưu hóa sẽ áp dụng cho truy vấn này, mặc dù ... hoặc thậm chí SQL là một ngôn ngữ đủ thú vị để có thể thể hiện truy vấn này. –

+1

Tôi đã xem xét một vài năm trước và câu trả lời là "không" đối với những điều này, với ngoại lệ đáng chú ý của các trình tối ưu hóa truy vấn SQL. – Gene

+2

Âm thanh như các mẫu biểu thức C++ ... – ildjarn

Trả lời

8

Câu hỏi của bạn ngay lập tức nhắc tôi về phản ứng tổng hợp dòng Haskell, được mô tả trong this paper. Nguyên tắc chung có thể được tóm tắt khá dễ dàng: Thay vì lưu trữ một danh sách, bạn lưu trữ một cách để xây dựng một danh sách. Sau đó, các hàm chuyển đổi danh sách hoạt động trực tiếp trên trình tạo danh sách, có nghĩa là tất cả các hoạt động hợp nhất thành một thế hệ dữ liệu duy nhất mà không có bất kỳ cấu trúc trung gian nào. Sau đó, khi bạn đang thực hiện các hoạt động soạn bạn chạy máy phát và tạo dữ liệu. Vì vậy, tôi nghĩ câu trả lời cho câu hỏi của bạn là nếu bạn muốn một số cơ chế thông minh tương tự kết hợp tính toán và loại bỏ cấu trúc dữ liệu trung gian, bạn cần tìm cách chuyển đổi tập hợp thành "đồng cấu trúc" (đó là những gì giấy gọi nó) mà tạo ra một bộ và hoạt động trực tiếp trên đó, sau đó thực sự tạo ra các thiết lập khi bạn đang thực hiện. Tôi nghĩ rằng có một lý thuyết rất sâu xa đằng sau khái niệm này mà giấy gợi ý nhưng không bao giờ nói ra, và nếu ai đó ở đây biết nó là gì, xin vui lòng cho tôi biết, bởi vì điều này rất phù hợp với cái gì khác tôi đang làm , quá!

+2

Vâng, điều này được gọi là * codata *. Thay vì xây dựng dữ liệu với các hàm tạo, bạn xé bỏ codata bằng "destructors". Danh sách là dữ liệu, luồng là codata. (những người yêu thích lý thuyết thể loại: dữ liệu là đại số ban đầu, codata là các kho than đầu cuối). Các số thực trực giác (như "chuỗi cauchy" N -> Q) là mã số. –

+3

Tối ưu hóa Fusion là mã hóa các thuộc tính của các đại số đồng quy đệ quy. Các luật đại số khác nhau, khi được thực hiện như viết lại trên các biểu thức, mang lại những cải tiến phức tạp. Hinze et al. bao gồm lý thuyết http://www.cs.ox.ac.uk/ralf.hinze/publications/IFL10.pdf. –

+0

Nhờ cả hai bạn. Điều này giúp vô cùng. –

Các vấn đề liên quan