問題:如何高效的構建乙個螺旋矩陣?
前面的文章
討論了兩種螺旋矩陣。當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 ...