資料結構學習筆記系列1 資料結構概論

2021-10-02 09:08:36 字數 4374 閱讀 3609

例1.如何在書架上擺放圖書

操作1:新書如何插入

操作2:如何查詢書

方法1:隨便放

操作1:**有空放**

操作2:累死

方法2:按照書名的拼音字母順序排放

操作2:二分查詢(如:從l開始分前後區(類似解方程的二分法))

操作1:新書插入難(其後的每本書都需要後移)

方法3:把書架劃分幾塊區域,每塊區域指定擺放某種類別的書,在每種類別內按照書名的拼音字母順序排放

操作1:新書插入(先確定類別,二分查詢,移除空位)

操作2:限定類別,再二分查詢

問題:1.空間如何分配 2.類別分多細

總結:解決問題方法的效率和資料的組織方式有關

例2:寫程式實現printn,使得傳入乙個正整數n的引數後,能順序列印從1到n的全部正整數。

以下為兩種輸出程式: 1. 迴圈輸出 2. 遞迴輸出

#include

void

printn

(int n)

;//程式入口

intmain()

//迴圈輸出

void

printn

(int n)

}//遞迴輸出(占用大量記憶體後再輸出)

void

printn

(int n)

return

;}

問題:當n達到10000量級時(每台機器的配置和效能可能有所區別,當n足夠大時結果都是一樣的),遞迴輸出程式出現異常,原因是占用記憶體過大,程式崩潰

總結:解決問題方法的效率和空間的利用效率有關

注:scanf、gets等語句無法正常使用,按照錯誤列表的提示修改指定位置的scanf和gets等語句,scanf改為scanf_s,gets改為gets_s……(而且,scanf在讀取資料時不檢查邊界,可能會造成記憶體訪問越界的問題,使用scanf_s,會多乙個引數來控制讀取的字元數量,這樣確實比使用scanf輸入更加安全。)

例3:寫程式計算給定多項式在給定點x處的值

f(x)=a_0+a_1 x+⋯+a_(n-1) x^(n-1)+a_n x^n

doublef1(

int n,

double a,

double x)

return p;

}

f(x)=a_0+x(a_1+x(⋯(a_(n-1)+x(a_n ))⋯))
doublef2(

int n,

double a,

double x)

return p;

}

例3的問題具體化:多項式簡化為係數以所在項索引值相同的多項式,即

並計算該多項式在點x=1.1處的值f(1.1)。

#include

#include

//clock ()函式需要呼叫此標頭檔案

#include

//在vs中可以不呼叫此標頭檔案也可以計算pow ()函式

//clock_t是clock()函式返回的變數型別,兩個變數代表程式執行起止時間

clock_t start, stop;

//記錄被測函式的執行時間,單位是秒

double duration;

//定義多項式最大項數

#define maxn 10

//定義函式執行次數

#define maxk 1e7

//測試函式的宣告

doublef1(

int n,

double a,

double x)

;doublef2(

int n,

double a,

double x)

;int

main()

start =

clock()

;/*開始計時*/

for(

int i =

0; i < maxk; i++

) stop =

clock()

;/*結束計時*/

duration =((

(double

)(stop - start)

)/ clk_tck)

/maxk;

printf

("ticks1 = %f\n",(

double

)(stop - start));

printf

("duration1 = %6.2e\n"

,duration)

; start =

clock()

;/*開始計時*/

for(

int i =

0; i < maxk; i++

) stop =

clock()

;/*結束計時*/

duration =((

(double

)(stop - start)

)/ clk_tck)

/ maxk;

printf

("ticks2 = %f\n",(

double

)(stop - start));

printf

("duration2 = %6.2e\n"

, duration)

;return0;

}doublef1(

int n,

double a,

double x)

return p;

}doublef2(

int n,

double a,

double x)

return p;

}

測試結果如下圖

計算結果表明採用第二種方法計算多項式會使計算時間縮短乙個數量級。

注:程式中下劃線部分是為了使時間足夠大,便於資料準確及資料採集,否則結果如下

結論:解決問題方法的效率和演算法的巧妙程度有關

問:到底什麼是資料結構

1.資料物件在計算機中的組織方式:

2.資料物件必定與一系列加在其上的操作相關聯,完成這些操作所用的方法就是演算法

抽象資料型別(abstract data type)

資料型別:資料物件集;資料集合相關聯的操作集

抽象:描述資料型別的方法不依賴於具體實現。即

1.與存放資料的機器無關;

2.與資料儲存的物理結構無關;

3.與實現操作的演算法和程式語言無關;

綜上所述:抽象即只描述資料物件集合相關操作集「是什麼」,不涉及「如何做到」的問題。

簡單地模擬就是只看函式的輸入和輸出,不看這個函式是如何實現的具體過程。

例4:「矩陣」的抽象資料型別定義

型別名稱:矩陣(matrix)

資料物件集:乙個mxn的矩陣a_(m×n)=(a_ij)(i=1,⋯,m;j=1,⋯,n)由mxn個三元組構成,其中a是矩陣元素的值,i是元素所在的行號,j是元素所在的列號。

操作集:對於任意矩陣a、b、c∈matrix,以及整數i、j、m、n

matrix create(int m ,int n):返回乙個mxn的空矩陣;

int getmaxrow(matrix a):返回矩陣a的總行數;

int getmaxcol(matrix a):返回矩陣a的總行數;

matrix add(matrix a,matrix b):如果a和b的行、列數一致,則返回矩陣c=a+b,否則返回錯誤標誌;

抽象的地方例如:

矩陣a_(m×n)是二維陣列還是一維陣列還是十字鍊錶並未指明,在此處並不關心其是否是哪種型別;

matrix add操作是先按行相加還是先按列相加,用什麼語言來實現這個操作,在此處並不關心。

資料結構學習筆記 1 資料結構緒論

1.1 資料結構起源 現實中,我們利用計算機更多的不是解決數值計算的問題,而是需要一些更科學有效的手段 比如表 樹和圖等資料結構 的幫助,才能更好地處理問題。資料結構是一門研究非數值計算的程式設計問題中的操作物件,以及它們之間的關係和操作等相關問題的學科。1.2 基本概念和術語 資料元素 是組成資料...

資料結構學習筆記1

1.緒論 2.線性表 3.棧和佇列 4.串5.陣列和廣義表 6.樹和二叉樹 7.圖8.動態儲存管理 9.查詢 10.內部排序 11.外部排序 12.檔案 第一章緒論 1.資料 對客觀事物的符號表示,所有能輸入到計算機裡並被處理的符號的總稱。包括影象 聲音。2.資料元素 資料的基本單位。3.資料項 資...

資料結構學習筆記1

1.clock 捕捉 從程式開始執行到clock 被呼叫時所耗費的時間,它的時間單位是 clock tick,即 時鐘打點 常熟clk tck 機器時鐘每秒所走的時鐘打點數。測試用例 include include clock t start,stop clock t是clock 函式返回的變數型別...