各个查找平均查找长度
时间: 2024-12-25 19:21:27 浏览: 98
### 各种查找算法的平均查找长度比较
#### 折半查找
对于折半查找,在理想情况下,即数据均匀分布且无重复项时,每次不成功的比较都会将待查找区间减半。因此,如果在一个含有 \(n\) 个节点的理想二叉树中进行查找,则最坏情况下的查找长度为 \(\log_2(n+1)\),而成功查找的平均查找长度可以通过计算所有可能位置的成功概率加权求得[^1]。
#### 顺序查找
在顺序查找过程中,假设每个元素被访问的可能性相同,则第一个元素有\(p_i=1/n\)的机会立即匹配;第二个元素只有当第一个不是目标时才有机会被测试,以此类推。所以,顺序查找的ASL可以表示为\((1 + 2 + ... + n)/n=(n+1)/2\)次比较操作[^2]。
| 查找方法 | 平均查找长度 (ASL) |
| --- | --- |
| 折半查找 | 对于有序表中的任意记录r,设其关键字等于给定值K的概率相等,则成功查找的平均查找长度约为 \(\sum_{i=1}^{n}(pi * ci)=O(log_2n)\)|
| 顺序查找 | 当列表内各元素出现几率一致时,平均需执行大约一半数量级的操作来定位到所需项目,即 \((n+1)/2\)|
为了更直观理解这两种基本查找方式之间的差异:
- 如果处理的是较小规模的数据集(比如几十条记录),两种方法性能差距不大;
- 随着数据量增大至数千甚至更多,由于对数增长特性使得折半查找效率远高于线性的顺序查找。
相关问题
对于有序顺序表(12,18,24,35,47,50,62,83,90,92,95)进行折半查找,试画出描述折 半查找过程的判定树,并计算查找成功和查找不成功的平均查找长度。查找90、47需进行多少次比较可确定成功,查找60需进行多少次比较才能确定不成功,给出各个查找序列。
折半查找(Binary Search)是一种高效的查找算法,适用于有序的顺序表。我们来详细描述一下折半查找的过程,并计算查找成功和不成功的平均查找长度。
### 折半查找过程
给定的有序顺序表为:12,18,24,35,47,50,62,83,90,92,95
折半查找的过程可以通过一棵判定树来表示。以下是折半查找的判定树:
```
50
/ \
24 83
/ \ / \
12 35 62 90
\ / \
18 47 92
\
95
```
### 查找成功和查找不成功的平均查找长度
#### 查找成功的平均查找长度
查找成功的平均查找长度(ASL)可以通过以下公式计算:
\[ ASL_{success} = \frac{1 \times n_1 + 2 \times n_2 + \ldots + k \times n_k}{n} \]
其中,\( n_i \) 是第 \( i \) 层节点的个数,\( n \) 是总的节点个数。
从判定树中可以看到:
- 第一层:1 个节点(50)
- 第二层:2 个节点(24,83)
- 第三层:4 个节点(12,35,62,90)
- 第四层:3 个节点(18,47,92)
- 第五层:1 个节点(95)
总节点数 \( n = 11 \)
\[ ASL_{success} = \frac{1 \times 1 + 2 \times 2 + 3 \times 4 + 4 \times 3 + 5 \times 1}{11} = \frac{1 + 4 + 12 + 12 + 5}{11} = \frac{34}{11} \approx 3.09 \]
#### 查找不成功的平均查找长度
查找不成功的平均查找长度可以通过以下公式计算:
\[ ASL_{failure} = \frac{1 \times m_1 + 2 \times m_2 + \ldots + k \times m_k}{m} \]
其中,\( m_i \) 是第 \( i \) 层失败节点的个数,\( m \) 是总的失败节点个数。
从判定树中可以看到:
- 第一层:1 个失败节点
- 第二层:2 个失败节点
- 第三层:4 个失败节点
- 第四层:3 个失败节点
- 第五层:1 个失败节点
总失败节点数 \( m = 11 \)
\[ ASL_{failure} = \frac{1 \times 1 + 2 \times 2 + 3 \times 4 + 4 \times 3 + 5 \times 1}{11} = \frac{1 + 4 + 12 + 12 + 5}{11} = \frac{34}{11} \approx 3.09 \]
### 查找次数
- 查找 90:比较次数为 3 次(50 -> 83 -> 90)
- 查找 47:比较次数为 4 次(50 - 查找 90 的序列:50 -> 83 -> 90
- 查找 47 的序列:50 -> 24 -> 35 -> 47
- 查找 60 的序列:50 -> 83 -> 62 -> 失败
链地址平均查找长度怎么算
### 链地址法下哈希表的平均查找长度
对于链地址法下的哈希表,在计算查找失败时的平均查找长度(ASL,Average Search Length),主要依赖于各个槽位中链接列表的长度。具体来说:
当哈希表采用链地址法处理冲突时,如果哈希表大小为 \( m \),则存在 \( m \) 个不同的桶或槽来存储数据项。每个键通过哈希函数映射到这 \( m \) 个位置之一,并形成一个单向链表以容纳所有具有相同索引的数据。
假设给定的一组关键字 (19, 14, 23, 1, 68, 20, 84, 27, 55, 11, 10, 79) 使用哈希函数 H(key)=key MOD 13 进行散列,而哈希表长度设定为 15,则可以得出如下结论:由于链地址法不会引起实际意义上的探查序列增长——即每次碰撞仅意味着新节点被附加至相应链尾部而非遍历整个数组寻找下一个可用空间——因此查找未命中情况下的 ASL 主要取决于空闲链的数量以及每条非空链上的结点数目[^1]。
为了更精确地定义这一概念,考虑最坏情况下,即使目标不在哈希表内也需完全扫描某条最长链直至确认不存在该元素为止;而在理想状况下,若查询的是从未插入过任何值的位置,则只需访问一次即可断言其缺失。所以,通常会取两者间的一个加权均值作为最终估计值。
#### 计算过程展示
基于上述理论框架,下面给出具体的数值化分析步骤:
1. **初始化参数**
- 设定哈希表容量 `m` = 15;
- 给定的关键字集合 `{19, 14, 23, 1, 68, 20, 84, 27, 55, 11, 10, 79}` 将依据指定规则分布入不同槽位。
2. **应用哈希算法并统计各槽负载量**
| Key | Hash Index |
| --- | ---------- |
| 19 | 6 |
| 14 | 11 |
| ... | ... |
完成全部关键词分配后可得各槽的实际占用状态图谱,进而得知哪些槽为空(`n_i=0`),哪些含有多个成员构成子链(`n_j>1`)。
3. **确定公式变量**
- 对于任意 i-th 槽而言,设 n[i] 表示其中所含有的节点数量;
- 查找失败情形下的期望比较次数 E(i) 可近似表达为 `(ni + 1)/2` ,这里 "+1" 是因为即便是在空槽上也需要至少尝试读取头指针才能判定无匹配项的存在[^2]。
4. **汇总结果得到全局指标**
\[ ASL_{unsuccessful}=\frac{\sum_{i=0}^{m-1}(n[i]+1)}{m}\]
此公式的含义在于将每一个可能成为候选对象的地方都考察一遍,并累加以获得整体性能度量标准。
```python
def calculate_asl_unsuccessful(n):
"""
Calculate the average unsuccessful search length for a hash table using chaining.
:param n: List of integers representing number of elements in each bucket.
:return: Float value indicating the average unsuccessful search length.
"""
total_comparisons = sum([x + 1 for x in n])
asl_unsuccessful = total_comparisons / len(n)
return asl_unsuccessful
```
阅读全文
相关推荐
















