資料結構複習 陣列 廣義表 遞迴 哈夫曼數 並查集

2021-06-29 07:47:06 字數 2486 閱讀 3525

第5章 陣列和廣義表

陣列定義:儲存在連續記憶體單元的線性表,是一種隨機儲存結構。多維陣列可以看作每個資料元素都是乙個一維陣列。

c/c++/pascal/basic等語言是行序儲存,fortran等是列序儲存。

行序儲存的陣列a[m][n]:    loc(a[i][j]) = loc(a[0][0]) + (i*n + j) * k   --- k是每個元素所佔的儲存單元

特殊矩陣的壓縮儲存:

對稱矩陣(元素關於主對角線對稱,ai,j = aj,i),

三角矩陣(矩陣的上(下)三角中的元素均為常數,不包括對角線),

對角矩陣(所有非0元素集中在以對角線為中心的帶狀區域內)  

把這些具有一定分布規律的元素壓縮儲存到乙個空間中,進行一定的對映。

稀疏矩陣:只有當非0元素個數遠小於總個數時,只儲存非0元素;

1。 下標按照行有序的三元組順序表儲存結構

2。 十字鍊錶,像編織一樣的串起來。每一行/列均設定乙個鍊錶,方便行列搜尋,降低複雜度。

//三元組

typedef struct

tupnode;

typedef struct

tsmatrix;

//十字鍊錶

typedef struct mtxn

tag;

}

廣義表:

資料元素相對有序,長度為最外層包含元素的個數,深度為所包含括弧的重數。可以遞迴,因為每個元素可以是原子資料也可以是子表資料。

採用動態鏈式結構,新增乙個tag域指示是否為子表。

//廣義表

typedef struct lnode

val;

struct lnode* link;

}

第6章 遞迴

在定義乙個過程或函式時出現呼叫本過程或本函式的成分,成為遞迴。

資料的定義是遞迴的,資料結構是遞迴的,問題的求解方法是遞迴的。

其執行過程分為分解和求值,是函式巢狀呼叫的特殊情況,採用**共享的方式,每次呼叫同乙個函式的**,每一次呼叫開闢棧空間,存放返回位址和引數,全部執行完後,棧應該為空。

#include #include //recursive

/*遞迴是一種分而治之的方法:

1.分析原問題,假設子問題

2.假設子問題可解,確定原問題的解

3.確定乙個特殊情況,作為遞迴出口

*/ //八皇后問題,皇后放在不同行,列,對角線

//place(k,n) 標識在1~k-1列上放好了,place(k+1,n),標誌在1~k列上放好了,是子問題

int cont =0;

int q[20];

void print(int n)

printf("\n");

}int find(int i,int k)

j ++;

} return 1;

}void place(int k,int n)

else

} }}

int main()

//哈夫曼樹和並查集

//求最小帶權路徑長度,用於簡化編碼

//判斷兩個元素之間的關係,利用集合合併,用代表元素標識集合的方法,不斷合併子樹,快速找出兩個元素是否屬於同乙個集合

#include #include typedef structhtnode;

//n個葉子節點,n-1個非葉子節點,更新每個非葉子節點的值

void creatht(htnode ht,int n)

//構造哈夫曼樹,lnode,rnode是最小權重的兩個節點位置

for(i = n; i<2*n-1; i++)

else if(ht[k].weight < min2)

}} ht[i].weight = ht[lnode].weight + ht[rnode].weight;

ht[i].lchild = lnode;

ht[i].rchild = rnode;

ht[lnode].parent = i;

ht[rnode].parent = i; }}

//並查集

typedef struct node

ufstree;

void make_set(ufstree t)

}//在x所在子樹中查詢集合編號,遞迴直到找到祖先

//改進:在找祖先root後,進行路徑壓縮,把該節點的所有祖先節點的父節點改為root

int find_set(ufstree t,int x)

//o(log2 n)樹的深度

//合併的時候讓較小秩的樹根指向較大秩的樹根

void union(ufstree t,int x,int y)

}

資料結構 陣列 廣義表

陣列,是有序的元素序列。若將有限個型別相同的變數的集合命名,那麼這個名稱為陣列名。組成陣列的各個變數稱為陣列的分量,也稱為陣列的元素,有時也稱為下標變數。用於區分陣列的各個元素的數字編號稱為下標。陣列是在程式設計中,為了處理方便,把具有相同型別的若干元素按無序的形式組織起來的一種形式。這些無序排列的...

資料結構 陣列和廣義表

感覺陣列這一段沒講什麼太多的東西。先是講了下定義,就是每個維度上都有對應的前驅後繼,首尾元素例外。操作只有初始化 銷毀 取元素 修改元素。然後講了下適合用順序儲存結構,多維情況下根據下標 j1 j2 j3 jn 找到對應畫素的儲存位置 cn l,ci 1 bi ci,loc loc基址 ciji l...

資料結構 陣列和廣義表

陣列長度固定,元素型別一致,沒有鏈式映像,因為不能保證位址連續 陣列與線性表的區別與聯絡 相同點 都是相同資料型別的的資料元素組成的有限序列 不同點 陣列要求位址連續,而線性表則無此要求 線性表的元素是邏輯意義上不可再分的,而陣列中每乙個元素還可以是乙個陣列 多維陣列可分 操作上的不同,陣列一旦被定...