Re: [問題] 請問陣列運算

作者: poyenc (髮箍)   2020-12-17 22:36:06
※ 引述《liptonbin (我還存在耶)》之銘言:
: 請教一下
: 我有個
: 輸入: 一維arr[240]={0,1,2,3,4,5,.....239}
: (為了方便記憶,寫有順序排列,之後陣列值會變動!)
: 想轉成底下5x48陣列,排列如下
: 0, 1, 2, 3,.........47
: 48, 49, 50, 51,........95
: 96, 97, 98, 99,.......143
: 144,145,146,147,......191
: 192,193,194,195,..238,239
: 想做底下陣列運算
: 直列來看,二個一組相減,有點複雜,請問該怎麼寫c code><
: 示意圖如下:
: https://ibb.co/mzM6Mqt
: 想要輸出:
: 48-0, 1-1, 50-2, 3-3,............47-47
: 48-48, 97-49, 50-50, 99-51,...........143-95
: 144-96, 97-97, 146-98, 99-99,..........143-143
: 144-144,193-145,146-146, 195-147,..........239-191
: 1-192,193-193, 3-194, 195-195,...47-238,239-239
: 想法是:
: 要把一維陣列轉成5x48陣列,在做反轉陣列,變成48x5,在轉成一維陣列
: 目的是2個為一組,再作減法,比較有序,
: 最後再把一維陣列轉回上面的圖><
基本上你只要盡可能地把問題描述清楚, 有趣的是: 當你把問題描述完整的同
時, 自然就解掉它了. 讓我們來一步步分析它. 假設你現在是一個老闆, 需要
雇用一個工讀生幫你把圖裡紅線經過的位置依序唸出來 (0, 48, 96, ...),
好讓你可以兩兩去作相減, 你在徵才文裡會寫上哪些需求呢? 我想到的內容會
像下面這樣:
1. 給 [工讀生] 一組行 (column) 列 (row) 值, 他要有辦法將陣列當作
虛擬的矩陣看待.
2. [工讀生] 要有辦法像圖裡紅線所標示的一樣, 依序給出序列 (0, 48,
96, 144, ...) 裡的值, 直到行 (column) x 列 (row) - 1 為止.
3. [工讀生] 要能知道什麼時候該結束, 並且通知你.
有了上面的描述, 我們就可以建立抽象資料型別 (Abstract Data Type) 出來
, 三個項目對應到三個介面. 這個流程在資料結構的書裡都會教, 細節不再贅
述. 我們把這裡的 [工讀生] 改叫作 Iterator:
Abstract Data Type: Iterator
─────────────────────────────
Iterator create(row: size_t, column: size_t) (constructor)
size_t next(it: Iterator)
bool hasNext(it: Iterator)
注意在這個階段型別並不是最重要的, 重要的是釐清每個介面應該做什麼事情.
然後身為雇主的你請了這個 [工讀生] 來, 剩下要做的就是每次和他拿兩個位
置過來, 得到陣列裡對應的值再做相減. 程式碼會像這樣 (介面實作就當練習
):
struct Iterator it = create(5, 48);
while (hasNext(it)) {
const size_t upper = next(&it);
const size_t lower = next(&it);
printf("%d-%d", arr[lower], arr[upper]);
// other code goes here
}
範例: https://godbolt.org/z/zEsdad
也許眼尖的人已經看出來這是《Design Patterns》裡的 Iterator Pattern,
因為原問題的本質是尋訪問題, 所以前面提到的抽象資料型別正是根據目前
的問題 (Problem) 以及情境 (Context) (原 PO 對 C 語言的理解) 所揉合
出來的解決方案 (Solution) (= Pattern).
也因為是尋訪問題, 如果今天把紅線從倒 N 字型改為 Z 字型, 在修改/維護
上將得利於使用了合適的設計樣式 (design pattern).
作者: s4300026 (s4300026)   2020-12-18 08:19:00
作者: cuteSquirrel (松鼠)   2020-12-19 19:31:00
好猛
作者: unmolk (UJ)   2020-12-20 06:17:00
作者: VictorTom (鬼翼&娃娃魚)   2020-12-21 14:00:00
推:)
作者: F04E (Fujitsu)   2020-12-22 13:11:00
push
作者: KevinR (Kevin)   2020-12-23 18:38:00
曲高和寡
作者: Ryspon (Ry)   2020-12-25 10:37:00
有點太舒服
作者: ohbravo (月餅人)   2019-02-27 12:54:00
學到一課

Links booklink

Contact Us: admin [ a t ] ucptt.com