數據結構總結

嚴蔚敏版總結

一.線性表

數組形式

#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
typedef struct {
    ElemType *elem;
    int length;
    int listsize;
}SqList;

int InitList_Sq(SqList &L){
    L.elem = (ElemType *) malloc(LIST_INIT_SIZE * sizeof(ElemType));
    //初始化length和listsize;
    return 1;
}

鏈表形式

typedef struct LNode{
    ElemType data;
    struct LNode *next;
}LNode,*LinkList;

二.棧和隊列

1.順序棧

//定義
typedef struct{
    int data[maxSize];
    int top;
}SqStack;
//棧的狀態
//若top=-1為空,那么top=maxSize-1為棧滿。若top=0,類比。

//鏈棧定義
typedef struct LNode{
    int data;
    struct LNode *next;
}LNode;

2.棧的應用

①數制轉換 ②括號匹配 ③行編輯程序 ④迷宮求解 ⑤表達式求值

3.循環隊列

typedef struct{
    int data[maxSize];
    int front;
    int rear;
}SqQueue;

//隊列狀態:空(qu.rear==qu.front),滿(qu.rear+1)%maxSize==qu.front。
//顯然隊列在滿狀態時,必須空一個位置。

三.串

串定義

typedef struct{
    char str[maxSize+1];    //最后一個位置是'\0'
    int length;
}Str;

KMP算法

思想:利用已經部分匹配這個有效信息,保持i指針不回溯,通過修改j指針,讓模式串盡量地移動到有效的位置

算法:關鍵在于next[n+1]

public static int[] getNext(String ps) {
    char[] p = ps.toCharArray();
    int[] next = new int[p.length];
    next[0] = -1;
    int j = 0;
    int k = -1;
    while (j < p.length - 1) {
       if (k == -1 || p[j] == p[k]) {
           next[++j] = ++k;
       } else {
           k = next[k];
       }
    }
    return next;
}

四.數組和廣義表

01_稀疏矩陣.jpeg

五.樹

5.1 定義

typedef struct BTNode{
    char data;
    struct BTNode *lchild;
    struct BTNode *rchild;
}BTNode;

5.2 遍歷算法

//先序遍歷
void preOrder(BTNode *p){
    if(p!=null){
        visit(p);
        preOrder(p->lchild);
        preOrder(p->rchild);
    }
}

//中序,基本相同
//后序,基本相同

//層次遍歷
//利用循環列表,不斷將結點加入,然后訪問
void level(BTNode *p){
    int front,rear;
    BTNode *que[maxSize];
    front = rear;
    
    BTNode *q;
    if(p!=null){
        //根結點入隊
        rear=(rear+1)%maxSize;
        que[rear]=p;
        //當隊不空時
        while(front!=near){
            front=(front+1)%maxSize;
            q=que[front];
            visit(q);
            //加入左孩子
            if(q->lchild!=null){
                rear=(rear+1)%maxSize;
                que[rear]=q->lchild;
            }
            //同理,對于右孩子進行處理
        }
    }
}

5.3 樹的深度算法

int getDepth(BTNode *p){
    int LD,RD;
    if(p==null)
        return 0;
    else{
        LD = getDepth(p->lchild);
        RD = getDepth(p->rchild);
        return (LD>RD?LD:RD)+1;
    }
}

5.4 線索二叉樹

// 定義
typedef struct TBTNode{
    char data;
    int ltag,rtag;
    struct TBTNode *lchild;
    struct TBTNode *rchild;
}TBTNode;

//中序方式的線索二叉樹
void InThread(TBTNode *p,TBTNode *&pre){
    if(p!=null){
        InThread(p->lchild,pre);
        //建立當前結點的前驅線索
        if(p->lchild==null){
            p->lchild=pre;
            p->ltag=1;
        }
        //建立前驅結點和后驅結點
        if(pre!=null && pre->rchild==null){
            pre->rchild=p;
            pre->rtag=1;
        }
        //繼續遍歷
        pre=p;
        InThread(p->rchild,pre);
    }
}

六.圖

6.1 圖的鄰接表

//邊結構
typedef struct ArcNode{
    int adjvex;     //該邊指向的的結點位置
    struct ArcNode *nextarc;        //下一條邊的指針
    int info;       //可能的權值
}ArcNode;

//頂點信息
typedef struct VNode{
    char data;
    ArcNode *firstarc;      //該頂點第一條邊
}VNode;

//圖定義
typedef struct{
    VNode adjlist[maxSize];     //鄰接表
    int n,e;
}AGraph;

6.2 圖的遍歷

6.2.1 深度優先遍歷

類似二叉樹的先序遍歷

void DFS(AGraph *G,int v){      //v是起點編號
    ArcNode *p;
    visit[v]=1;     //設置訪問標記
    visit(v);
    p=G->adjlist[v].firstarc;   //該頂點的第一條邊
    while(p!=null){
        //如果邊的終點沒有被訪問
        if(visit[p->adjvex]==0)
            DFS(G,p->adjvex);
        p=p->nextarc;
    }
}
6.2.2廣度優先

類似層次遍歷算法

void BFS(AGraph *G,int v,int visit[maxSize]){
    //初始化v[n]為0
    ArcNode *p;
    int que[maxSize],front=0,rear=0;
    int j;
    Visit(v);
    visit[v]=1;
    rear=(rear+1)%maxSize;      //v進隊
    while(front!=rear){
        front=(front+1)%maxSize;        //頂點出隊
        j=que[front];
        p=G->adjlist[j].firstarc;       //取得邊
        while(p!){
            if(visit[p->adjvex]==0){
                Visit(p->adjvex);
                visit[p->adjvex]=1;
                rear=(rear+1)%maxSize;      //進隊
                que[rear]=p->adjvex;
            }
            p=p->nextarc;       //循環下一條邊
        }
    }
}
6.2.3非連通圖遍歷

通過循環每個頂點來實現遍歷。

void dfs/bfs(AGraph *g,int visit[]){
    int i;
    for(i=1;i<=g->n;++i){
        if(visit[i]==0)
            DFS/BFS(g,i);
    }
}

6.3 圖的最小生成樹

(針對點)普里姆算法n^2:任取一點,不斷找已選擇點集最小權值邊且終點為是未被選擇的點。

(針對邊)克魯斯卡爾算法O(eloge)

生成樹唯一的條件:權值相同的邊都被包括或每條邊權值不唯一

6.4 最短路徑

迪杰斯特拉算法O(n^2)

弗洛伊德算法O(n^3):矩陣算法

6.5 拓撲排序和關鍵路徑

七.排序

類型 名稱 特點 時間 空間
插入類 直接插入 不斷是前面序列有序 n^2 1
折半插入 在已經有序序列中插入 n^2 1
希爾排序(最小增量) 不斷縮小排序間隔,逐步有序 nlog2n 1
交換類 冒泡排序 不斷讓大數沉底 n^2 1
快速排序 選定后交換 nlog2n~n^2 log2n
選擇 簡單選擇 不斷選擇最大或最小的 n^2 1
堆排序(堆建立過程) 建立完全二叉樹 nlog2n 1
特殊 二路歸并 nlog2n n n
特殊 基數排序(2013卷11題) 不斷選取合適的分類方式 d(n+rd),d為關鍵字個數,rd為關鍵字取值范圍 rd
外部排序 歸并排序 nlog2n 外存

八.查找樹

二叉排序樹(B樹/中序樹) 平衡二叉樹 B-樹 B+樹
通過中序建立 利用平衡因子來建立平衡 m(由最大分支定)階查找樹 葉子結點保存所有信息
根結點分支≥2 葉子結點形成一個鏈表
其余結點關鍵字≥ ?m/2?-1
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,156評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,401評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,069評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,873評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,635評論 6 408
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,128評論 1 323
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,203評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,365評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,881評論 1 334
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,733評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,935評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,475評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,172評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,582評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,821評論 1 282
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,595評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,908評論 2 372

推薦閱讀更多精彩內容