第一章緒論
基本概念和術語
一、資料與資料結構
資料:所有能輸入到計算機中,且能被電腦程式處理的符號的總稱。是計算機操作的物件的總稱。是計算機處理的資訊的某種特定的符號表示形式。
資料元素:是資料(集合)中的乙個「個體」,是資料結構中討論的基本單位。可由若干個資料項組成。
資料項:是資料結構中討論的最小單位。資料元素可以是資料項的集合。
資料物件:是性質相同的資料元素的集合,是資料的乙個子集。
資料結構:帶結構的資料元素的集合。是相互之間存在一種或多種特定關係的資料元素的集合。
不同的「關係」構成不同的「結構」。
資料結構是相互之間存在著某種邏輯關係的資料元素的集合。
資料的邏輯結構可歸結為一下四類:
線性結構:有唯一前驅和後繼
樹形結構:一對多
圖狀結構或網狀結構:多對多
集合結構:無關係
特殊的集合結構:鍵值對
資料結構的形式定義為:
資料結構是乙個二元組:data_structures = (d,s)
其中d是資料元素的有限集,s是
d上關係的有限集。
資料的儲存結構:邏輯結構在儲存器中的映像。
關係的映像方法:(表示
的方法)
順序映像:以相對的儲存位置表示後繼關係。整個儲存結構中只含資料元素本身的資訊。
鏈式映像:以附加資訊(指標)表示後繼關係。需要用乙個和x在一起的附加資訊指示
y的儲存位置。
在不同的程式設計環境中,儲存結構可有不同的描述方法。當用高階程式語言進行程式設計時,通常可用高階程式語言中提供的資料型別描述之。
二、資料型別
不同型別的變數,所能取的值的範圍不同,所能進行的操作也不同
三、抽象資料型別(abstract data type簡稱
adt)
是指乙個數學模型以及定義在此數學模型上的一組操作。
adt有兩個重要特徵:
資料抽象:用adt描述程式處理的實體時,強調的是其本質的特徵、其所能完成的功能以及它和外部使用者的介面(即外界使用它的方法)
資料封裝:將實體的外部特徵和其內部實現細節分離,並且對外部使用者隱藏其內部實現細節。
抽象資料型別的描述方法:
抽象資料型別可用(d,s,p)三元組表示。
d是資料物件,s是
d上的關係集,p是對
d的基本操作集。
多形資料型別:是指其值成分不確定的資料型別。
抽象資料型別的表示和實現
抽象資料型別需要通過固有資料型別(高階程式語言中已經實現的資料型別來實現)
四、演算法和演算法分析
演算法是為了解決某類問題而規定的乙個有限長的操作序列。乙個演算法必須滿足以下五個重要特性:
有窮性:
對於任意一組合法輸入值,在執行有窮步驟之後一定能結束。即:演算法中的每個步驟都能在有限時間內完成。
確定性對於某種情況下所執行的操作,在演算法中都有確切的規定,使演算法的執行者或閱讀者都能明確其含義及如何執行。並且在任何條件下,演算法都只有一條執行路徑,不允許有二義性。
可行性演算法中的所有操作必須足夠基本,都可以通過已經實現的基本操作運算有限次實現之。
有輸入作為演算法加工物件的量值,通常體現為演算法中的一組變數。
有輸出它是一組與輸入有確定關係的量值,是演算法進行資訊加工後得到的結果,這種確定關係即為演算法的功能。
演算法設計的原則:
正確性滿足以特定「規格說明」方式給出的需求
不含語法錯誤
輸出滿足要求的結果
精心選擇、典型、苛刻且刁難性樣例給出結果
一切樣例給出結果
c是衡量演算法是否合格標準
可讀性易於人的理解
健壯性輸入資料非法,能給出相應的處理。處理出錯的方法不應只是中斷程式的執行,而是返回乙個表示錯誤或錯誤性質的值。
高效率與低儲存量需求
效率是指演算法執行時間,儲存量是指所需最大儲存空間。
演算法效率的度量
事後統計法:
缺點:1.必須執行程式
2.其他因素掩蓋演算法本質
事前分析估算法
演算法選用的策略
問題的規模
編寫的語言
編譯質量
計算機速度
乙個特定演算法「執行工作量」只依賴於問題的規模(通常用n
表示)它是問題規模的函式。
演算法執行時間增長率和f(n)的增長率隨
n增長相同。
t(n) = o(f(n))
。t(n)為演算法(漸進)時間複雜度
如何估算演算法的時間複雜度?
演算法=控制結構
+原操作
演算法執行時間=σ原操作執行時間
x原操作執行次數
從演算法中選取一種對於所研究的問題來說是基本操作的原操作,以該基本操作在演算法中重複執行的次數作為演算法執行時間的衡量準則。
氣泡排序可優化到nlogn
多項式時間問題p問題
演算法的儲存空間需求
s(n)=o(g(n))表示隨著問題規模
n的增大,演算法執行所需儲存量的增長率與
g(n)
的增長率一樣
演算法的儲存量包括:
輸入資料2.程式本身
3.輔助變數
若輸入資料所佔空間只取決於問題本身,和演算法無關,則只需要分析除輸入和程式之外的輔助變數所佔額外空間。
若所需額外空間相對於輸入資料量來說是常熟,則稱此演算法為原地工作。
若所需儲存量依賴於特定的輸入,則通常按最壞情況考慮。
資料結構與演算法(緒論)
作為乙個準程式設計師,在讀本科的時候,就一直被老師不停的灌輸資料機構與演算法的重要性,但是好像我們從來就沒遇到過真正棘手的需要通過資料結構去解決的問題,可能唯一再聽到它的時候就是找工作實習的時候會被面試官提問,因此我們似乎覺得資料結構沒那麼重要,而且又因為各種程式語言,尤其是python,各種內建的...
資料結構與演算法 緒論
一般法則 法則1 for迴圈 乙個for迴圈的執行時間至多是該for迴圈內部那些語句的執行時間乘以迭代的次數。法則2 巢狀的for迴圈 從裡向外分析這些迴圈。在一組巢狀迴圈內部的一些語句總的執行時間為該語句的執行時間乘以該組所有的for迴圈的大小的乘積 例如,下列程式片斷為o n2 for i 0 ...
資料結構與演算法 緒論
重要性 使用者資訊表usersid name 001 bigsai man002 smallsai man003 菜虛鯤woman users的pojo物件 class users list和woman是資料 listlist 資料物件list listwoman 資料物件woman list.ad...