平均比较次数(平均查找长度)【ASL】:
A
S
L
=
∑
i
=
0
n
p
i
×
c
i
ASL=\sum_{i=0}^{n}{p_i}\times c_i
ASL=i=0∑npi×ci
n
n
n 表示查找表中记录个数,
p
i
p_i
pi 表示查找第
i
i
i 个记录的概率,
c
i
c_i
ci 表示找到第
i
i
i 个记录所需的比较次数
2. 一般方法
顺序查找法:
A
S
L
1
=
(
n
+
1
)
/
2
ASL_1=(n+1)/2
ASL1=(n+1)/2,
A
S
L
2
=
n
ASL_2=n
ASL2=n 【前者表示查找成功,后者表示查找失败】;
二分查找:
T
=
O
(
l
o
g
2
n
)
T=O(log_2n)
T=O(log2n),
A
S
L
=
l
o
g
2
(
n
+
1
)
−
1
ASL=log_2{(n+1)}-1
ASL=log2(n+1)−1,
A
S
L
m
a
x
=
⌊
l
o
g
2
n
⌋
+
1
ASL_{max}=\lfloor{log_2n}\rfloor+1
ASLmax=⌊log2n⌋+1
int flag;// 查找目标while(low<=high){
mid =(low+high)/2;// 也可使用 mid = low + (high-low)/2, 防止溢出if(A[mid]== flag)return mid;
eles if(A[mid]< flag)
low = mid +1;else
high = mid -1;
B
−
B-
B− 树:B树和B+树的插入、删除图文详解;B树、B+树、B*树 2.1
B
−
B-
B−树中所有结点中孩子节点个数的最大值称为
B
−
B-
B−树的阶,通常用
m
m
m 表示,一般要求
m
≥
3
m \geq 3
m≥3 (查找效率) 2.2 每个结点最多有
m
m
m 个分支,最少分支数由根结点决定,若根结点不是叶子结点,则至少有两个分支,非根非叶结点至少有
⌈
m
/
2
⌉
\lceil{m/2}\rceil
⌈m/2⌉ 个分支, 2.3 有
n
(
k
≤
n
≤
m
)
n(k\leq n \leq m)
n(k≤n≤m) 个分支的结点有
n
−
1
n-1
n−1 个关键字,按递增(减)顺序排列,
k
=
2
k=2
k=2 或
k
=
⌈
m
/
2
⌉
k=\lceil{m/2}\rceil
k=⌈m/2⌉ 2.4 叶结点处于同一层;
B
+
B+
B+树: 3.1
n
n
n 个关键字的结点有
n
n
n 个分支,每个结点中的关键字个数
n
n
n 的范围为:
⌈
m
/
2
⌉
≤
n
≤
m
\lceil m/2 \rceil \leq n \leq m
⌈m/2⌉≤n≤m,根节点的取值范围为:
2
≤
n
≤
m
2\leq n \leq m
2≤n≤m; 3.2 在
B
+
B+
B+树中叶子结点包含信息,并且包含了全部关键字,叶结点引出的指针指向记录,而所有非叶结点仅为索引,不含该关键字对应记录的存储地址; 3.3 在
B
+
B+
B+树上有一个指针指向关键字最小的叶结点,所有叶结点连接成一个线性表;
2. 哈希表
哈希函数、装填因子(
a
=
n
/
m
a=n/m
a=n/m,
n
n
n 表示关键字个数,
m
m
m 表示哈希表表长)
哈希函数构造方法: 2.1 直接定址法:
H
(
k
e
y
)
=
a
⋅
k
e
y
+
b
H(key)=a\cdot key+b
H(key)=a⋅key+b,
a
,
b
a,b
a,b 为常数; 2.2 数学分析法; 2.3 平方取中法; 2.4 除留余数法:
H
(
k
e
y
)
=
k
e
y
m
o
d
p
(
p
≤
m
)
H(key)=key mod p (p\leq m)
H(key)=keymodp(p≤m),
p
p
p 一般取小于等于表长的最大素数;