2010-02-11 94 views
6

我正在做一個項目,我需要存儲由兩個字符串鍵索引的數字矩陣。矩陣不是鋸齒狀的,即如果任何行存在列鍵,則它應該存在於所有行中。同樣,如果任何列存在行鍵,那麼它應該存在於所有列中。關聯矩陣?

表達這種情況的明顯方法是關聯數組的關聯數組,但這樣做既笨拙又低效,並且不強制使用非鋸齒屬性。任何流行的編程語言是否提供了內置於語言中的關聯矩陣或作爲其標準庫的一部分?如果是這樣,他們在API和實施級別都是如何工作的?我在這個項目中使用Python和D,但其他語言中的示例仍然很有用,因爲我可以查看API並找出在Python或D中實現類似的最佳方式。

回答

2

爲什麼不僅使用標準矩陣,而且還有兩個字典 - 一個將行鍵轉換爲行索引,另一個將列鍵轉換爲列索引。我認爲你可以很容易地以這種方式創建自己的結構。你只需創建一個包含矩陣和兩個字典的類並從那裏開始。

0

在Python你可以有兩個字符串的元組索引的字典,如

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

我不知道什麼是「強制執行非鋸齒」是指你,但你既可以使用一個defaultdict來返回默認值尚未明確設置的條目,或者與已知值初始化字典:

>>> 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} 

如果要強制執行,只有在一組已知鍵被允許,那麼我建議子類字典內添加驗證。

+0

是的,我不太瞭解Python。我不知道你可以做到這一點,但考慮到你基本上使用元組作爲關鍵,事後看來是有道理的。 – dsimcha 2010-02-11 20:09:23

+0

這很好,但它會使用更多的內存來存儲我認爲是你不想要的部分的鍵。但是,它應該比我所建議的方法快一些,在訪問矩陣之前需要使用散列表查找來查找矩陣索引。速度或空間:這是一個問題。 – 2010-02-11 20:25:54

+0

@Justin:這是個好主意,但我希望能有更好的答案。理想情況下,我想要一個「真正的」矩陣,我可以在其中獲得單列所有行,或單行所有列等,而不僅僅是一種解決方法。 – dsimcha 2010-02-12 03:11:34

0

larry模塊for python最近發佈。我相信它是做你想做的。