日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

算法导论之数据结构

發布時間:2025/4/16 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 算法导论之数据结构 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

數據結構

集合,是數學也是計算機科學的基礎,在表示和操縱有窮、動態集合上,動態集合中每個元素由對象來表示,并有指向對象的指針。對動態集合的操作分為兩類:查詢和修改,操作以指針為導航,涉及元素對象內的關鍵字和衛星數據。

數據結構和動態集合的關系,可以這么理解,把集合中的元素根據相互間關系用某種結構組織起來,方便查詢和修改。數據結構是指相互之間存在一種或多種特定關系的數據元素的集合,是計算機存儲和數據組織的方式,是邏輯上的。

1.1基礎數據結構

指針,在編程世界中,扮演著一個很重要的角色。指針,是一個變量,指向存儲地址,指向存儲的值。通過指針來表示動態集合的數據結構,包括棧、隊列、鏈表及樹。

棧的后進先出和隊列的先進先出并未太多可著筆之處,日常應用時,較多關注所分配空間的管理,避免溢出。數組是用下標來表示線性,而鏈表則是用對象中的指針。鏈表有單、雙、環形等特性,主要是根據指針的指向來定義。

在不提供指針和對象數據類型的語言中,可以通過二維數組來表示鏈表,隊列和棧也是一樣。一般一維用來存儲位置,下標,另一維刻畫前后指針和關鍵字值(也可包括衛星數據)。

對于樹,二叉樹和k節點樹,都可分別用指針和數組來表示。

1.2散列表

散列表是集合域之間,通過散列函數構造映射的一種數據結構??梢园哑胀〝到M理解為一個全域映射的散列表,存儲空間允許下,可直接尋址。但一般情況下,全域映射所分配的存儲空間是浪費,于是構造散列表,將關鍵字域映射到散列表的槽中。散列映射,最大的問題是碰撞,就是兩個關鍵字通過散列函數獲得了相同的散列值,從而歸到同一個槽位。

解決碰撞,除了構造優秀散列函數,還可通過鏈接法來解決。所謂鏈接法,就是把散列到同一槽位的所有元素按照鏈表串聯起來,即每一個槽位存儲不是單個對象,而是一個鏈表。對于待鏈接的散列表,其

對于構造散列函數,提出好的散列函數特點:應近似地滿足簡單一致散列的原則,即n個關鍵字中每個關鍵字等可能地散列到m個槽位的任何一個中,且與其他關鍵字已被散列的槽位無關。一般很難滿足這個原則,因為一般關鍵字的分布未知,且不可能完全相互獨立。

構造散列函數一般有關鍵字映射為自然數、除法散列法(質數)、乘法散列法(字長位數)、全域散列等。全域散列是提供有限的一組散列函數,將給定的關鍵字域n個元素映射到m個槽中,這個函數組就是全域的,而全域散列就是可以隨機從這組函數中選擇散列函數,獨立于存儲的關鍵字。假設k和l是關鍵字域中的元素,且不相同,使h(k)=h(l)出現的散列函數,即k和l發生碰撞的概率小于1/m。文中提出利用質數和模來構造全域散列函數類。

解決映射碰撞,除了鏈接法還有開放尋址法。所謂開放尋址法,就是不設定映射域大小,而是根據關鍵字動態增長,把所有元素都放在散列表中。當要插入一個元素時,連續地探查散列表中的各項,直到找到一個空槽來存放,當然如果槽位已滿,則擴展。開放尋址法,插入、刪除、查找元素都要處理空槽,即槽位中沒有包含動態集合中元素的可能。開放尋址法通過線性探查、二次探查、雙重探查來檢查散列表,尋找操作所需的項。線性探查就是定位到散列表中某個具體項,然后循環一圈;二次探查是在此基礎上增加偏移量;這兩者性能取決于初始探查位置和偏移量的選擇,會導致群集現象出現。群集現象是指隨著時間的推移,連續被占用的槽不斷增加,平均查找時間也隨著不斷增加。雙重探查則對初始探查位置和偏移量都設立函數(自變量都為關鍵字),使之可變,具有隨機產生探查序列的性質。

文中對散列的描述,從散列表定義,到構造散列函數的方法,接著引入解決碰撞沖突的鏈表法和開放尋址法,并對相關操作進行性能分析。對于如何構造好的散列函數,以及如何解決沖突是散列表的關鍵。在解決沖突上,對于固定、靜態的關鍵字集合,可以采用完全散列。完全散列是將第一次散列映射出現沖突的關鍵字,再進行二次散列,確保不出現碰撞。顯然,很關鍵就是兩次散列函數的選擇。

對于散列,發現CSDN博客有一篇博文介紹的比較全面,還有代碼驗證性能,很有參考價值。

http://blog.csdn.net/jn1158359135/article/details/7205688

1.3二叉樹

二叉樹在數據組織上來說,有一種技術的藝術美,在樹形視圖結構中運算。導論中,二叉樹介紹了二叉查找樹、紅黑樹以及B樹。

1)二叉查找樹

二叉查找樹,二叉樹結構,可用鏈表結構表示,每個節點存儲一個對象。結點中除了數據域(含key和衛星數據),還包括左域left、右域right、父域parent,分別指向結點在樹中的左子、右子及父結點。

二叉查找樹按照數據域中關鍵字的順序來存儲,滿足以下性質:

設x為二叉查找樹種的一個結點,如y為x的左子樹中的一個節點,則key[y]<=key[x],如y是為x的右子樹中的一個節點,則key[y]>=key[x]。即結點左樹小于結點,右樹大于結點。

二叉查找樹的查詢就圍繞這個性質進行,查找指定值、最小、最大、前趨、后續,在一個高度為h的二叉查找樹種進行查詢,運行時間為O(h)。

二叉查找樹的插入和刪除,都是在二叉樹中結點發生變化,需要保持二叉查找樹右大于左的性質。插入和刪除的動態集合操作運行時間也為O(h)。

導論中介紹了隨機構造二叉查找樹,并通過隨機變量概率分析證明其期望高度為O(lgn),其中n為結點數。理解隨機構造二叉查找樹,主要是要理解輸入的關鍵字隊列中任何一個關鍵字都等可能成為根節點,而不同的根節點,在保持二叉查找樹性質下,將構造出不同的高度的樹,且這個數的期望高度是O(lgn)。隨機構造,也就是從關鍵字中等可能選擇一個節點開始構造。

2)紅黑樹

紅黑樹也是一棵二叉查找樹,只是在每個節點上增加一個存儲域表示節點的顏色。構造紅黑樹的目的是克服二叉查找樹在樹高度較高時性能不佳而變形,通過對任何一條從根到葉子的路徑上各個結點著色方式的限制,確保沒有一條路徑比其他路徑長出兩倍,使其接近平衡。

紅黑樹每個節點包括五個域:數據域key、左域left、右域right、父域parent、顏色域color,這個顏色域就是比二叉查找樹多處的域,那么可稱之為紅黑樹需滿足怎樣的性質呢?

一顆二叉查找樹滿足:每個節點或紅或黑;根節點和葉子節點為黑色;如結點為紅色,則其左右兒子都是黑色;對每個結點,從該結點到其子孫結點的所有路徑上包含相同數目的黑結點。這些性質保持了二叉樹的平衡性質,使在構造二叉查找樹時,避免出現樹高度最壞情況。

紅黑樹是在二叉查找樹基礎上擴展的數據結構,在進行動態集合操作時,在保持二叉查找樹的基礎上,還要保持自己的紅黑性質。而要保持紅黑樹性質,最重要的算法就是旋轉。

旋轉是保持樹高度平衡的重要算法,以左旋來說,主要是將父節點調整到左節點,而將右節點調整為父節點,相應將右節點的左子樹調整到原父節點的右子樹,這樣一來降低樹的高度。

紅黑樹的插入是在二叉查找樹插入基礎上,對新增節點著紅色。著紅色后可能會改變紅黑樹性質中結點為紅色左右結點要是黑色的性質,即一個紅結點不能有紅色子女,于是需要調整著色并旋轉保持樹高度平衡。紅黑樹的刪除,如果是刪除紅色結點則不影響紅黑樹性質,但刪除黑色節點,則要調整著色并旋轉。

具體算法也很有意思,鍛煉程序每個步驟的邏輯,可以具體代碼實現下。

紅黑樹是二叉查找樹數據結構的擴展,這種擴展就是在基礎和標準的數據結構中增加一些信息,用于既定場合。如紅黑樹增加了結點的顏色域;為了動態順序統計,導論中還給出紅黑樹增加size域,統計左右子樹的個數,這樣就可以直接定位到具體結點的位置;為了支持區間數據維護,在紅黑樹基礎上,擴展區間域,每個結點的值是一個區間。

在一些實際應用中,對基礎數據結構的改進基本都能滿足,因為基礎數據結構已經是經過實踐累積出來的具有模型意義,具有很強的適應性。當然必要還是可以創新數據結構來滿足。這個章節主要是描述,因為原來都有代碼實現過具體算法,所以算法及分析沒有進一步描述和理解。

總結

以上是生活随笔為你收集整理的算法导论之数据结构的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。