1. 程式人生 > >查詢——平均查詢長度

查詢——平均查詢長度

查詢有以下查詢方式:

  • 順序表查詢
  • 二分查詢
  • 索引表查詢
  • 二叉排序樹查詢
  • 雜湊表查詢

接下來整理一下上面每個方式的平均查詢長度

順序表查詢ASL

如果每個關鍵字查詢概率相同,則ASL = (n+1)/2
一般都是概率相同。

二分查詢ASL

舉例說明:

這是一個有序序列(下標和關鍵字相同):
0   1   2   3   4  

初始化:low = 0, high = 4

第一次:
    mid = (0+4)/2 = 2 , 則2為第一次找到的關鍵字。
    所以n2 = 1

第二次:
    如果mid小了,則low = 3, mid = (3+4)/2=3;則3為第二次找到的關鍵字
    如果mid大了,則high = 1, mid = (0+1)/2=0;則0為第二次找到的關鍵字
    所以n0 = n3 = 2

第三次:
    過程不在贅述
    n1 = n4 = 3

所以ASL = (n0+n1+n2+n3+n4)/5 = 11/5

索引表ASL

假設序列分成了n塊,每塊k個元素,那麼ASL = LB + LA
那麼ASL = (1+n)/2 + (1+k)/2

二叉排序樹

根據給定的序列建立好二叉排序樹。
比如序列 20, 12, 42, 31, 18, 14, 28
二叉排序樹如下:

              20
        12          42
          18      31
        14      28 

假設有n個結點,則ASL = 這裡寫圖片描述

這裡的hi是每個結點的深度,比如20的深度為1, 12的深度為2等,所以上面例子的ASL = (1+2+2+3+3+4+4)/7 = 19/7。

雜湊表ASL

1.線性探測法

假設第i個關鍵字的探測次數為Pi

ASL =這裡寫圖片描述

舉例:
已知待雜湊的線性表為(36, 15, 40, 63, 22),雜湊用的一維地址空間為[0..6],假定選用的雜湊函式為H(k) = K mod 7,採用線性探測解決衝突
36 mod 7 = 1
15 mod 7 = 1
40 mod 7 = 5
63 mod 7 = 0
22 mod 7 = 1

所以36的探測次數為0,15的探測次數為1,40的探測次數為0,63的探測次數為0,22的探測次數為2
則ASL = ((0+1) + (1+1) + (0+1) + (0+1) + (2+1)) / 5 = 1.6

2.鏈地址法
還是上面的例子線性表為(36, 15, 40, 63, 22),鏈地址給[0..6]

0 -> 63
1 -> 36 -> 15 -> 22
2 -> NULL
3 -> NULL
4 -> NULL
5 -> 40
6 -> NULL
第一列有3個關鍵字63,36,40; 第二列有1個關鍵字15; 第三列有1個關鍵字22

∴ ASL = (1 * 3 + 2 + 3) / 5 = 1.6