資料結構與演算法入門

2022-07-21 04:51:12 字數 4050 閱讀 5735

1.描述乙個演算法優劣用計算次數的

數量級。1m/1g/1t。

與問題相關的規模用n

t(n)=n^2/n^3

2.常見的時間複雜度(用大o表示法表示)

常數階 o(1)

線性階 o(n)

平方階 o(n^2)

對數階 o(logn)

nlogn階 o(nlogn)

立方階 o(n^3)

指數階 o(2^n )

o(1)logn 是2為底n的對數,2通常省略

迭代就是o(n)

計算時間複雜度可以用橫向展開*縱向進行計算

----------------------

1.順序表

*通過儲存的方式分類可以用為為,存元素本身和存元素的位址

一般存不同資料型別的元素存元素的位址

*根據是否能進行擴充修改分為動態順序表和靜態順序表

* 順序表由表頭與資料區兩部分組成,而根據二者之間的關係可將順序表分為

一體式結構與分離式結構

* 為了考慮資料的動態變化

通常採用分離式

* python中 list 和 tuple 就是採用分離式、動態順序表的資料結構。

因此,可以通過順序表連續的特點通過下標找到該元素的位置

* 擴充策略,空列表分配8個元素,四個位元組儲存區,採用的存位址。

再擴充,區滿倍增4,閾值50000採用一倍

2.鍊錶

*因為順序表是連續儲存資料的,

所以在擴充修改時時間複雜度很高

所以引出了另外一種鍊錶資料結構。而

它與順序表都是線性表,是一維的資料結構。

* 根據連線的方向,可以分為單向鏈結和雙向鏈結

* 從時間複雜度來看,鍊錶和順序表沒差多少。

在存資料時煉表佔記憶體多,但是可以分散

順序錶可一通過下標一次找到,但必須有一塊連續的儲存空間

* 必須得有個_head指向第乙個節點,我們稱之為首結點

* 鍊錶中不在首位,在指定位置增刪查都需要從頭遍歷。使用cur、pre游標配合count進行操作

* 構建乙個鍊錶資料結構要定義兩個類,乙個是node結點類,乙個是鍊錶類。結點類是儲存資料和next指標的,

鍊錶類是將個節點串穿起來

3.棧* 鍊錶順序表描述是資料如何存放,而棧描述的是資料的操作特性,棧是單口,後進先出

4.佇列雙口,先進先出

* 棧與佇列相比:棧,一段開口的容器,從哪進從哪齣,先進的被壓到底下只能後出,後進的反而可以先出。

佇列:乙個通的管道,一端進一端出,也就是先進先出。

5.排序演算法

1.冒泡

2.選擇排序

3.插入排序

4.希爾排序

5.快速排序 --->核心就是找位置。兩個游標互換

快速排序時間複雜度 n*logn

6.歸併排序 ---對新列表進行操作,使用遞迴式不斷開闢新空間,浪費記憶體,但時間上是最理想的,最穩定的。

面試:1)你知道哪些排序演算法

2)寫幾個你所知道的排序演算法,必須掌握快排

7.搜尋

*二分法查詢 ---- 查詢範圍必須是有序的順序表。優點:查詢速度快,平均效能好;分為遞迴版本和非;遞迴版本。

8.遞迴與迴圈

9.tree

1)基本名詞術語

* 節點的度:有幾個子節點;樹的度:整個最大的節點度

* 葉節點:度為零的結點 分支節點:

* 層次的定義:從根開始定義起,根為第一層,根的子節點為第二層

* 深度的定義:節點的最大層次

* 有序樹和無序樹:根據樹中子節點之間沒有用順序關係判斷

2)樹的種類

無序樹有序樹

* 二叉樹:

完全二叉樹:高度為h,除了h層,其餘所有節點都達到最大度

滿二叉樹:所有層必須達到最大度

平衡二叉樹

排序二叉樹

* 霍夫曼樹

* b樹

3)二叉樹必須要掌握:

* 遍歷方法:層次遍歷(廣度優先遍歷)、先序、中序、後序等深度優先遍歷-----遞迴演算法與非遞迴演算法

(根據 根 的位置命名,左右固定,看根在哪個位置)---無限追蹤到最小二叉樹。

* 層次遍歷:通過佇列+迴圈來實現

* 深度遍歷:通過遞迴來實現,列印,找樹的順序來判斷是先序中序還是後序

* 根據遍歷序列恢復二叉樹

4)用於遞迴的終止判斷放到最前面

9.快速排序最優時間複雜度nlogn

這種情況是你每次找出來的樞值位於整個序列的中間左右,這樣在每次分的時候,分別對他左右兩邊進行重複操作。

而每次操作時間複雜度是n,一共進行logn次操作,總共的時間複雜度是nlogn。可以把這種情況理想成完全二叉樹

(左右兩個子樹的高度差的絕對值不超過1),這樣它拆分到葉子結點剛剛為nlogn次。每一次搜尋的時間複雜度為n

那麼一共就是nlogn

而最壞時間複雜度是n方,也就是說每次分的的時候,樞值取的都是最小或最大,取的都是兩邊的。

而這種情況與上面模擬相當於非平衡二叉樹,取極限情況,二叉搜尋樹將退化成近似鏈或鏈,

此時,其操作的時間複雜度將退化成線性的,即o(n)。而每次搜尋為n,一共分n方。

10.具有n個結點的非空完全二叉樹的深度為h=logn+1.

11.動態規劃-------------------

1.與數學歸納推理法想結合去思考。

1)馬爾科夫模型a(i-1)----->a(i)。就是說每後一項都由前一項推理出來,這種推理被稱為貪心法。

2)高階馬爾科夫模型a----->a(i+1)。後一項需要它前面的每一項才能推理出來。這種推理稱為動態規劃

12.桶排序:

1)原理:桶排序也稱計數排序,就是將資料集裡面所有元素按順序列舉出來,然後統計元素出現的次數。

最後按順序輸出資料集裡面的元素。

實現方式:

[桶—關鍵字]對映函式。具體實現方式是建立乙個長度

為待排序元素最大值的陣列,陣列中元素均為0,然後同過將元素出現的次數進行技術的表示,將每乙個存在元素的值標記為1。

按照順序,將這些元素的索引列印出來,列印出來的新列表即為排序以後的順序。

2)優點:速度快,對於重複元素較多的序列比較有利

3)缺點:在建立乙個桶時會占用很多記憶體空間,也是一種以時間換空間的做法。目前自己只掌握排正整數,不夠完善。

4)時間複雜度o(2

13.雜湊表:

雜湊表的構造方法是:假設要儲存的資料元素個數為n,設定乙個長度為m(m≥n)的連續儲存單元,

分別以每個資料元素的關鍵字為自變數,通過雜湊函式,把對映為記憶體單元的某個位址,並將該資料元素儲存在該記憶體單元中。

從數學的角度來看,雜湊函式實際上是關鍵字到記憶體單元的對映,

1)計算機計算過程中離不開比較和查詢,而雜湊表就是經典便於查詢的資料結構沒有之一,一步到位。

2)其特點就是儲存時隨機的,並且採取不同的雜湊演算法儲存的位置是不同的。按照一定的雜湊演算法之後,再去找某個元素,

只需要去找它對應的key值即可,時間複雜度為o(1)

3)而使用hash最經常遇到的就是衝突,也就是兩個元素對應同樣乙個key,所以要想辦法去解衝突。

雜湊衝突通常是很難避免的,解決雜湊衝突有很多種方法,通常分為兩大類:

開放定址法:它是一類以發生雜湊衝突的雜湊位址為自變數,通過某種雜湊函式得到乙個新的空閒記憶體單元位址的方法(如圖),開放定址法的雜湊衝突函式通常是一組;

鍊錶法:當未發生衝突時,則直接存放該資料元素;當衝突產生時,把產生衝突的資料元素另外存放在單鏈表中。

4)常用雜湊演算法

直接定址法:該方法是取關鍵字的某個線性函式值為雜湊位址。可以簡單的表示為:,優點是不會產生衝突,但缺點空間複雜度可能會很高,適用於元素較少的情況下;

除留餘數法:它是用資料元素關鍵字除以某個常數所得的餘數作為雜湊位址,該方法計算簡單,適用範圍廣,

是最經常使用的一種雜湊函式,可以表示為:,該方法的關鍵是常數的選取,一般要求是接近或等於雜湊表本身的長度

,理論研究表明,該常數取素數時效果最好。

數字分析法:該方法是取資料元素關鍵字中某些取值較均勻的數字位來作為雜湊位址的方法,這樣可以盡量避免衝突,但是該方法只適合於所有關鍵字已知的情況。對於想要設計出更加通用的雜湊表並不適用。

資料結構與演算法入門 資料結構型別

資料的邏輯結構 資料的邏輯結構指資料元素之間的邏輯哦關係 和實現無關 分類一 線性結構和非線性結構 線性結構 有且只有乙個開始結點和乙個終端節點,並且所有節點都最多只有乙個直接前繼和乙個直接後繼。線性表就是乙個典型的線性結構,它有四個基本特徵 1.集合中必存在唯一的乙個 第乙個元素 2.集合中必存在...

資料結構與演算法入門(1)

一 資料結構 資料之間相互存在的一種或多種特定的關係的元素的集合。邏輯結構 資料物件中資料元素之間的相互關係 1.集合結構 在資料結構中,如果不考慮資料元素之間的關係,這種結構稱為集合結構。各個元素是平等的,共同屬性是屬於同乙個集合 2.線性結構 線性結構中的資料元素之間存在乙個對應乙個的關係,除了...

演算法與資料結構(入門版本)

博主主要講解以下幾個方面的東西 計算機內有關資料的概念。常用的資料結構。說到這裡不得不提一下計算機解決問題的步驟。1,根據具體問題抽象出數學模型。建模 2,根據模型設計出演算法。演算法設計 3,根據演算法設計程式,程式設計,執行,除錯程式,直到解決問題。程式設計,除錯,執行 乙個著名公式 程式 演算...