螺旋矩陣 之三

2022-03-05 18:14:03 字數 3565 閱讀 3085

問題:如何高效的構建乙個螺旋矩陣?

前面的文章

討論了兩種螺旋矩陣。當n比較小時,可以用模擬法(測試**中的

build_1a

和build_1b函式

),另外可以將4個for迴圈體合併到乙個(

build_2a

,build_2b和build_2c函式

)。但n比較大時,由於不斷的對記憶體跳躍式訪問,cpu cache line命中率很低,定位和載入記憶體的開銷相當大。一種解決方法是,直接計算每個位置對應的值(

build_3a

和build_3b函式

);另一種解決方法則是:將每行拆分成三部份,一部分等於上一行同一列數值減1,中間部分是一斷連續的遞增或遞減的數列(其起始和結束值可由公式算得),最後一部分的數等於上一行同一列數值加1(

build_4

)。為了測試方便,加了乙個build_basic函式,先行後列填充1到n2的等差數列。

測試結果有點出乎意外,效率最高的build_basic、

build_3a

、build_3b和build_4這幾個函式所用時間相當接近,其它幾個函式的效率彼此間也相差不大。由於程式的效能瓶頸在於對記憶體訪問的效率,二維陣列的部局,cpu的快取大小,記憶體頁的大小等都對測試結果有很大影響,使得測試結果不精確。下面僅列出乙個極端情況下的結果:

值得注意的是,用模擬法構建 5120 * 5120 時,所用時間是 構建  5121 * 5121 的3倍多。

各種方法構建n*n矩陣所有時間(ms)

5119

5120

5121

build_1a

3871259

331build_1b

3901259

331build_2a

4181259

325build_2b

3751256

312build_2c

3711187

312build_3a

140137

137build_3b

134134

134build_4 

134134

162basic   

134131

134測試**:

輸出螺旋矩陣 三

輸出這樣的二維陣列 1 2 3 4 12 13 14 5 11 16 15 6 10 9 8 7 分析 填充如此乙個n n陣列 先觀察規律 n 1 1n 2 1 24 3 對於n n陣列,可以先將1 4 n 填充四周,內部用乙個 n 2 n 2 的陣列加上4 n 1 填充,所以用遞迴比較直觀,如下 ...

螺旋方針(螺旋矩陣)

螺旋方陣 time limit 1000ms memory limit 65536kb problem description 的螺旋方陣當n 5和n 3時分別是如下的形式 請給出乙個程式,對於任意的輸入 0 11 輸出按照上面規律所獲得的 的螺旋方陣。input 輸入第一行為整數 0 10 代表有...

螺旋矩陣 蛇形矩陣

問題描述 給定乙個包含m行n列的m x n矩陣,程式設計按照螺旋順序,輸出該矩陣中的所有元素。輸入有多個矩陣。每個矩陣資料的第1行有兩個整數m和n,接著是乙個mxn矩陣的描述,有m行,每行有n個整數 輸出對每個矩陣資料,按照螺旋順序輸出矩陣陣列的元素。輸入樣例 3 31 2 3 4 5 6 7 8 ...