數(shù)據(jù)結(jié)構(gòu)著重關(guān)注的是數(shù)據(jù)元素之間的關(guān)系,和對這些數(shù)據(jù)元素的操作,而不關(guān)心具體的數(shù)據(jù)項內(nèi)容
冀州網(wǎng)站建設(shè)公司成都創(chuàng)新互聯(lián)公司,冀州網(wǎng)站設(shè)計制作,有大型網(wǎng)站制作公司豐富經(jīng)驗。已為冀州上千提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站建設(shè)公司要多少錢,請找那個售后服務(wù)好的冀州做網(wǎng)站的公司定做!
定義:各個元素同屬于一個集合,別無其他關(guān)系;
定義:
樹形結(jié)構(gòu)(一對多)——>第四章
圖狀結(jié)構(gòu)(多對多)——>第五章
定義:針對于某種邏輯結(jié)構(gòu),結(jié)合實際需求,定義基本運算
基本運算:
總結(jié):
程序 = 數(shù)據(jù)結(jié)構(gòu) + 算法
算法(Algorithm)是對特定問題求解步驟的一種描述,它是指令的有限序列,其中的每條指令表示一個或多個操作;
事前預(yù)估算法時間開銷T(n)與問題規(guī)模n的關(guān)系(T表示“time”)
例題:
// 算法1—— 逐步遞增型愛你
void loveYou(int n) { //n 為問題規(guī)模
(1) int i=1; // 愛你的程度
(2) while(i<=n) {
(3) i++; // 每次+1
(4) printf("I Love You %d\n", i);
}
(5) printf("I Love You More Than %d\n", n);
}
int main(){
loveYou(3000);
}
語句頻度
(1) ——1次
(2) ——3001次
(3)(4) ——3000次
(5) ——1次
T(3000) = 1 + 3001 + 2 * 3000 + 1
時間開銷與問題規(guī)模n的關(guān)系:
T(n)=3n+3 只關(guān)注復(fù)雜度的數(shù)量級 ——> T(n) = O(n)
復(fù)雜度大小優(yōu)先級排序:
O(1) < O(log2n) < O(n) < O(nlog2n) < O(n2) < O(n3) < O(2n) < O(n!) < O(nn)
口訣:常對冪指階
例題:
// 算法1—— 嵌套循環(huán)型愛你
void loveYou(int n) { //n 為問題規(guī)模
(1) int i=1; // 愛你的程度
(2) while(i<=n) {
(3) i++; // 每次+1
(4) printf("I Love You %d\n", i);
(5) for (int j=1; j<=n; j++){
(6) printf("I am a man!\n") ;
}
}
(7) printf("I Love You More Than %d\n", n);
}
int main(){
loveYou(3000);
}
時間開銷與問題規(guī)模n的關(guān)系:
T(n) = O(n) + O(n2) = O(n2)
例題:
// 算法3——指數(shù)增長型愛你
void loveYou(int n) {
int i=1;
while(i<=n0){
i=i*2; // 第一次循環(huán) i=2;第二次循環(huán) i=4;第三次循環(huán) i=8......
printf("I Love You %d\n",i);
}
printf("I Love You More Than %d\n",n);
}
通過上述循環(huán)可知 i = 2x
所以想要退出while循環(huán),x = log2n + 1
所以上述算法的時間復(fù)雜度為T(n) = O(x) = O(log2n)
空間開銷S(n)與問題規(guī)模n的關(guān)系(S表示“Space”)
例題:
// 算法1——逐步遞增型愛你
void loveYou(int n) {
int i=1;
while(i<=n){
i++;
printf("I Love You %d\n",i);
}
printf("I Love You More Than %d\n",n);
}
轉(zhuǎn)入內(nèi)存 程序代碼 數(shù)據(jù)
綜上所述,上述算法的空間復(fù)雜度為:S(n)=O(1)
算法原地工作——算法所需內(nèi)存空間為常量;
函數(shù)遞歸調(diào)用帶來的內(nèi)存開銷:
// 算法5——遞歸型愛你
void loveYou(int n) {
int a,b,c;
if (n > 1) {
loveYou(n-1);
}
printf("I Love You %d\n",n);
}
int main() {
loveYou(5);
}
上述代碼的空間復(fù)雜度為:S(n)=O(n) O(n)空間復(fù)雜度 = 遞歸調(diào)用的深度
線性表是具有相同數(shù)據(jù)類型的n(n>=0)個數(shù)據(jù)元素的有限 序列,其中n為表長,當(dāng)n=0時線性表是一個空表。若用L命名線性表,則其一般表現(xiàn)為:
L = (a1, a2, ... , ai, ai+1, ... , an) 腳標(biāo)從1開始計數(shù)
InitList(&L): //初始化表。構(gòu)造一個空的線性表L,分配內(nèi)存空間;
DestroyList(&L): //銷毀操作。銷毀線性表,并釋放線性表L所占用的內(nèi)存空間;
ListInsert(&L,i,e): //插入操作。在表L中的第i個位置上插入指定元素e;
ListDelete(&L,i,&e): //刪除操作,刪除表L中第i個位置的元素,并用e返回刪除元素的值;
LocateElem(L,e): //按值查找操作。在表L中查找具有給定關(guān)鍵字的元素;
GetElem(L,i): //按位查找操作。獲取表L中第i個位置的元素的值;
Tips:
用順序存儲 的方式實現(xiàn)線性表的順序存儲;把邏輯上相鄰的元素存儲在物理位置上也相鄰的存儲單元中,元素之間的關(guān)系由存儲單元的鄰接關(guān)系來體現(xiàn);
如何知道一個數(shù)據(jù)元素大???
C語言 sizeof(ElemType)
sizeof(int) = 4B
sizeof(Customer) = 8B
#define MaxSize 10 //定義最大長度
typedef struct {
ElemType data[MaxSize]; //用靜態(tài)的“數(shù)組”存放數(shù)據(jù)元素
int length; //順序表的當(dāng)前長度
}SqList; //順序表的類型定義(靜態(tài)分配方式)
//基本操作---初始化一個順序表
void InitList(SqList &L){
for(int i=0; i
#define InitSize 10 //順序表的初始長度
typedef struct {
ElemType *data; //指針動態(tài)分配數(shù)組的指針
int MaxSize; //順序表的最大容量
int length; //順序表的當(dāng)前長度
}SqList; //順序表的類型定義(動態(tài)分配方式)
key:動態(tài)申請和釋放內(nèi)存空間
malloc 和 free 函數(shù):
L.data = (ElemType *)malloc(sizeof(ElemType)*InitSize);
//malloc函數(shù)申請一整片連續(xù)空間
#define InitSize 10 //順序表的初始長度
typedef struct {
ElemType *data; //指針動態(tài)分配數(shù)組的指針
int MaxSize; //順序表的最大容量
int length; //順序表的當(dāng)前長度
}SqList;
void InitList(SeqList &L){
//用malloc函數(shù)申請一片連續(xù)的存儲空間
L.data=(int *)malloc(InitSize*sizeof(int));
L.length=0;
L.MaxSize = InitSize;
}
//增加動態(tài)數(shù)組的長度
void IncreaseSize(SeqList &L, int len){
int *p=L.data;
L.data=(int *)malloc((L.MaxSize + len)* sizeof(int));
for(int i=0;i