七 基本演算法,資料結構和設計模式

2021-10-07 10:03:22 字數 4496 閱讀 7642

棧:stack,又稱堆疊,它是運算受限的線性表,其限制是僅允許在標的一端進行插入和刪除操作,不允許在其

他任何位置進行新增、查詢、刪除等操作。

簡單的說:採用該結構的集合,對元素的訪問有如下的特點

先進後出(即,存進去的元素,要在後它後面的元素依次取出後,才能取出該元素)。例如,子彈壓進彈

夾,先壓進去的子彈在下面,後壓進去的子彈在上面,當開槍時,先彈出上面的子彈,然後才能彈出下面的

子彈。棧的入口、出口的都是棧的頂端位置。

這裡兩個名詞需要注意:

壓棧:就是存元素。即,把元素儲存到棧的頂端位置,棧中已有元素依次向棧底方向移動乙個位置。

彈棧:就是取元素。即,把棧的頂端位置元素取出,棧中已有元素依次向棧頂方向移動乙個位置。

佇列

佇列:queue,簡稱隊,它同堆疊一樣,也是一種運算受限的線性表,其限制是僅允許在表的一端進行插入,

而在表的另一端進行刪除。

簡單的說,採用該結構的集合,對元素的訪問有如下的特點:

先進先出(即,存進去的元素,要在後它前面的元素依次取出後,才能取出該元素)。例如,小火車過山

洞,車頭先進去,車尾後進去;車頭先出來,車尾後出來。

佇列的入口、出口各佔一側。例如,下圖中的左側為入口,右側為出口

鍊錶

鍊錶:linked list,由一系列結點node(鍊錶中每乙個元素稱為結點)組成,結點可以在執行時動態生成。每

個結點包括兩個部分:乙個是儲存資料元素的資料域,另乙個是儲存下乙個結點位址的指標域。我們常說的

鍊錶結構有單向鍊錶與雙向鍊錶,那麼這裡給大家介紹的是單向鍊錶。

簡單的說,採用該結構的集合,對元素的訪問有如下的特點:

多個結點之間,通過位址進行連線。例如,多個人手拉手,每個人使用自己的右手拉住下個人的左手,依次

類推,這樣多個人就連在一起了。

查詢元素慢:想查詢某個元素,需要通過連線的節點,依次向後查詢指定元素

增刪元素快:

增加元素:只需要修改連線下個元素的位址即可。

刪除元素:只需要修改連線下個元素的位址即可。

紅黑樹

二叉樹:binary tree ,是每個結點不超過2的有序樹(tree) 。

簡單的理解,就是一種類似於我們生活中樹的結構,只不過每個結點上都最多只能有兩個子結點。

二叉樹是每個節點最多有兩個子樹的樹結構。頂上的叫根結點,兩邊被稱作「左子樹」和「右子樹」。

紅黑樹本身就是一顆二叉查詢樹,將節點插入後,該樹仍然

是一顆二叉查詢樹。也就意味著,樹的鍵值仍然是有序的。

紅黑樹的約束:

1. 節點可以是紅色的或者黑色的

2. 根節點是黑色的

3. 葉子節點(特指空節點)是黑色的

4. 每個紅色節點的子節點都是黑色的

5. 任何乙個節點到其每乙個葉子節點的所有路徑上黑色節點數相同

紅黑樹的特點:

速度特別快,趨近平衡樹,查詢葉子元素最少和最多次數不多於二倍

**模式:見「反射機制和**模式」一篇

單例模式:

1、餓漢式:

2、靜態內部類

介面卡模式:主要有兩種,類介面卡和物件介面卡

使用場景:通過增加乙個新的介面卡類來解決介面不相容的問題,使得原本沒有任何關係的類可以協同工作。將乙個類的介面變換成客戶端所期待的另一種介面,從而使原本因介面不匹配而無法在一起工作的兩個類能夠在一起工作。修改乙個已經投產中的介面時,介面卡模式可能是最適合你的模式。

(1)類介面卡主要是使用繼承的方式連線兩個介面。

類介面卡主要是使用繼承的方式連線兩個介面。我們假設對接介面a和介面b。

先寫介面b

public inte***ce mp4
介面b的實現類

public class expensivemp4 implement mp4

}

介面a

public inte***ce player
假如你的工程中有這幾個類,然後你發現,action()方法中要寫的操作,就是expensivemp4的play()中的操作「//todo」,所以你沒必要重複再寫一次,想個辦法讓他們適配。所以,你想讓外部呼叫player的時候去呼叫expensivemp4的play,如果用類介面卡的話可以這樣寫

public class expensiveadapter extends expensivemp4 implement player

}

(2)物件介面卡用的是「組合」的方式

這時候我們使用物件介面卡的話可以這樣寫。

public class playeradapter implement player     

public void action()}}

(三)演算法排序演算法:

(1)、插入排序:直接插入排序、二分法插入排序、希爾排序。

(2)、選擇排序:簡單選擇排序、堆排序。

(3)、交換排序:氣泡排序、快速排序。

(4)、歸併排序

(5)、線性時間排序:計數排序、基數排序、桶排序

直接插入排序

使用場景:適合少量資料的排序,或者資料基本已經有序的情況

public static int insertionsort(int array)

array[preindex + 1] = current;

}return array;

}二分插入排序(折半插入)

特徵分析: 折半插入排序僅減少了關鍵字間的比較次數,而記錄的移動次數不變。

使用場景: 如果元素的比較的操作比較耗時,可以對直接插入排序的效能進行提公升。

public static void binaryinsertsort(int arr)

arr[p]=temp;}}

希爾排序:希爾排序是基於插入排序的一種演算法, 在此演算法基礎之上增加了乙個新的特性,提高了效率。

public static void shellsort(int arr)

arr[p]=temp;

}gap/=2;}}

選擇排序:

簡單選擇排序:它的工作原理是每一次從待排序的資料元素中選出最小(或最大)的乙個元素,存放在序列的起始位置,直到全部待排序的資料元素排完。

public static int selectionsort(int array)

int temp = array[minindex];

array[minindex] = array[i];

array[i] = temp;

}return array;

}特徵分析:

1、空間複雜度o(1),最好/最壞/平均時間複雜度都是o(n^2),比較次數o(n^2),移動次數o(n)。

2、選擇排序是不穩定的排序方法(比如序列[5, 5, 3]第一次就將第乙個[5]與[3]交換,導致第乙個5挪動到第二個5後面)。

氣泡排序

基本思想:

比較相鄰的元素,如果前者比後者大,就交換他們兩個,對從前往後對每一對相鄰元素作同樣的工作,這樣一趟冒泡後,最後的元素就是最大的數。這樣每一趟冒泡確定乙個元素的位置,n趟後陣列即有序。同樣也可以從後往前冒泡,依次確定最小值。

public static int bubblesort(int array)

return array;

}特徵分析:

1、空間複雜度o(1),最好時間複雜度o(n),最壞時間複雜度o(n^2),平均時間複雜度o(n^2)。

2、氣泡排序時穩定的。

歸併排序

基本思想:

歸併排序(merge-sort)是建立在歸併操作上的一種有效的排序演算法,該演算法是採用分治法(divide and conquer)的乙個非常典型的應用。將已有序的子串行合併,得到完全有序的序列;即先使每個子串行有序,再使子串行段間有序。若將兩個有序表合併成乙個有序表,稱為二路歸併。

public static int mergesort(int array)

public static int merge(int left, int right)

return result;

}特徵分析:

1、空間複雜度o(n),時間複雜度o(1)。

2、歸併排序是穩定的排序。

演算法(資料結構)

空間不夠儲存 給40億個不重複的unsigned int的整數,沒排過序的,然後再給乙個數,如何快速判斷這個數是否在那40億個數當中 40億個數空間儲存的問題 利用對映 分析 unsigned 範圍是2 32 40億大約大約4g個數不到,常規方法肯定是不行的 我們你可以利用 伴隨陣列 那種思想利用記...

演算法 資料結構

演算法是程式的核心,演算法的好壞直接決定了程式的好壞 基礎的幾種演算法 二分查詢 氣泡排序 插入排序 選擇排序 快速排序 二分查詢 假設資料是按公升序排序的,對於給定值x,從序列的中間位置開始比較,如果當前位置值等於x,則查詢成功 若x小於當前位置值,則在數列的前半段中查詢 若x大於當前位置值則在數...

查詢演算法 資料結構

查詢演算法總體分為靜態查詢,和動態查詢,其中靜態查詢法,不改變查詢表結構,動態查詢表,可以進行插入和刪除操作。一 查詢的基本概念 查詢,也可稱檢索,是在大量的資料元素中找到某個特定的資料元素而進行的工作。查詢是一種操作。二 順序查詢 針對無序序列的一種最簡單的查詢方式。時間複雜度為o n 三 折半查...