160 likes | 370 Views
Linked list 的應用. How to represent a sparse matrix?. Given a sparse matrix M a) shown its memory representation using i) ROW & COLUMN indexing ii) a linked structure b) Compare the advantages and disadvantages of these two schemes. 0 0 0 0 4 2 3 0 0 0 0 0 0 5 0 7 0 0 0 8 0 6 0 0 0.
E N D
How to represent a sparse matrix? Given a sparse matrix M a) shown its memory representation using i) ROW & COLUMN indexing ii) a linked structure b) Compare the advantages and disadvantages of these two schemes. 0 0 0 0 4 2 3 0 0 0 0 0 0 5 0 7 0 0 0 8 0 6 0 0 0
(a) 1.ROW & COLUMN indexing 使用3-tuple結構 A 5*5, total elements=7
ii) Linked Structure DOWN,RIGHT為指標。 ROW,COL為列、行的號碼。 VALUE為非零項元素值。
H1 H2 H3 H4 H5 5 2 1 0 2 0 3 0 4 0 0 1 2 1 4 1 5 0 2 2 4 5 0 3 0 2 0 4 3 4 0 5 1 5 0 0 H1 4 H2 2 3 H3 5 H4 7 8 H5 6
comparison (1)ROW & COLUMN indexing 優點:節省空間 缺點:非零項有所更動時,需做大模的移動。 (2)Linked Structure 優點:非零項有所更動時,不需做大模的移動。 缺點:較浪費空間。
一般化串列(generalized list) (1)A=(a,(b,c)) :長度為2的串列,它的第一個元素為原子“a”,第二個為線性串列(b,c) (2)B=(A,A,()) :長度為3的串列,其第一個與第二個元素為串列,第三個為一空串列 (3)C=(a,C) :長度為2的遞迴串列,C相當於一個無限串列,C=(a,(a,(a,…)
一般化串列的節點結構 任何一般化的串列均可用以下的節點結構來表示: TAG=0/1 DATA LINK 其中TAG=0表示DATA欄為原子(atom) 。 TAG=1表示DATA欄為串列(list) 。
(1) 0 a A→ 1 0 A= (a,(b,c)) 0 b 0 c 0 (2) B→ 1 1 1 0 0 B=(A, A, ()) (3) C→ 0 a 1 0 C=(a,C)
P(x,y,z) 1 10 3 2 8 3 3 8 2 1 4 4 6 3 4 2 0 1 2 2 1 1 1 0 (三)多變數多項式的表示法 例:p(x,y,z)=x10y3z2+2x8y3z2 +3x8y2z2 +x4y4z +6x3y4z+2yz 有兩種不同的表示法可表示此多變數多項式,茲分述於后: (1)線性串列(linear list) 2 缺點:若多項式的各項有不同個數的變數,則此種結構就不適用,會造成空間嚴重浪費。 (2)一般化串列(generalized list) 為了使用一般化串列來表示多變數多項式,則上例需改寫整理如下: p(x,y,z)=((x10+2x8 ) y3+3x8 y2) z2 +((x4 +6x3) y4 +2y)z
Z 0 2 1 0 Y - 3 2 0 Y - 4 1 0 × - 3 8 0 × - 2 0 0 × - 1 10 2 8 0 × - 1 4 6 3 0 p(x,y,z)=((x10+2x8 ) y3+3x8 y2) z2 +((x4 +6x3) y4 +2y)z COEF欄內究竟是係數,還是指向其它串列的指標呢?解決的方法是在原有的節點結構上多加一欄TAG,若TAG=0代表為係數,反之TAG=1則為指標,亦即結構改為 使用Union
1 y - 1 1 0 1 x - 0 3 2 0 若TAG=0代表為係數,反之TAG=1則為指標,亦即結構改為 例:多項式P=3x2y可表示如下:
p(x,y,z)=((x10+2x8 ) y3+3x8 y2) z2 +((x4 +6x3) y4 +2y)z P→ 1 Z 1 2 1 1 0 1 y - 1 3 1 2 0 1 × - 0 1 10 1 × - 0 3 8 0 0 2 8 0 1 y - 1 4 0 2 1 0 1 × - 0 1 4 0 6 3 0
Union(等位) union samepo { int n; float f; } name1; printf(“%3d\n”,sizeof (union samepo)); name1.n=123; printf(“%d\n”, name1.n); name1.f=123.321; printf(“%.2f\n”, name1.f); n f 只佔4bytes 不會同時存在
堆疊結構的應用 堆疊結構在計算機上的應用相當廣泛,譬如: (1)副程式呼叫及返回處理(subroutine call and return) 在呼叫副程式之前,須先將下一條指令的位址,亦即返回位址(return address)保存到stack中,當爾後副程式執行完時再從stack頂端取出返回位址,回到原來執行時的下一指令位址繼續往下執行。 (2)遞迴程序的呼叫及返回處理(recursive call and return) 其處理過程與副程式呼叫類似,在每次遞迴之前,須先將下一條指令的位址,記錄器及變數的值存到stack中,當爾後遞迴回來時,能再從stack頂端取出暫存值,回到原來執行遞迴前狀況,並從下一指令繼續往下執行。
(3)算術式的轉換與分析 在編譯(或組譯、直譯)時,stack可幫助分析指令,以判斷某一個指令是否合法,諸如LR Parser利用shift/reduce時,須使用stack,此外算術運算時,利用stack的特性將不同的算術式表示法轉換,以利算術式的執行。 (4)在組合程式(assembler)中,若允許Macro call within Macro,則必須利用stack來儲存Macro call之前的資料。 (5)二元樹的中序追蹤(inorder traversal)及前序追蹤(preorder traversal)以及圖形的深度追蹤(depth-first-search) 。 (6)利用硬體製作來處理re-entrant routine時,須利用stack。 (7)中斷處理(interrupt handling)時,須有stack支援(support) 。 (8)堆疊式計算機(stack computer),此類計算機採用零位址指令(zero-address instruction)型式,大部份透過push及pop兩個指令來處理運算式。