線性表知識點總結

1、數據結構

思惟導圖

1.算法的特色:

明確-算法應該是明確的,絕不含糊的。它的每一個步驟,和它們的輸入/輸出的應明確和必須致使只有一個意思。
輸入-算法應該具備0個或多個明確的定義輸入
輸出-算法應該有1個或多個明肯定義的輸出,而且應當匹配所需的輸出。
有限性-算法必須終止在有限的以後的步驟。
可能性-應當與可用資源的可行性。
獨立-算法應該有逐步的方向,應該是獨立於任何編程代碼。node

2.基本概念

數據——全部能被計算機識別、存儲和處理的符號的集合。
數據元素——是數據的基本單位,具備完整肯定的實際意義。
數據對象——具備相同性質的數據元素的集合,是數據的一個子集。
數據結構——是相互之間存在一種或多種特定關係的數據元素的集合,表示爲:
Data_Structure=(D, R)
數據類型——是一個值的集合和定義在該值上的一組操做的總稱。
抽象數據類型——由用戶定義的一個數學模型與定義在該模型上的一組操做,
它由基本的數據類型構成。算法

3.時間複雜度和空間複雜度

(1)時間複雜度是指執行算法所須要的計算工做量。

時間複雜度是一個函數,它定性描述了該算法的運行時間。這是一個關於表明算法輸入值的字符串的長度的函數。時間複雜度經常使用大O符號表述,不包括這個函數的低階項和首項係數。編程

(2)空間複雜度是指執行這個算法所須要的內存空間。

空間複雜度須要考慮在運行過程當中爲局部變量分配的存儲空間的大小,它包括爲參數表中形參變量分配的存儲空間和爲在函數體中定義的局部變量分配的存儲空間兩個部分。
常見的時間複雜度有
常數階O(1),
對數階O(log2 n),
線性階O(n),
線性對數階O(n log2 n),
平方階O(n^2),
立方階O(n^3)
k次方階O(n^K),
指數階O(2^n)。
隨着n的不斷增大,時間複雜度不斷增大,算法花費時間越多。
數組

2、線性表

思惟導圖

順序表:

(一)基礎知識:

1.

元素-存儲在數組中的每一個項被稱爲一個元素數據結構

2.

索引-在一個數組元素所在的每一個位置,是具備一個用於識別該元素的數值索引。函數

(二)結構體:

typedef int Elemtype;//EkemType類型其實是int 
typedef struct{
	Elemtype deta[Maxsize];//存放順序表中的元素 
	int length;//順序表的長度 
}SpList;

(三)基本操做:

遍歷-一個一個打印全部的數組元素。
插入-給定索引處添加元素。
刪除-刪除給定索引處的元素。
搜索(查找)-搜索用特定索引或元素值。
修改(更新)-修改給定索引處的元素值。code

1.初始化順序表:InitList(SpList*&L)時間複雜度O(1)對象

2.銷燬順序表:DestroyList(Splist*L)時間複雜度O(1)blog

3.輸出順序表:DispList(Splist*L)時間複雜度(ListLength(L))遞歸

4.獲取L中第i個元素的值,存放在e中:GetElem(SpList*L,int ####i,ElemType&e)時間複雜度:O(1)

5.按元素值查找位置:LocateElem(Splist*L,Elemtype e)時間復度O(ListLength(L))

6.插入元素:ListInsert(Splist*&L,int i, ElemType &e)時間複雜度O(ListLength(L))

7.刪除元素:ListDelete( Splist*&L,int i, ElemType &e) 時間複雜度(ListLength(L)

鏈表

(一)結構體

typedef struct LNode//定義單鏈表節點 
{
	Elemtype data;//數據域 
	struct LNode*next;//指向後繼節點 
}LinkList;

(二)基本操做

1.

初始化:InitList(L)時間複雜度O(1)

2.

銷燬:DestroyList(LinkLIst*&L)時間複雜度O(1)

3.

判斷是否爲空:ListEmpty(LinkList*L) 時間複雜度O(1)

4.

求鏈長:Listlength(LinkList*L)時間複雜度爲O(n)

5.

輸出線性表DispList(L)時間複雜度O(n)

6.

求指定數據的某個數據元素 GetElem(LinkList*L,int i,ElemType &e)時間複雜度O(n)

7.

插入:LinkInsert(&L,i,&e)時間複雜度O(n)

8.

刪除:ListDelete(&L,i,&e)時間複雜度O(n)

頭插法

s = new LNode;
s->data = a[i];
s->next = L->next;
L->next = s;

尾插法

L =new Lnode; 
r = L;
s = new LNode;
s->data = a[i];
r->next = s;
r = s;

1.介紹

(1)

後進先出(LIFO),插入和刪除都在同一端(棧頂)進行

(2)

用於:語法檢查、計算表達式的值、實現遞歸過程、函數調用、迷宮問題、符號匹配。

2.結構體:

順序棧

typedef struct  
{
	Elemtype data[MaxSize];
	int top;//棧頂位置 
}SpStack;

鏈棧

typedef struct linknode  
{
	Elemtype data;
	struct linknode *next;
}LiStack;

3.STL-stack用法

stack s。
入棧,如例:s.push(x)。
出棧,如例:s.pop();注意,出棧操做只是刪除棧頂元素,並不返回該元素。
訪問棧頂,如例:s.top()。
判斷棧空,如例:s.empty(),當棧空時,返回true。
訪問棧中的元素個數,如例:s.size()。

隊列

1.隊列和循環隊列

(1)

先進先出(FIFO),一端(隊尾)插入,另外一端(隊首)刪除,能夠以數組或鏈表來模擬。

(2)

用於寬度優先遍歷

(3)

以n個位置的數組來存儲隊列時,線性隊列中最多能夠存儲n個元素,循環隊列能夠存儲n-1個元素。

(4)

循環隊列中,若是以head表示隊首,tail表示下一個插入位置。

2.結構體:

順序隊:

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

鏈隊

typedef struct QNode  
{
	Elemtype data;
	struct QNode *next;
}QNode;
typedef struct
{
	QNode *front;
	QNode *rear;
}

3.STL-queue的用法:

queue q1。

1.

入隊,如例:q1.push(x); 將x接到隊列的末端。

2.

出隊,如例:q1.pop(); 彈出隊列的第一個元素,注意,並不會返回被彈出元素的值。

3.

訪問隊首元素,如例:q1.front(),即最先被壓入隊列的元素。

4.

訪問隊尾元素,如例:q1.back(),即最後被壓入隊列的元素。

5.

判斷隊列空,如例:q1.empty(),當隊列空時,返回true。

6.

訪問隊列中的元素個數,如例:q1.size()。

1.定義

:由零個或多個字符組成的有限序列。記爲: s=’a1a2a3……an’ (n>=0)
串名:s
串值: a1a2a3……an
串長:n
子串:串中任意個連續的字符組成的子序列
任意串是其自身的子串
主串:包含子串的串。
位置:字符在串中的序號稱爲該字符在串中的位置。
空格串:由一個或多個空格組成的串,長度爲空格個數。
空串:零個字符的串,用Φ表示。空串是任意串的子串
串相等:兩個串長度相等且各個對應位置的字符也相等

2.空串和空白串有無區別?

答:有區別。
空串(Null String)是指長度爲零的串;
而空白串(Blank String),是指包含一個或多個空白字符‘ ’(空格鍵)的字符串.

3.補充

「空串是任意串的子串;任意串S都是S自己的子串,除S自己外,S的其餘子串稱爲S的真子串。」

4.string的簡單用法

a) string s; //生成一個空字符串s
b) string s(str) //拷貝構造函數 生成str的複製品
c) string s(str,stridx) //將字符串str內「始於位置stridx」的部分看成字符串的初值
d) string s(str,stridx,strlen) //將字符串str內「始於stridx且長度頂多strlen」的部分做爲字符串的初值
e) string s(cstr) //將C字符串做爲s的初值
f) string s(chars,chars_len) //將C字符串前chars_len個字符做爲字符串s的初值。
g) string s(num,c) //生成一個字符串,包含num個c字符
h) string s(beg,end) //以區間beg;end(不包含end)內的字符做爲字符串s的初值
i) s.~string() //銷燬全部字符,釋放內存

5.難點

KMP算法

(1)求next函數值

//next函數求值
void get_next(HString &S,int *p){
	int i = 0, j = 0;
	i = 0; *p = 0;
	while (i<S.length-1)               
	{
		if (j==0||S.ch[i]==S.ch[j-1]){   
			i++; j++;
			p[i] = j;
		}
		else
		{
			j = p[j-1];
		}
	}
}

(2)求next函數改進算法

//KMP模式匹配改進算法
void get_nextval(HString &S, int *p){
	int i = 0, j = 0;
	i = 0; *p = 0;
	while (i < S.length - 1)           
	{
		if (j == 0 || S.ch[i] == S.ch[j - 1]){
			i++; j++;
			if (S.ch[i]!=S.ch[j-1])
			{
				p[i] = j;
			}
			else{
				p[i] = p[j-1];
			}
		}
		else
		{
			j = p[j - 1];
		}
	}
}

(3)KMP實現定子串位置函數

//KMP模式匹配算法
int Index_KMP(HString T,HString S,int pos,int *p){
	int i = pos, j = 0;
	while (i<S.length&&j<T.length)
	{
		if (S.ch[i]==T.ch[j])
		{
			i++; j++;
		}
		else
		{
			j = p[j];
			if (j==0)
			{
				i++;
			}
			else
			{
				j--;
			}
		}
	}
	if (j>=T.length)
	{
		return i - T.length+1;
	}
	else
	{
		return 0;
	}
}
相關文章
相關標籤/搜索