300 likes | 433 Views
MOI 培訓班提高組 矩陣. 澳門電腦學會. 矩陣的重要除蟲設定. {$ifdef debug} {$R+} { Turn on range check } {$Assertions+} … {$else} … {$endif}. 設定的作用.
E N D
MOI 培訓班提高組矩陣 澳門電腦學會
矩陣的重要除蟲設定 {$ifdef debug} {$R+} {Turn on range check} {$Assertions+} … {$else} … {$endif}
設定的作用 • 若設定 {$R+} 的話, 當以下情況出現時, 程式就會出現 run-time errorvar a: array[1..10] of integer; i: integer;begin i:=11; a[i] := 20; { run-time error here! } writeln (i); • 若沒有設定 {$R+} 的話, 以上的程式就會正常地運行, 當然結果是錯的!
{$R+} • 矩陣越界是個容易出錯的地方 • 矩陣越界通常會引起一些難以除錯的問題, 如部份變量無故地改變i:=11; a[i] := 20; writeln (i); • {$R+} 減慢程式執行的速度, 但若根據除蟲架構建立程式的話, 正式版中將不會受影響
排序 • 基本上一定要熟識以下的排序的方法 • Quick Sort • Radix Sort • Quick sort 可以應用在一般的排序需要 • Radix sort 則應用在一些較特殊的情況下
Quick Sort QuickSort(A, p, r) IF p<r THENBEGIN q := Partition(A, p, r) QuickSort(A, p, q-1) QuickSort(A, q+1, r) END;
Partition Partition (A, p, r) x := A[r] i := p – 1 FOR j:=p TO r -1 DO IF A[j] <= x THEN i := i + 1 exchange(A[i], A[j]) exchange(A[i+1], A[r]) REUTRN i+1
Partition 的步驟 p,j p i i r j r 2 8 7 1 3 5 6 4 2 1 3 8 7 5 6 4 p,i j r p i j r 2 8 7 1 3 5 6 4 2 1 3 8 7 5 6 4 r p,i p i j r 2 8 7 1 3 5 6 4 2 1 3 8 7 5 6 4 r p i p,i j r 2 8 7 1 3 5 6 4 2 1 3 4 7 5 6 8 r p i j 2 1 7 8 3 5 6 4
Bucket Sort BucketSort (A) n := sizeofdata(A[i]) FOR i:=1 TO n DO insert A[i] into list B[n_of(A[i])] concatenate lists B[1], B[2], …, B[3]
例子 001 101 011 010 011 100 101 111
010 100 001 101 011 010 011 100 101 111 0: 001 101 011 011 101 111 1: 010 100 001 101 011 011 101 111
100 001 101 101 010 100 111 001 101 011 011 101 0: 010 111 011 011 1: 100 001 101 101 010 111 011 011
001 010 011 011 100 001 101 101 010 111 011 011 0: 100 101 101 111 1: 001 010 100 011 011 101 101 111
倒水架構 • 利用兩個一維矩陣輪流運算來代替二維矩陣 • 例子: PASCAL 三角形的計算 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 1 6 15 20 15 6 1
PASCAL 三角形的計算 (1) VAR PT: ARRAY [0..100, 0..100] OF integer; n, c: integer; BEGIN PT[0,0] := 1; FOR n:=1 TO 100 DOBEGIN PT[n,0] := PT[n,n] := 1; FOR c:=1 TO n-1 DO PT[n,c] := PT[n-1,c-1] + PT[n-1,c] END;
PASCAL 三角形的計算 (2) VAR PT: ARRAY [1..2, 0..100] OF integer; a, b, i, j, : integer; BEGIN fillchar(t, #0, sizeof(t)); { 將矩陣初始化 } PT[1,0] := PT[2,0] := 1; a := 2; b := 1; FOR i:=1 TO 100 DOBEGIN FOR j:=1 TO i-1 DO PT[a,j] := PT[b,j-1] + PT[b,j]; PT[a,i] := 1; b := 3-b; a := 3-a; { 將 a, b 交換 } END;
PASCAL 三角形的計算 (3) VAR PT: ARRAY [0..100] OF integer; n, c, a, b: integer; BEGIN PT[0] := 1; FOR n:=1 TO 100 DOBEGIN a := PT[0]; FOR c:=1 TO n-1 DOBEGIN b := PT[c]; PT[c] := a + b; a := b; END; PT[n] := 1; END;
高精度運算 • 用字符串或字符矩陣來表示一個多位數字 • Number: ARRAY [1..1000] OF char; • 另一種可能: Number: ARRAY [1..1000] OF byte; • 運算只限於每個單位數字 • 方便輸入及輸出 • 用整數矩陣來表示一個多位數字: • Number: ARRAY [1..1000] OF integer; • 長整數 12345678900345678 將會表示成:(5678, 34, 6789, 2345, 1, 0, 0, 0, …) • 每個整數表示部份連續的位數 • 方便運算, 不便輸入及輸出
整數矩陣多位數字加法例子 VAR A: ARARY [1..1000] OF integer; … carry := 0; FOR i:=1 TO n DOBEGIN A[i] := A[i] + B[i] + carry; IF A[i] > 9999 THENBEGIN carry := 1; A[i] := A[i] – 10000; END ELSE carry := 0; END;
Stack and Queue • Stack • First in last out • 操作: push, pop • 應用例子: 運算式操作, 遞歸控制 • Queue • First in first out • 操作: putq, getq • 應用例子: 廣度搜索
Stack 的結構 • 定義 Stack: ARRAY [1..1000] OF Items; sp: integer; { stack pointer } • 操作 InitStack sp := 1; Push (item) stack[sp] := item; sp := sp + 1; Pop (item) sp := sp – 1; item := stack[sp];
Stack 例子 –後序式運算 • 後序式為一算式表達方法, 其運算符號在兩個參數的後面 • 例 10 34 + (代表 10 + 34) • 基本算法: WHILE There_is_more_token DOBEGIN ReadToken (token); IF is_number(token) THEN push (token) ELSE { The token is an operator }PerformOP(token, pop(), pop()); END;
PerformOP (token, data2, data1); BEGIN IF is_add(token) THEN push(data1 + data2) ELSEIF is_sub(token) THEN push(data1 – data2) ELSE … END;
中序算式運算 • 中序算式例子: 34 + 4 * 5 • 運算要合符先乘徐, 後加減的四則運算原則 • 更複雜的例子將包括括號在內 • 如: 3 * (12 – 4 * (2 + 1))/(2 – 1) • 基本算法提示: • 需要用兩個 stack • 一個用以放參數 • 另一個用作存放運算符號
Queue 的基本數據結構 • 定義 var queue: ARRAY [0..100] OF item; Qhead, QTail: integer; • 操作 InitQueue QTail := QHead := 0; PutQ (item) queue[QTail] := item; QTail := QTail + 1; DeQueue (item); item := queue[Qhead]; Qhead := Qhead + 1;
Queue 的應用例子 • 廣度搜索 • 例: 行迷宮, 由 s 走到 e 的最短路線 e s
[(8,2)0] 1 [(7,2)1,(8,3)1] 2 [(8,4)2,(7,2)1] 2 [(6,2)2,(8,4)2] 3 [(8,5)3,(7,4)3,(6,2)2] e 3 3 2 1 2 2 1 0 1 1 2 3 …
Head Tail 環狀 Queue • 由於Queue內的數據永遠是由尾加入,由頭取出, 經一段時時運行之後, Queue 的內容會不斷往矩陣的一方走 • 這時候可以用環狀 Queue 來解決問題 Tail Head
功課 • 每個星期將會有一定的功課需要完成 • 題目將通過比賽系統獲行並將答案經比賽系統上傳 • 每次功課必須在下星期四晚上十二時前完成 • 第一次功課取得的網址請留意MCA論壇的公報