数据结构——查找算法
1基本概念
1.1查找
查找是在数据元素集合中查找是否存在关键字等于某个特定数据元素的过程。查找也成为检索。
1.2静态查找
只在数据元素集合中查找是否存在某个给定的元素。
1.3动态查找
除包括静态查找的要求外,还包括在查找过程中同时插入数据集合中不存在的元素,或者删除某个已经存在的元素
平均查找长度
平均查找长度(ASL)是衡量查找算法效率的主要标准,是指查找过程中所需要进行比较的平均次数。其数学定义为:
A
S
L
=
∑
i
=
1
n
P
i
C
i
ASL=\sum_{i=1}^n{P_i}{C_i}
ASL=i=1∑nPiCi
P
i
{P_i}
Pi是要查找数据元素的出现概率,通常取
1
n
\frac{1}{n}
n1.
C
i
{C_i}
Ci是查找相应数据元素需要比较的次数。
CSDN-Markdown编辑器-数学公式编写:https://blog.csdn.net/qq_42446456/article/details/82927855
2静态查找
静态查找问题数据元素的存储结构主要是顺序存储结构,即数组。静态查找主要有无序查找、有序查找和索引结构三种情况。
2.1在无序序列中查找
设一个无序序列存储在数组中。
算法思想:从数组一端开始,用给定数据元素和数组中元素逐个进行比较,若找到要查找的元素,则查找成功,否则查找失败。
平均查找长度:
A
S
L
成
功
=
∑
i
=
1
n
P
i
C
i
=
∑
i
=
1
n
1
n
i
=
n
+
1
2
{ASL_{成功}}=\sum_{i=1}^n{P_i}{C_i}=\sum_{i=1}^n{\frac{1}{n}}{i}={\frac{n+1}{2}}
ASL成功=i=1∑nPiCi=i=1∑nn1i=2n+1
A
S
L
失
败
=
∑
i
=
1
n
P
i
C
i
=
∑
i
=
1
n
1
n
n
=
n
{ASL_{失败}}=\sum_{i=1}^n{P_i}{C_i}=\sum_{i=1}^n{\frac{1}{n}}{n}=n
ASL失败=i=1∑nPiCi=i=1∑nn1n=n
2.2在有序序列长查找
设一个有序序列存储在数组中。在一个有序数组中进行查找的算法主要有两种:顺序查找和二分查找。
2.2.1顺序查找
算法思想:与2.1类似,但不需要比较完所有数据即可以判断出所找元素是否在集合中。
平均查找长度:
A
S
L
成
功
=
∑
i
=
1
n
P
i
C
i
=
∑
i
=
1
n
1
n
i
=
n
+
1
2
{ASL_{成功}}=\sum_{i=1}^n{P_i}{C_i}=\sum_{i=1}^n{\frac{1}{n}}{i}={\frac{n+1}{2}}
ASL成功=i=1∑nPiCi=i=1∑nn1i=2n+1
A
S
L
失
败
=
∑
i
=
1
n
P
i
C
i
=
∑
i
=
1
n
1
n
i
=
n
+
1
2
{ASL_{失败}}=\sum_{i=1}^n{P_i}{C_i}=\sum_{i=1}^n{\frac{1}{n}}{i}={\frac{n+1}{2}}
ASL失败=i=1∑nPiCi=i=1∑nn1i=2n+1
2.2.2二分查找/折半查找
算法思想:n个元素存储在数组a中,要查找元素设为target,确定出查找区间的中心下标an/2,与target进行比较,若相等,则查 找成功;若 a[n/2]<target,把查找区间定为后半段a[(n/2)+1]到a[n-1];若 a[n/2]>target,则把查找区间定为前半段a[0]到a[(n/2)-1] 。重复这个过程一直到查找区间的开始下标大于结束下标时为止。
平均查找长度:
A
S
L
成
功
=
∑
i
=
1
n
P
i
C
i
=
log
2
n
{ASL_{成功}}=\sum_{i=1}^n{P_i}{C_i}=\log_2{n}
ASL成功=i=1∑nPiCi=log2n
A
S
L
失
败
=
∑
i
=
1
n
P
i
C
i
=
log
2
n
+
1
{ASL_{失败}}=\sum_{i=1}^n{P_i}{C_i}=\log_2{n+1}
ASL失败=i=1∑nPiCi=log2n+1
显然,对于一个有序 数组的查找,二分法效率最高。
2.3索引
当查找数据量很大时需要用到索引,这部分还没有研究。