程式設計珠璣 資料結構 基本操作 查詢 排序

2022-05-28 00:48:13 字數 2387 閱讀 4252

前言

《程式設計珠璣》確實是一本好書,它裡面對演算法和資料結構的解讀,對問題的分析可以很好幫助程式設計人員轉變以往對資料結構和演算法的態度發生改變,轉向重視;通常會把本書內容總結為:

問題定義;

演算法設計;

資料結構選擇;

1、資料結構:

有一些題目很明顯,例如存**號碼的磁碟檔案排序,只給1m記憶體,只能用歸併排序,演算法的確定的,這個時候,資料結構的選擇,就決定了演算法執行的時間和空間順序,假設**號碼7位,那麼如何表示這7位呢?

方法:1、編碼方式:用 4 byte,32位整數代表乙個號碼;或者,13 byte,乙個 byte 乙個號碼

2、位圖方式:用座標代表乙個數字,第一位為1,第二位為2,那麼7位共需要多少bit呢?少於1000萬位,也就是1000萬 bit = 12500 byte = 12.5kb 

可見,第二種方式可以用位圖排序法:這樣演算法的效率會得到質的提公升。但方法2並非適用所有,它要求,第一,數字不重複,第二,範圍較少,如果13位整數,那麼就是10000000000000bit,2500gb,這樣點陣圖就划不來了。

另外,第二種還可以拓展一下,用2bit代表乙個數字,那麼0代表不存在,非0代表存在且還可以代表存在的個數。

2、基本操作:

旋轉乙個向量 ,如abcdefg,旋轉位defgabc,該問題有多種解法,但不同的解法對效率的影響很大,很多問題場景僅僅都是有限的記憶體空間和時間下解決的。

方法:1、如果從i點旋轉,那麼先用臨時空間存0~i的元素,然後i之後的元素全部向前移動i位,再把臨時陣列複製到最後i位;

2、如果沒有臨時空間,那麼可以用方法1,一位一位的旋轉,旋轉i次;

3、可以用求逆的演算法,例如ab,可以計算a'b',再對整個求逆(a'b')',得到ba;

每一種演算法對應乙個基本操作,如果基本操作得當,那麼靈機一動後,方法3對時間,空間的效果都是最高的。

3、查詢:

查詢,查詢之中,最重要的概念是二分查詢,很多資料結構其實都應用了二分查詢的理念,例如跳表、紅黑樹、b+樹

應用:資料庫

乙個應用問題要選對資料結構是最重要的事情,我們知道很多時候,程式設計師需要在時間和空間上面做取捨,選對結構後是時間和空間的開銷兼得的重要方式之一;

為什麼是b+樹?經常會有人對資料庫的資料結構提這個疑問,其實答案就是因為b+樹能滿足以下三點,而這三點正好是sql語句的常用操作:

可以快速根據id定位到某個元素;

支援快速查詢某個元素所在的某個範圍之中的所有元素;

可以支援快速查詢到某個元素值前或者後的n個元素;

所以問題定義好之後,我們就開始找對應的資料結構了,第一點,我們想到hash,但明顯,hash不支援2和3,所以我們需要妥協,選擇二分查詢,而二分查詢可選的資料結構:平衡二叉樹、跳表、紅黑樹、b+樹;

第三點,很自然的就是想到雙向鍊錶,但鍊錶不滿足第二點;這個時候,跳表這種資料結構就比較合適了:

【**網路】

然後對跳表加以改進一下,便有了b+樹,看下圖,為什麼乙個節點需要多個元素呢?其實原因就是因為磁碟和記憶體速度的差距,所以最好是一次性從磁碟載入的資料剛好是乙個節點,所以節點便存元素最好了,而這個值的大小,就是快取頁的大小16k;

【**網路】

其實還有乙個值得注意的,mongodb用的資料結構就不是b+樹;而是b-樹,其實很好理解,文件資料庫的查詢需求通常不一樣,他們只需找到值就可以了,很少做範圍查詢;

應用:9宮格鍵盤

這個例子大多數90後都熟悉,那一代的程式設計師估計很多人都遇到這種需求;下圖是乙個9宮格鍵盤,其中如果資料某個詞,只能按0、1、2、3、4、5、6、7、8、9這十個鍵盤,例如fan和dan這兩個英文或者拼音,都是按相同的鍵盤數字,這意味著,所有的單詞中,他們都有自己的相同按鍵的小夥伴,需求:如何根據使用者的按鍵輸入,快速在上億個記錄中查詢到單詞名稱為fan的記錄呢?

這道題,用到的有兩種,第一是排序,第二是查詢,排序自然是把上億個記錄排序,查詢,是用到二分查詢;問題的重點是,按照什麼排序?

標識:這個詞在程式設計珠璣第一件見,作為把具有相同按鍵的稱之為同位詞,而同位詞的正序序列是唯一的,所以這這個序列就是同位詞的表示;給上億個記錄都貼上標示後,我們就可以按照標識再進行一次排序,於是,乙個有序的記錄就出現了,假設我們用的是歸併排序。後面的查詢就不多說了。這個問題,到此,迎刃而解。

資料結構基本查詢演算法

查詢表的概念 由同一型別的資料元素 或者記錄 構成的集合。由於集合中的資料元素之間存在完全鬆散耦合的關係,因此,查詢表是一種非常靈便的資料結構。查詢表的操作 a 查詢某個 特定的 資料元素是否在查詢表中 b 檢索某個 特定的 資料元素的各種屬性 c 在查詢表中插入乙個資料元素 d 從查詢表中刪去某個...

資料結構樹基本操作

本章內容 樹的結構定義 遞迴的三種遍歷 非遞迴的三種遍歷 層次遍歷 求深度 求特定結點以及測試的主函式。include include define maxsize 50 二叉樹的鏈式儲存 typedef struct btnode btnode,tree 訪問改結點數值 void visit tr...

資料結構 嚴蔚敏版 查詢基本操作

順序查詢過程 從表中的最後乙個記錄開始,逐個進行記錄的關鍵字與給定值進行比較,若某個記錄的關鍵字與給定值相等,則查詢成功,找到所查的記錄 反之,若直到第乙個記錄,其關鍵字和給定值比較都不相等,則表明表中沒有所查的記錄,查詢失敗。演算法描述為 int search int d,int a,int n ...