2010-02-11 68 views
6

Tôi đang làm việc trên một dự án mà tôi cần lưu trữ ma trận các số được lập chỉ mục bằng hai khóa chuỗi. Ma trận không bị răng cưa, tức là nếu một khóa cột tồn tại cho bất kỳ hàng nào thì nó sẽ tồn tại cho tất cả các hàng. Tương tự, nếu một khóa hàng tồn tại cho bất kỳ cột nào thì nó sẽ tồn tại cho tất cả các cột.Ma trận kết hợp?

Cách rõ ràng để diễn tả điều này là với một mảng kết hợp của mảng kết hợp, nhưng điều này là cả hai vụng về và không hiệu quả, và nó không thực thi tài sản không phải lởm chởm. Có bất kỳ ngôn ngữ lập trình phổ biến nào cung cấp ma trận kết hợp được tích hợp vào ngôn ngữ hoặc như một phần của thư viện chuẩn của chúng không? Nếu vậy, làm thế nào để họ làm việc, cả ở cấp API và triển khai? Tôi đang sử dụng Python và D cho dự án này, nhưng các ví dụ bằng các ngôn ngữ khác vẫn hữu ích vì tôi có thể xem API và tìm ra cách tốt nhất để triển khai một cái gì đó tương tự trong Python hoặc D.

Trả lời

2

Tại sao không chỉ sử dụng ma trận chuẩn, nhưng sau đó có hai từ điển - một từ điển chuyển đổi các khóa hàng thành các chỉ mục hàng và một từ khóa chuyển đổi các khóa cột thành các chỉ mục cột. Bạn có thể làm cho cấu trúc của riêng bạn mà sẽ làm việc theo cách này khá dễ dàng tôi nghĩ. Bạn chỉ cần tạo một lớp có chứa ma trận và hai từ điển và đi từ đó.

0

Trong Python bạn có thể có một dict lập chỉ mục bởi một tuple của hai chuỗi, ví dụ:

>>> d = {} 
>>> d["foo","bar"] = 10 
>>> d 
{('foo', 'bar'): 10} 

Tôi không chắc chắn những gì "thực thi phi jaggedness" có nghĩa là cho bạn, nhưng bạn có thể sử dụng một defaultdict để trả về giá trị mặc định cho các mục chưa được thiết lập một cách rõ ràng, hoặc khởi dict với một giá trị đã biết:

>>> xkeys = "abcdef" 
>>> ykeys = "xyz" 
>>> d = dict(((x,y), 0) for x in xkeys for y in ykeys) 
>>> d 
{('b', 'y'): 0, ('a', 'z'): 0, ('b', 'x'): 0, ('e', 'y'): 0, ('a', 'x'): 0, ('f', 'z'): 0, ('a', 'y'): 0, ('f', 'y'): 0, ('d', 'y'): 0, ('f', 'x'): 0, ('d', 'x'): 0, ('e', 'x'): 0, ('e', 'z'): 0, ('c', 'x'): 0, ('d', 'z'): 0, ('c', 'y'): 0, ('c', 'z'): 0, ('b', 'z'): 0} 

Nếu bạn muốn thực thi mà chỉ có phím trong một tập nổi tiếng được phép thì tôi khuyên bạn nên subclassing dict để thêm xác thực.

+0

Vâng, tôi thực sự không biết rõ về Python. Tôi đã không nhận thức được bạn có thể làm điều này, mặc dù nó có ý nghĩa trong hindsight cho rằng bạn về cơ bản sử dụng tuples như là một chìa khóa. – dsimcha

+0

hoạt động tốt, nhưng nó sẽ sử dụng nhiều bộ nhớ hơn để lưu trữ các phím mà tôi nghĩ là một phần của những gì bạn không muốn. Tuy nhiên, nó sẽ nhanh hơn một chút so với phương pháp mà tôi đề xuất mà sẽ yêu cầu bảng băm tra cứu để tìm các chỉ số ma trận trước khi truy cập ma trận. Tốc độ hoặc không gian: đó là câu hỏi. –

+0

@Justin: Đó là một ý tưởng hay, nhưng tôi hy vọng sẽ có câu trả lời tốt hơn. Lý tưởng nhất là tôi muốn một ma trận "thực", nơi tôi có thể nhận tất cả các hàng cho một cột đơn lẻ hoặc tất cả các cột cho một hàng, v.v., không chỉ là giải pháp thay thế. – dsimcha

0

mô-đun larry cho python đã được phát hành gần đây. tôi tin rằng nó làm những gì bạn muốn.