花了一上午的時間來從頭開始學習查詢,來總結下自己所學到的一點點東西。
就是很簡單的陣列的線性查詢,需要從頭開始乙個個去找(即為遍歷)那麼這種查詢方法的平均查詢長度在查詢概率相同的情況下為
a ss
s=1n
∑i=1
n(n−
i+1)
ass_s=\frac\sum_^n(n-i+1)
asss=
n1i
=1∑n
(n−
i+1)
a ss
s=n+
12
ass_s=\frac
asss=
2n+1
關於查詢的乙個小技巧
typedef struct list
list;
int search(list test, int key)
}
對於有序表我們肯定是十分熟悉的了,我們可以採用二分查詢的方式去找,其實就是我們平時用的二分法嘛
typedef struct list
list;
int search(list test,int left, int right, int key)
else if(key==test.elem[mid])
else
}}
那麼折半的平均查詢長度為多少呢?我們可以將整個查詢的過程視為乙個在二叉樹上搜尋的過程,二叉樹的根節點為這個有序陣列的中點.對整個二叉樹進行中序遍歷,可以得到我們原來的有序陣列.假設查詢每乙個節點的概率相同,假設是乙個滿二叉樹,那麼第一層節點有乙個,第二層有兩個…第n層有2(n-1)個,那麼查詢第乙個點的次數為1次,查詢第二層節點的次數為兩次,個數為2…查詢第n層的節點次數為n次,一共有2n-1個.我們假設一共有k個節點,那麼這k個節點所能生成二叉樹的層數至多為
n=log2(k+1).
那麼平均查詢長度就為
a sl
s=1k
∑i=1
ni∗2
i−
1asl_s=\frac\sum_^i*2^
asls=
k1i
=1∑n
i∗2
i−1asl
s=k+
1klo
g2(k
+1)−
1;
asl_s=\fraclog_2(k+1)-1;
asls=
kk+1
log
2(k
+1)−
1;k比較大的時候我們可以近似認為
a sl
s=lo
g2(n
+1)−
1asl
s=lo
g2(n
+1)−
1asl_s=log_2(n+1)-1asl_s=log_2(n+1)-1
asls=
log2
(n+
1)−1
asls
=lo
g2(
n+1)
−1所以線性折半查詢的效率要遠遠高於順序查詢,但它只能適用於順序儲存結構,和有序表.
前面較為簡單的部分就先總結到這裡,之後會更新更後面的章節,感覺都是硬骨頭.
資料結構之一
堆疊 strack 是指這樣一段記憶體,我們它可以理解為乙個筒結構,先放進筒中的資料被後放進筒中的資料 壓住 只有後放進筒中的資料都取出後,先放進去的資料才能被取出,稱為 後進先出 堆疊的長度可隨意增加。堆疊結構可用鍊錶實現。設計乙個鍊錶結構需包含兩個成員 乙個存放資料,乙個為指向下乙個節點的指標。...
資料結構 查詢總結
1.靜態查詢表與動態查詢表的區別 是否需要動態地插入或刪除。2.適合靜態查詢表的查詢方法 順序查詢 折半查詢 雜湊查詢等。適合動態查詢的查詢方法 二叉排序樹的查詢 雜湊查詢等。3.順序查詢缺點 當n較大時,平均查詢長度較大,效率低 優點是對資料元素的儲存沒有要求,順序儲存或鏈式儲存皆可。4.順序查詢...
資料結構 章節除錯模板
最近對資料結構程式不斷進行除錯,卻苦於知識點過於瑣碎,沒有一把合適的神器輔助一下,那麼神器來了,利用下邊模板你可以把每個知識點都放進 具體子類 中去,當你把每章知識都概括進去時,恭喜你,期末考試百分在望。一 這裡我先奉上我這個模板的結構圖 不要用html的眼光來審視,我隨便畫的,日後再學建模語言 簡...