顺序查找和折半查找的ASL(average search length)计算方法

ASL(关键字的平均比较次数)=∑Pi*Ci(i....n)

n:记录的个数,Pi:查找第i个记录的概率(通常认为pi=1/n),ci:找到第i个记录所需要的比较次数。

顺序查找

例:

int Search_Seq( SSTable  ST , KeyType  key )

{    //若成功返回其位置信息,否则返回0  

ST.R[0].key =key;    

for( i=ST.length; ST.R[ i ].key!=key;  - - i  );  

//不用for(i=n; i>0; - -i) 或 for(i=1; i<=n; i++)    

 return i;

}

1) 查找成功时的平均查找长度   设表中各记录查找概率相等     ASLs(n)=(1+2+ ... +n)/n =(n+1)/2。

2)查找不成功时的平均查找长度    ASLf =n+1。

对于顺序查找,查找概率相等时,ASL相同。 查找概率不等时,如果从前向后查找,则按查找概率由大到小排列的有序表其ASL要比无序表ASL小。

折半查找:

如图,根据判定树求解,假设每个元素的查找概率相等,则查找成功时的asl=1/11(概率)*(1*1+2*2+4*3+4*4)。第一层的一个数比较成功时所需比较次数一次,第二层的两个数需要两次,依此类推。即查找成功时比较次数:为该结点在判定树上的层次数,不超过树的深度  d = 【 log2 n 】(向下取值)  + 1, 查找不成功的过程就是走了一条从根结点到外部结点的路径d或d-1。

最近在学数据结构,很多地方不会,所以整理一下,当做个笔记,错误的地方请指正。

 

 

 

 

 

### 二分查找成功时的长度计算 对于二分查找,在最理想的情况下,即每次都能准确命中目标值,则仅需一次比较即可完成查找过程。然而通常情况下,查找过程中会经历多次迭代直到找到目标元素或确认其不存在。 当讨论二分查找成功的平均查找长度(ASL, Average Search Length)时,可以基于树的高度来理解这个问题。由于二分查找本质上是在一棵完全平衡的二叉搜索树上执行的操作,因此: - 对于含有 \( n \) 个节点的数据集而言,最大可能的比较次数等于该数据集中元素构成的理想化满二叉树高度加一。 \[ ASL_{\text{best}} = O(\log_2(n)) \] 这意味着随着输入规模的增长,所需的平均比较次数将以对数级别增长而非线性级别[^1]。 具体到每一次成功的查找路径长度取决于待查元素的位置及其分布情况。如果假设所有位置被访问的概率相等,则可以通过下面的方式估算平均查找长度: 设有一个由 \( n=2^h−1 \) 个不同关键字组成的有序序列,其中 h 表示这棵假想出来的满二叉树的高度。那么在这个范围内任意选取一个键作为查询对象时所经过的关键字比较总次数 T 可表示为: \[T=\sum^{n}_{i=0}p_iC_i\] 这里 pi 是第 i 项被选作目标的可能性;Ci 则代表实际发生比较操作的数量。考虑到均匀分布条件下每种情形发生的几率相同 (pi=1/n),则上述表达式简化成: \[T≈(1+\frac{\log_2{n}}{n})×n=\log_2{(n)}+O(1)\] 所以,对于给定大小为 n 的数组来说,即使在最佳状态下,二分查找的成功查找长度大约是对数级别的函数关系 log₂(n)+常量因子。 ```python import math def calculate_average_search_length(n): """Calculate the average search length of binary search on a sorted array with 'n' elements.""" return math.log2(n) + 1 # Adding one because index starts from zero but we count steps starting at one. # Example usage: print(f"The estimated average successful search length for an array size {8}: ", round(calculate_average_search_length(8), 2)) ```
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值