2014-03-01 29 views
2

我有例如多維數組:C++最佳優化的方法來檢查匹配在多維數組

int arr[4][3] ={{12, 29, 11, 22}, 
       {14, 22, 22, 22}, 
       {14, 14, 67, 22}, 
       {14, 18, 14, 45}}; 

現在我想找到例如匹配通過預先定義的規則:
找到所有「22」的數字是在水平方向上多於2個(數組中的第1行) 或 在垂直線(第1,2,3行) 以及Hypotenuse中查找垂直和多於2的所有「14」數字順序(行[1,0],[2,1],[3,2])
現在我知道我可以掃描每個規則的數組,並保持macing向量s
但是說數組是15x15,我有20個規則它可以非常凌亂
有沒有某種模式或算法呢?
最後我喜歡模擬類似老虎機匹配支付線的東西

+0

我會在內部將其表示爲一維數組,然後使用特定的方法以行或列的方式訪問它。這使得它不那麼麻煩。 – Ashalynd

回答

1

將每條規則分成兩部分。

  • 第一部分只取決於單元格的內容。
  • 第二部分取決於模式。

只掃描整個陣列一次。對於匹配第一部分的單元格,在掩碼中設置一點。掃描完成後,使用邏輯操作來匹配第二部分中的模式。根據規則,您可能會爲您在數組中匹配的每個值設置一個位掩碼。

例如,在該行中採用1)多於兩個'22'的規則,以及2)在該列中多於兩個'14'。掃描數組尋找22或14.請注意,從陣列中讀取每個數字一次並進行所有比較效率更高,因爲一旦該值存儲在CPU高速緩存中,其他比較就是「空閒」的。這兩個掩碼將是'22'位掩碼和'14'位掩碼。

在行或列中查找多個位有相當明顯的算法。對於R×C矩陣。

A1[C] 
A2[C] 
for r in 0 .. R-1 
    A2 |= (A1 & Matrix.row(r)) 
    A1 |= Matrix.row(r) 

最後,A2將是所有具有兩位或更多位的列的掩碼。要找到大於2的數字,只需添加A3等。

+0

如何思考位掩碼嘲笑,但我不知道如何實現模式,在一次掃描通過它會得到所有的匹配 – user63898

相關問題