【数据结构】数组和广义表
感覺數組這一段沒講什么太多的東西。
先是講了下定義,就是每個維度上都有對應的前驅后繼,首尾元素例外。操作只有初始化 銷毀 取元素 修改元素。然后講了下適合用順序存儲結構,多維情況下根據下標(j1 j2 j3 ... jn)找到對應像素的存儲位置 cn?= L, ci-1?= bi?* ci,? LOC = LOC基址 +?Σciji ,?L為每個元素存儲的單位。 然后給了些實現代碼。
新知識是: va_start( , );
? ? ? ? ? ? ? ?va_arg( , );
? ? ? ? ? ? ? ?va_end();
這三個可以用來處理變長參數表信息。
?
接著就是講矩陣了。
首先是特殊矩陣的壓縮。對于有規律的特殊矩陣,如對角矩陣、下(上)三角矩陣,對角矩陣。可以根據規律將矩陣存在一維數組中,建立起原始下標與壓縮后矩陣下標的對應關系就好。
對沒有規律的稀疏矩陣,只存儲稀疏矩陣的非0元。需要三元組表存儲(行、列、元素值)。根據三元組表的不同表示方式,得到稀疏矩陣不同的壓縮存儲方法。
①三元組順序表 ?以行序為主序排列。 就是用個數組存起來,行號小的放前面。 講了下這種結構下轉置的操作,關鍵講了下如何在轉置后以行為主排序。又講了個快速轉置,就是存儲了原矩陣每一列首元素的位置和每一列元素個數,這樣就不用在之后排序了,直接放在對的位置就好了。
②行邏輯鏈接的順序表,就是把每行第一個非0位置存了起來,為了方便抽取任意一行。講了兩個稀疏矩陣相乘的例子,說來說去就是為了去掉0與其他元素相乘這樣冗余的計算需要行起始位置,具體沒看,太繁瑣。沒什么新技術。
③十字鏈表 ?在兩個稀疏矩陣相加時,非零元素數量變化可能很大,不宜采用順序存儲結構。 這種結構每個非零元有5個域(行、列、值、該行下一元素指針、該列下一元素指針) 用兩個一維數組存儲每一行和每一列的頭結點。
?
廣義表 說白了,就是一個表,表中的元素也可以是表。開始說表可以共享、可以遞歸但是后面的介紹都是在不可共享不可遞歸的前提下介紹的....表頭和表尾的定義也略奇怪。表頭很普通,就是第一個元素。表尾居然是剩下的所有元素。定義結構時,用到了聯合跟枚舉,感覺看了很有收獲。
typedef enum{ATOM, LIST} ElemTag; typedef struct GLNode{ElemTag tag;union{AtomType atom; //元素可能是原子struct {struct GLNode *hp, *tp;}ptr; //也可能是另一個廣義表}; }*GList;講了m元多項式的表示,大概意思就是不斷的分解主變元,得到系數。如:
P=X10Y3Z2+2X6Y3Z2+3X5Y2Z2+X4Y4Z+6X3Y4Z+2YZ+15
? =((X10+2X6)Y3+3X5Y2)Z2+((X4+6X3)Y4+2Y)Z
這樣就可以用Z的系數表示多項式,而Z的系數又是Y的多項式,Y的系數又是X的多項式 這樣就可以用廣義表表示了。
?
之后講了下遞歸算法求廣義表深度(括號重數)和廣義表復制,沒仔細看好繁瑣啊... 而且我在網上也沒查到什么關于廣義表的應用,于是不想看了..
總結
以上是生活随笔為你收集整理的【数据结构】数组和广义表的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一个简单的UBB程序
- 下一篇: hbase源码系列(九)StoreFil