哈希表/遞歸/一些思考

哈希表

哈希表就是將 數組值與索引建立關係, 而不考慮待查找值與序列值一個個比較這種方式。 不比較,直接對應。

怎麼對應: 哈希算法(哈希函數)-- 典例- 取餘法,
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
什麼叫基本存儲結構:
數組即一塊連續的內存存儲空間, 在此之上引入了索引這個邏輯來定位數組元素,所以底層使用數組的數據結構, 邏輯都是建立在數組索引這個邏輯結構上的(索引間存在邏輯關係) 一塊連續的內存存儲空間 + 索引 = 數組, 其實基本存儲結構就是一塊連續的內存存儲空間

鏈表就是不連續的幾塊內存存儲空間, 在此之上引入指針這個邏輯來把 不連續的內存連接起來 然後約定俗成將: 不連續的幾塊內存存儲空間+ 指針 = 鏈表

數組的存儲結構是一塊連續的內存存儲空間, 邏輯結構是連續的索引 ,
鏈表的存儲結構是幾塊不連續的內存存儲空間, 邏輯結構是指針
廣義上的數組和鏈表,已經加了一層邏輯了。 本質上的數組和鏈表,就是內存條上的連續或不連續塊 連續的索引,本身就是一種邏輯了, 數組索引只是表達地址的一種方法, 大可以把數組寫成 a[0],a[3],a[7]

存儲結構解決的是存到哪裏的問題, 任何邏輯結構都可以用兩種基本存儲結構來存儲
邏輯結構解決的是 元素之間有怎麼的關係的問題(通過一個元素,怎麼找到其他元素)
在這裏插入圖片描述

哈希表就是建立在本質數組上的不同邏輯, 描述的是元素的地址與元素的值之間的關係
而不是其他數據結構,描述的是 各個元素間地址的關係

任何數據結構與算法,都有兩個個基本對象
元素內容,元素地址,

不同元素內容之間的邏輯,不同元素地址之間的邏輯(即索引之前的關係),同一個元素自身內容與地址之間的邏輯(哈希函數)

不同元素內容之間的邏輯:
1.搜索二叉樹就對元素內容間的邏輯有規定,一定要大中下這麼排。 元素內容關係決定了 元素地址之間的關係(比較元素大小,從而確定元素存儲到哪裏)
2.排序算法解決的也是內容間的邏輯, 要求內容從小到大, 元素的內容關係決定了元素地址之間的邏輯

不同元素地址之間的邏輯(索引之間的邏輯):

總結: 對象(4)-關係(3)-邏輯(3)-內存(2)
最基本的就是 一塊連續內存條 和幾塊不連續內存條
在此之上建立四個對象(元素A的內容,元素A的地址,元素B的內容,元素B的地址),存在三個關係(數據的內容,數據的地址),
然後建立三種邏輯來描述四個對象之間的關係

所以問一個數據結構
1.根據需求,確定是哪兩個對象間的關係 (排序,描述的就是元素A內容與元素B內容間的關係) – 內容關係
2.根據需求,確定是哪種邏輯: 內容的排序邏輯
3.根據元素A內容與元素B內容之間的邏輯,確定元素A地址與元素B地址之間的邏輯(用什麼樣的地址去實現這種內容邏輯?)
4.存在連續內存條上 還是 不連續內存條上?

需求: 查詢
1.對象確定關係:元素A內容與元素A地址間的關係
2.邏輯描述關係: 哈希函數 (元素A的內容與元素A的地址之間的邏輯)
3.存儲在連續內存條上(由處理衝突的方式決定)
在這裏插入圖片描述
初始化申請空間即聲明底層存儲結構: 連續的一塊內存空間
在這裏插入圖片描述

遞歸

遞歸和循環的共同點:都是 EIP 在同一段代碼段內反覆。
兩者在模型,重複代碼段之間的層次結構,和流程控制方面的差異:
遞歸是自相似的,兩次重複代碼段之間,是有結構,層次上的“父子”關係的。
循環,是在同一個層次之內的
遞歸可以回到數據中點,再向反方向推進

兩者在流程控制上有差別: 放到彙編層次,兩者的不同就顯示出來了
遞歸通過 ret 可以回到重複代碼段的中間位置(由 stack 負責記憶),這個跳轉,就是遞歸相對於循環比較特殊的地方,也導致,遞歸改成循環的困難點。

必須有序,我們很難保證我們的數組都是有序的。當然可以在構建數組的時候進行排序,可是又落到了第二個瓶頸上:它必須是數組。
數組讀取效率是O(1),可是它的插入和刪除某個元素的效率卻是O(n)。因而導致構建有序數組變成低效的事情。 所以引入二分查找樹的概念來解決這些問題

二分查找法是遞歸定義的,因爲相同代碼片段間,是有父子的層次結構的
所以二分查找法最好用遞歸寫,纔是最符合邏輯的
用循環也可以寫,但深層次的思維模型中是不契合的
以遞歸形式定義,但二分查找是尾遞歸,可改寫爲循環

如果一個函數中所有遞歸形式的調用都出現在函數的末尾,我們稱這個遞歸函數是尾遞歸的。尾遞歸函數的特點是在迴歸過程中不用做任何操作。 尾遞歸都可以改寫爲循環。
https://www.zhihu.com/question/20418254

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