2013-04-10 30 views
13

Tăng hoặc bất kỳ thư viện C++ chung nào khác, cung cấp các tóm tắt semiring hoặc monoid (chẳng hạn như một lớp mẫu)?Có một sự trừu tượng tiêu chuẩn cho nửa vành hoặc monoids trong C++ không?

Tôi có một số thuật toán mà tôi muốn thể hiện dưới dạng các cấu trúc trừu tượng này, nhưng cho đến nay tôi chưa từng gặp bất kỳ điều gì. Tôi có thể viết của riêng tôi, nhưng lý tưởng là những thứ này sẽ nằm trong thư viện mà tôi đã sử dụng như là tăng cường.

Cảm ơn!

+1

Ồ, tôi nghĩ tôi chưa bao giờ nghe những lời này được áp dụng cho các vấn đề thực tế, giả sử rằng chúng được dành riêng cho việc tra tấn học sinh trong các trường cao đẳng. 1 cho rằng :) – dasblinkenlight

+0

@ dasblinkenlight Một trong những thuật toán mà tôi muốn thực hiện được viết trong cuốn sách Thuật toán của Cormen et al về mặt nửa vành và monoids :) –

+0

Ah, những kẻ này ... Sự tinh tế của họ cho cách nói là hiển thị trong việc đặt tên cho chúng cuốn sách "Giới thiệu về thuật toán" thay vì "Tất cả hầu hết các bạn sẽ cần biết về thuật toán" :) :) :) – dasblinkenlight

Trả lời

9

SGI STL có khái niệm MonoidOperation. Ví dụ: power chức năng được triển khai cho MonoidOperation.

Boost.Graph thư viện cũng xác định Monoid concept.

Ngoài already suggestedElements of Programming bạn có thể tìm đến Notes on Programming bởi Alexander Stepanov (một trong những tác giả của EOP). Ghi chú được cung cấp miễn phí và có một số trùng lặp với EoP sách.

Có phong cách chênh lệch giữa EOPGhi chú - EOP là rất ngắn gọn như sách giáo khoa toán, nhưng Ghi chú có nhiều "không chính thức" - có một số câu chuyện nhỏ vv

Vào theo cách này, cả hai có một số thảo luận về việc tham chiếu trên điện thực hiện chức năng.

P.S. có những cuộc đàm phán vĩ đại bởi Alexander Stepanov:

P.P.S. Collected Papers of Alexander A. Stepanov

7

Theo sự hiểu biết của tôi, thư viện chuẩn C++ không có bất kỳ sự trừu tượng nào xung quanh các cấu trúc này. Tuy nhiên, Alex Stepanov, nhà phát minh STL, đã viết một cuốn sách có tên là Elements of Programming, trong đó ông viết nhiều chức năng hữu ích hoạt động trên monoids, nhóm, toán tử nhị phân, chức năng đơn nhất, vv. điểm khởi đầu tốt để thăm dò thêm.

Hy vọng điều này sẽ hữu ích!

3

Boost.Operators cung cấp cách thuận tiện để xác định nhóm toán tử số học cho một lớp.

Các khái niệm được xác định trước (chỉ gõ cú pháp) bao gồm vòng, vòng đặt hàng, vòng euclide, vòng euclide có trật tự, trường và trường được sắp xếp. Bạn sẽ có thể định nghĩa các lớp của riêng bạn cho nửa vành hoặc monoid bằng cách bắt nguồn từ các nhóm toán tử thích hợp.

+0

Đây không phải là khái niệm, mà là những người trợ giúp cho "nhóm toán tử số học" như bạn đã nói. Khái niệm sẽ bao gồm những thứ như Additive_Identity, Multiplicative_Identity, Additive_Inverse, Multiplicative_Inverse, vv –

+0

@EvgenyPanasyuk tnx, nó thực sự xuất hiện rằng boost.operators không cung cấp các yếu tố nhận dạng. AFAICS, bạn có thể sử dụng cùng một mẹo tiêm 'friend' cho họ. Ví dụ. cho 'template lớp MultId: trường {};' và định nghĩa các toán tử 'operator *' hỗn hợp để phản ánh tính tương giao. – TemplateRex

+0

Các khái niệm tập trung vào giao diện, tức là cú pháp nào là hợp pháp và ngữ nghĩa nào có ngữ nghĩa. Điều đó cho phép thực hiện các thuật toán (và các công cụ khác) được trừu tượng hóa từ các mô hình cụ thể. Nhưng Boost.Operators chỉ là những người trợ giúp hỗ trợ việc triển khai các mô hình cụ thể. –

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