當前位置:首頁 » 操作系統 » 數據結構演算法實現

數據結構演算法實現

發布時間: 2024-08-27 20:53:19

『壹』 圖解:數據結構與演算法之字典樹

字典樹(Trie樹)這一數據結構是不太常見但是十分好用<typo id="typo-32" data-origin="而" ignoretag="true">而</typo>一種數據結構,博主也就是最近一段時間做了幾道位元組的題目才了解到字典樹這一數據結構。並將自己的學習內容跟大家分享。

首先,何為字典樹(Trie樹)?顧名思義,就是在查詢目標時,像字典一樣按照一定排列順序標准和步驟訪問樹的節點,舉一個簡單例子,英文字典查單詞"He",那麼第一步你肯定要按照a-z的順序先找到h這個首字母,然後再按照相同順序找到e。博主所要介紹的字典樹就是類似字典這樣的結構。

上述查找單詞的過程就是不斷查找與所查單詞相同前綴的字元串,直至查找到所查單詞的最後一個字母。因此,字典樹又稱為前綴樹(prefix Tree)。

以hell、hi、new、nop為例建立一個字典樹,構造如下

根據上文所述可以得到字典樹的結構性質

根據以上三點來構造字典樹。

字典樹的構造其實較為簡單,和一般樹的構造沒有太大區別。接下來將對字典樹的插入、刪除、查詢操作進行分析與講解。

在沒有字典樹的時候,我們需要先構建出字典樹。

以插入hell為例:

再插入單詞hit,過程如下,檢查=>存在則訪問/不存在則建立新節點再訪問=>直到要插入的單詞到達最後一個字元。

字典樹的插入操作比較簡單,不需要考慮太多排序問題。

正如上文所說,按照一定的標准進行查詢目標字元串,每個節點都儲存一個字元,根節點到達子節點路徑組成的字元串即為該節點所對應的字元串,那麼查詢目標字元串時按照從根節點一步一步訪問相應字元所在的節點,其實也就是匹配字元串前綴的過程。

如下圖,在字典樹中,查詢"hell",

[圖片上傳失敗...(image-f028c4-1611057619223)]

如果在該字典中查詢no

刪除操作相對於插入與查詢復雜一點,但是也很簡單,刪除的前提是單詞已經存在於字典樹。

刪除字典樹節點的操作需要考慮目標字元串最後一個字元是否是樹中的葉子節點。

因為一個單詞可能是另一個單詞的前綴部分,如果不是葉子節點,我們只需要把該單詞的單詞標志位清空即可,無需刪除整個「樹枝」。

比如,想要刪除"no"這個單詞

比如,想要刪除"hell"這個單詞,與第一種刪除相同,只不過是從最後一個節點,'l'節點是葉子節點,開始往上進行節點刪除操作。

比如,想要刪除"hi",那麼與前兩種其實一致,訪問到葉子節點'i',刪除葉子節點,並向上訪問,訪問到'h',由於刪除'i'以後,'h'依然不是葉子節點,因此不再繼續刪除節點。

比如,想要刪除"nop",與前幾種類似,先訪問到葉子節點'p'刪除,然後上移發現'o'是葉子節點,然而'o'有單詞標記位,所以,這里不再繼續刪除。

有上面幾種刪除操作,我們得到了刪除的標准:

了解了這么多字典樹的各種操作,相信你對字典樹的用途有個大概了解了,字典樹最大作用是用於==字元串的各種匹配==,前綴匹配(模糊搜索),字元串查找(字典)等等。

博主只打出了「涓涓清泉」四個關鍵字,其搜索列表返回了諸多以涓涓清泉為首的選項

顧名思義,就是一個單純的字典而已,不多舉例。

字典樹的構建,通過利用空間換時間的思想以及字元串的公共前綴減少無效的字元串比較操作從而使得插入和查找字元串變得高效.其插入或者查找的時間復雜度為O(n),n為字元串長度。

當然,字典樹有著它的弊端,當所插入的單詞沒有很多公共前綴時,字典樹的構建變得十分復雜和低效。

字典樹的難度不是很大,但卻是一種十分有用的數據結構,掌握之後,對於解決一些有關字元串匹配、公共前綴的問題十分有幫助。

當然我們也說了,字典樹有著自己的弊端,由於用空間換時間,如果遇到了一堆公共前綴很少的單詞進行字典樹構造時,空間需求就顯得十分大了。

『貳』 數據結構中有哪些基本演算法

數據結構中最基本的演算法有:查找、排序、快速排序,堆排序,歸並排序,,二分搜索演算法
等等。

1、用的最多也是最簡單的數據結構是線性表。

2、有前途的又難數據結構是圖 。

3、常用的80%演算法是排序和查找。

『叄』 bfs可以使用哪種數據結構實現

BFS(廣度優先搜索)演算法可以使用隊列(Queue)這種數據結構實現。

在BFS過程中,我們將待訪問的節點放入隊列中,並按照廣度優先的順序依次訪問隊列中的節點。每當訪問一個節點時,我們將其所有相鄰節點加入隊列中,並更新它們到起點的距離。這樣,隊列中的節點始終是距離起點最近的節點,從而實現了廣度優先搜索。

另外,在實際實現中,還可以使用鄰接表(Adjacency List)來表示圖中的節點和邊。鄰接表是一種鏈式存儲結構,可以用來存儲圖中每個節點的相鄰節點及其權重。通過鄰接表,我們可以方便地實現BFS和DFS(深度優先搜索)演算法。

BFS演算法的主要應用場景包括:

1、連通性分析:判斷圖中兩個節點之間是否存在連通性,即是否存在一條路徑連接這兩個節點。

2、最小生成樹:Prim演算法和Kruskal演算法的基礎思想與BFS類似,都是通過逐步添加邊來構建一棵包含所有節點的生成樹。

3、最短路徑計算:Dijkstra演算法和Floyd-Warshall演算法也採用了與BFS類似的思想,通過逐步擴展已訪問節點來尋找最短路徑。

BFS演算法的實現過程中,通常使用隊列數據結構來存儲待訪問的節點。此外,還需要使用一個visited數組來記錄已訪問過的節點,以及一個distance數組來記錄每個節點到起點的距離。在實際應用中,還可以使用鄰接表來表示圖中的節點和邊,以方便進行遍歷操作。

以上內容參考網路-寬度優先搜索

『肆』 python數據結構與演算法-哈希map的實現及原理

1-collections.MutableMapping

1.1 概念:這是什麼?

大家可能想知道這一串英文是什麼意思?其實只需要了解在collections庫當中有一個非常重要的抽象基類MutableMappin

g,專門用於實現map的一個非常有價值的工具。後邊我們會用到它。

2-我們的map基類


2.1 實現這個類

這個基類其實也就是確定了鍵值對的屬性,並且存儲了基本的比較方法。它的對象就是一個鍵值對咯。這個很好理解。有點類似object的感覺。

3-通過map基類實現的無序映射

給大家看一個上邊的例子,這個例子來源於網路,自己改了改,能用,更加詳細而已,湊合看.

4-Python哈希表的實現的基類

4.1 咱有話直說:上才(代)藝(碼)

如果還不知道哈希表概念的同xio,請參考 python進階之數據結構與演算法–中級-哈希表(小白piao分享) 。廢話不多說,咱們擼代碼:

OK了,基本的哈希表就實現了,其實仔細想想很容易,但是自己要能實現還是要理解哈希表的本質哦,外加一定量的練習才可以熟練掌握,練習的目的就是為了熟練而已。

5-分離鏈表實現的具體哈希map類

說明:這玩意只是一種降低沖突的手段,上一節提過,降低沖突最好的地方是發生在元組進入桶的時候,所以想必大家猜到了,接下來的分離鏈表也就是為了self._bucket_xxxxxxx系列方法做准備。這里之所以在上邊使用@abstractmethod就是為了繼承實現,目的可以實現多種將沖突的哈希表。分離鏈表的概念上一節也有的。
「見碼入面」(借鑒:見字如面這個電視節目,有興趣可以看看,還不錯的):

6-用線性探測處理沖突的哈希map類

這種方式的好處不需要再去藉助其他額外的賦值結構來表示桶。結構更加簡單。不會再像上一種方法還要讓桶是一個UnsortedTableMap的對象。
代碼如下:

『伍』 一文帶你認識30個重要的數據結構和演算法

數組是最簡單也是最常見的數據結構。它們的特點是可以通過索引(位置)輕松訪問元素。

它們是做什麼用的?

想像一下有一排劇院椅。每把椅子都分配了一個位置(從左到右),因此每個觀眾都會從他將要坐的椅子上分配一個號碼。這是一個數組。將問題擴展到整個劇院(椅子的行和列),您將擁有一個二維數組(矩陣)。

特性

鏈表是線性數據結構,就像數組一樣。鏈表和數組的主要區別在於鏈表的元素不存儲在連續的內存位置。它由節點組成——實體存儲當前元素的值和下一個元素的地址引用。這樣,元素通過指針鏈接。

它們是做什麼用的?

鏈表的一個相關應用是瀏覽器的上一頁和下一頁的實現。雙鏈表是存儲用戶搜索鍵嘩顯示的頁面的完美數據結構。

特性

堆棧是一種抽象數據類型,它形式化了受限訪問集合的概念。該限制遵循 LIFO(後進先出)規則。因此,添加到堆棧中的最後一個元素是您從中刪除的第一個元素。

堆棧可以使用數組或鏈表來實現。

它們是做什麼用的?

現實生活中最常見的例子是在食堂中將盤子疊放在寬枝一起。位於頂部的板首先被移除。放置在最底部的盤子是在堆棧中保留時間最長的盤子。

堆棧最有用的一種情況是您需要獲取給定元素的相反順序。只需將它們全部推入堆棧,然後彈出它們。

另一個有趣的應用是有效括弧問題。給定一串括弧,您可以使用堆棧檢查它們是否匹配。

特性

隊列是受限訪問集合中的另一種數據類型,就像前面討論的堆棧一樣。主要區別在於隊列是按照FIFO(先進先出)模型組織的:隊列中第一個插入的元素是第一個被移除的元素。隊列可以使用固定長度的數組、循環數組或鏈表來實現。

它們是做什麼用的?

這種抽象數據類型 (ADT) 的最佳用途當然是模擬現實生活中的隊列。例如,在呼叫中心應用程序中,隊列用於保存等待從顧問那裡獲得幫助的客戶——這些客戶應該按照他們呼叫的順序獲得幫助。

一種特殊且非常重要的隊列類型是優先順序隊列。元素根據與它們關聯的「優先順序」被引入隊列:具有最高優先順序的元素首先被引入隊列。這個 ADT 在許多圖演算法(Dijkstra 演算法、BFS、Prim 演算法、霍夫曼編碼 )中是必不可少的。它是使用堆實現的。

另一種特殊類型的隊列是deque 隊列(雙關語它的發音是「deck」)。可以從隊列的兩端插入/刪除元素。

特性

Maps (dictionaries)是包含鍵集合和值集合的抽象數據類型。每個鍵都有一個與之關聯的值。

哈希表是一種特殊類型的映射。它使用散列函數生成一個散列碼,放入一個桶或槽數組:鍵被散列,結果散列指示值的存儲位置。

最常見的散列函數(在眾多散列函數中)是模常數函數。例如,如果常量是 6,則鍵 x 的值是x%6。

理想情況下,散列函數會將每個鍵分配給一個唯一的桶,但他們的大多數設計都採用了不完善的函數,這可能會導致具有相同生成值的鍵之間發生沖突。這種碰撞總是以某種方式適應的。

它們是做什麼用的?

Maps 最著名的應用是語言詞典。語言中的每個詞都為其指定了定義。它是使用有序映射實現的(其鍵按字母順序排列)。

通訊錄也是一張Map。每個名字都有一個分配給它的電話號碼。

另一個有用的應用是值的標准化。假設我們要為一天中的每一分鍾(24 小時 = 1440 分鍾)分配一個從 0 到 1439 的索引。哈希函數將為h(x) = x.小時*60+x.分鍾。

特性

術語:

因為maps 是使用自平衡紅黑樹實現的(文章後面會解釋),所以所有操作都在 O(log n) 內完成;所有哈希表操作都是常量。

圖是表示一對兩個集合的非線性數據結構:G={V, E},其中 V 是頂點(節點)的集合,而 E 是邊(箭頭)的集合。節點是由邊互連的值 - 描述兩個節點之間的依賴關系(有時與成本/距離相關聯)的線。

圖有兩種主要類型:有稿巧行向圖和無向圖。在無向圖中,邊(x, y)在兩個方向上都可用:(x, y)和(y, x)。在有向圖中,邊(x, y)稱為箭頭,方向由其名稱中頂點的順序給出:箭頭(x, y)與箭頭(y, x) 不同。

它們是做什麼用的?

特性

圖論是一個廣闊的領域,但我們將重點介紹一些最知名的概念:

一棵樹是一個無向圖,在連通性方面最小(如果我們消除一條邊,圖將不再連接)和在無環方面最大(如果我們添加一條邊,圖將不再是無環的)。所以任何無環連通無向圖都是一棵樹,但為了簡單起見,我們將有根樹稱為樹。

根是一個固定節點,它確定樹中邊的方向,所以這就是一切「開始」的地方。葉子是樹的終端節點——這就是一切「結束」的地方。

一個頂點的孩子是它下面的事件頂點。一個頂點可以有多個子節點。一個頂點的父節點是它上面的事件頂點——它是唯一的。

它們是做什麼用的?

我們在任何需要描繪層次結構的時候都使用樹。我們自己的家譜樹就是一個完美的例子。你最古老的祖先是樹的根。最年輕的一代代表葉子的集合。

樹也可以代表你工作的公司中的上下級關系。這樣您就可以找出誰是您的上級以及您應該管理誰。

特性

二叉樹是一種特殊類型的樹:每個頂點最多可以有兩個子節點。在嚴格二叉樹中,除了葉子之外,每個節點都有兩個孩子。具有 n 層的完整二叉樹具有所有2ⁿ-1 個可能的節點。

二叉搜索樹是一棵二叉樹,其中節點的值屬於一個完全有序的集合——任何任意選擇的節點的值都大於左子樹中的所有值,而小於右子樹中的所有值。

它們是做什麼用的?

BT 的一項重要應用是邏輯表達式的表示和評估。每個表達式都可以分解為變數/常量和運算符。這種表達式書寫方法稱為逆波蘭表示法 (RPN)。這樣,它們就可以形成一個二叉樹,其中內部節點是運算符,葉子是變數/常量——它被稱為抽象語法樹(AST)。

BST 經常使用,因為它們可以快速搜索鍵屬性。AVL 樹、紅黑樹、有序集和映射是使用 BST 實現的。

特性

BST 有三種類型的 DFS 遍歷:

所有這些類型的樹都是自平衡二叉搜索樹。不同之處在於它們以對數時間平衡高度的方式。

AVL 樹在每次插入/刪除後都是自平衡的,因為節點的左子樹和右子樹的高度之間的模塊差異最大為 1。 AVL 以其發明者的名字命名:Adelson-Velsky 和 Landis。

在紅黑樹中,每個節點存儲一個額外的代表顏色的位,用於確保每次插入/刪除操作後的平衡。

在 Splay 樹中,最近訪問的節點可以快速再次訪問,因此任何操作的攤銷時間復雜度仍然是 O(log n)。

它們是做什麼用的?

AVL 似乎是資料庫理論中最好的數據結構。

RBT(紅黑樹) 用於組織可比較的數據片段,例如文本片段或數字。在 Java 8 版本中,HashMap 是使用 RBT 實現的。計算幾何和函數式編程中的數據結構也是用 RBT 構建的。

在 Windows NT 中(在虛擬內存、網路和文件系統代碼中),Splay 樹用於緩存、內存分配器、垃圾收集器、數據壓縮、繩索(替換用於長文本字元串的字元串)。

特性

最小堆是一棵二叉樹,其中每個節點的值都大於或等於其父節點的值:val[par[x]]

熱點內容
安卓機關機如何設置快捷方式 發布:2024-11-25 04:16:02 瀏覽:635
安卓綠聯和倍思哪個品牌好 發布:2024-11-25 03:54:45 瀏覽:889
androidpack 發布:2024-11-25 03:53:17 瀏覽:445
阿里雲sql 發布:2024-11-25 03:53:15 瀏覽:713
伺服器為什麼一段時間就連不上 發布:2024-11-25 03:44:36 瀏覽:768
圖片上下FTP是什麼 發布:2024-11-25 03:43:18 瀏覽:759
微服務無狀態存儲管理 發布:2024-11-25 03:34:43 瀏覽:22
行上傳 發布:2024-11-25 03:33:07 瀏覽:484
催款訪問 發布:2024-11-25 03:33:06 瀏覽:999
dhcp伺服器無法連接ip地址 發布:2024-11-25 03:23:09 瀏覽:949