數據結構(C語言) 概論

因爲學校近期校企合作與甲骨文公司進行了人才培養計劃,希望通過選拔然後進入甲骨文的培訓,然後大三正式的進入甲骨文的僱主機構實習,所以決定複習一下數據結構。
其實,一到了大二吧,之前沒怎麼學編程都在做其他的差別就出來了,雖然說我的態度還挺好,在其他的活動中也學到了很多東西,但是技術這個問題,還沒有一個算是精通的。爬蟲也玩,網頁也做,小程序也想碰一下,自己專業是一個搞移動終端的。嗯,我想走走,去企業看看,這些企業現在正在用什麼,需要什麼。然後等着大四再回來,選擇好好的去走完大學的最後一程。加油,儘量這幾天複習完。
1.1數據結構的基本概念與術語
數據結構討論的是數據的邏輯結構,存儲方式以及相關操作。
爲什麼會出現數據結構這種東西?
計算機早期的時候,計算的基本都是數值型數據,主要用於數值計算。而後,隨着計算機的發展,計算機軟件硬件的升級,計算機的應用範圍也在不斷的被擴大。這時候處理的數據就不再是單純的數值型數據了,而更多的是非數值數據。如果不去考慮數據的組織結構,那麼數據的處理將會十分的低效,有時甚至無法執行。   需要處理的數據並不是雜亂無章的,它們之間一定有內在聯繫,只有弄清楚他們之間的本質的聯繫,才能使用計算機對大量的數據進行有效的處理。
三個重要問題:
1.數據的邏輯結構
2.數據的存儲結構
3.數據的集合運算
數據結構就是指按一定的邏輯結構組成的一批數據,使用某種存儲結構將這批數據存儲於計算機中,並在這些數據上定義了一個運算集合。在討論一個數據結構的時候,數據結構所包含的3個方面缺一不可。
1.1.2數據的邏輯結構
數據的邏輯結構是數據與數據之間存在的邏輯關係,可以用二元組表示,也可以用圖形表示。數據的邏輯結構獨立於計算機,與數據在計算機中的存儲無關。邏輯結構中有線性結構與非線性結構(樹型結構與圖形結構等)
1.1.3數據的存儲結構
要對數據進行處理就要把數據存儲於計算機之中,如果存儲無規律那麼處理時就會相當糟糕,是沒有用的。
數據的存儲結構主要有四種:
1.順序存儲 邏輯相鄰的結點一定是物理相鄰的。
2.鏈式存儲 鏈式存儲是給每一個結點附加一個指針段,一個指針段存在多個指針,所以一個結點可能有多個後繼,數據的存儲可以不相鄰。數據的存儲結構一定要體現它的邏輯結構,這裏通過指針來體現。
3.索引存儲  索引存儲就是根據結點的索引號確定該結點的存儲地址。
4.散列存儲 散列存儲的思想是構造一個從集合K到存儲區域M的函數h,該函數的定義域爲K,值域爲M,M,K中的每一個結點k1在計算機 中的存儲地址由h(k1)確定。

一個數據結構存儲在計算機中,整個數據結構所佔的存儲空間一定不小於數據本身所佔的存儲空間,通常把數據本身所佔的存儲空間的大小與整個數據結構所佔存儲空間的大小之比稱爲數據結構的存儲密度。 顯然數據結構的存儲密度不大於1.順序存儲的存儲密度爲1,鏈式存儲的存儲密度小於1.
1.1.4數據的運算集合
對於一批數據,數據的運算是定義在數據的邏輯結構上的,而運算的具體實現依賴於數據的存儲結構。
數據的運算集合主要有:1.插入 、2.刪除、3.檢索、4.輸出、5.排序


1.2數據類型和抽象數據類型
數據的抽象三個階段:
1.從無類型的二進制數到基本數據類型的產生
2.從基本數據類型到用戶自定義類型的產生
3.從用戶自義類型都抽象數據類型的產生(軟件危機)

1.2.1數據類型
數據類型反映了數據的取值範圍以及對這種數據可以施加的運算。
數據結構是數據的存在形式,所有的數據都是按照數據結構進行分類的。簡單數據類型對應於簡單的數據結構;構造數據類型對應於複雜的數據結構。
1.2.2抽象數據類型
抽象數據類型是數據類型的進一步抽象,是對基本數據類型的延伸和發展。抽象數據類型是與表示無關的數據類型,是一個數據模型及定義在該模型上的一組運算。定義一個抽象數據類型時,必須給出它的名字及各運算的運算符名,即函數名,並且規定這些參數的性質。
(說的這麼多,其實就是相當於JAVA中一個類,這個類是封裝好的,然後其中定義了一些方法)

1.2.3抽象數據類型的描述和實現
抽象數據類型的描述包括給出抽象數據類型的名稱,數據的集合以及數據之間的關係和操作等集合等方面的描述。抽象數據類型的設計者根據這些描述給出操作的具體實現,抽象數據類型的使用者依據這些描述使用抽象數據類型。
抽象類型描述的一般形式:
ADT 抽象數據類型名稱{
數據對象:
數據關係
}
用C語言完整的實現抽象數據類型是不現實的。但是自己學了JAVA,和Python這些對於我來說都是可以實現的了。有時候就會發現,學了後面之後,前面的又好像更懂了。

1.3算法和算法分析
算法是求解問題的一種方法或過程,更嚴格的講,算法是由若干條指令組成的有窮序列,並滿足以下5個特徵。
1.有窮性 有限步內完成
2.確定性 每一個步驟必須是確定的、無二義性的。
3.輸入 算法可以由0個或多個輸入。
4.輸出 算法一定有輸出結果
5.可行性 算法中的運算必須是可以實現的
程序是用計算機語言表達的求解一個問題的一系列指令的序列,它和算法的主要區別是,算法具有有窮性,程序不需要具備有窮性。 一般的程序都會在有限的時間內終止,但有的程序卻可以不在有限的時間內終止,如一個操作系統在正常情況下是永遠不會停止的。

1.3.2算法的時間複雜度和空間複雜度
一個算法的優劣主要從算法執行的時間和存儲空間的大小兩個方面來衡量。所謂的時間並不是絕對時間,而是基本操作的執行次數,即計算量來衡量。
在評價算法的時間複雜度的時候,不是考慮兩算法執行次數之間的區別,而只關心算法本質上的區別。

(一些具體函數的O()表示)
f(n)O(g(n))量級
35O(1)常數階
2n+7O(n)線性階
n²+10O(n²)平方階
2n³+nO(n³)立方階

按量級遞增排序常見算法的時間複雜度有:
常數階、對數階、線性階、線性對數階、平方階、立方階、...、k次方階、指數階

算法的時間複雜度,不僅和問題的規模有關,還與問題數據的初始狀態有關。(仔細想想檢索問題)
算法在平均情況下的時間複雜度是指算法在所有的可能的情況下計算量經過加權計算出來的平均值。
算法的空間複雜度一般考慮的是算法中除了存儲數據本身以外附加的空間,它的度量方法與時間複雜度相似。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章