由17个元素构成升序序列,计算在该序列上进行二分查找的查找成功与查找失败的平均查找长度。
时间: 2023-07-19 19:54:32 浏览: 65
在一个有n个元素的升序序列上进行二分查找的平均查找长度(ASL)可以用如下公式计算:
ASL = log2(n+1) - 1
其中n为序列长度。对于本题,n=17,代入公式得到:
ASL = log2(18) - 1 = 3.087
因为这个序列是升序的,所以对于查找成功的情况,平均查找长度就是ASL,即3.087。
对于查找失败的情况,情况比较复杂,需要根据具体情况进行分析。在最坏情况下,即要查找的元素不在序列中,需要查找n+1次才能确定它不在序列中。因此,二分查找的查找失败的平均查找长度为(n+1)/(n+2),代入n=17得到:
(n+1)/(n+2) = 18/19 ≈ 0.947
因此,在这个序列上进行二分查找的查找失败的平均查找长度约为0.947。
相关问题
已知由(60,30,56,78,12,45)序列构成的二叉排序树,怎么计算不成功查找的平均查找长度
计算不成功查找的平均查找长度(ASL)可以使用以下公式:
ASL = [∑(深度 + 1) × 未搜索到的节点数] ÷ 总节点数
首先,需要计算出这个二叉排序树的总节点数,可以通过统计序列中包含的元素个数来得知,即6个。然后,需要统计出不成功查找的节点数,也就是不存在于树中的节点的数量。
这个二叉排序树中的最大值为78,最小值为12。可以从比最小值小的数字、比最大值大的数字、以及位于最小值和最大值之间的数字进行分类,来计算出未搜索到的节点数。
- 比最小值小的数字:11、10、9、8、7、6、5、4、3、2和1,共11个数字。由于这些数字都比最小值小,所以不可能包含在这个二叉排序树中。因此,它们都是未搜索到的节点,计算它们所在的深度+1的总和为(1+2+3+4+5+6+7+8+9+10+11)=66。
- 比最大值大的数字:79、80、81、82、83、84、85、86、87、88、89、90、91、92、93、94、95、96、97、98、99、100,共22个数字。因为这些数字都比最大值大,所以也不可能包含在此二叉排序树中。计算它们所在的深度+1的总和为(1+2+3+4+5+6+7+8+9+10+11+12+13+14+15+16+17+18+19+20+21+22)=253。
- 最小值和最大值之间的数字:12、30、45、56、60、和78。由于它们在此二叉排序树中,无需计算它们所在的深度。
因此,未搜索到的节点数为11+22=33个,平均查找长度为[(66+253)×33] ÷ 6 = 1237 ÷ 6 = 206.17。因此,不成功查找的平均查找长度为206.17。
建立由有序序列进行二分查找产生的判定15时期具有如下功能输出N等于11:00的拍定数冰球成功情况下的平均查找长度A S L
好的,让我解释一下你的问题。你想要一个程序,该程序接受一个有序序列,然后使用二分查找算法查找特定值15,并输出平均查找长度ASL。此外,你还希望输出N等于11:00的拍定数的冰球成功情况。
首先,让我们来看看二分查找算法。该算法使用分治法,将有序序列分成两半,然后比较中间元素与目标元素的大小关系。如果相等,则返回元素的下标;如果目标元素比中间元素小,则在左半部分继续查找;如果目标元素比中间元素大,则在右半部分继续查找。重复这个过程,直到找到目标元素或者确定目标元素不存在。
下面是一个使用二分查找算法查找特定值15的示例代码:
```
int binary_search(int arr[], int left, int right, int target) {
while (left <= right) {
int mid = left + (right - left) / 2;
if (arr[mid] == target) {
return mid;
} else if (arr[mid] < target) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return -1; // 目标元素不存在
}
```
接下来,我们需要计算平均查找长度ASL。ASL是指在查找成功的情况下,查找过程中比较关键字的次数的平均值。ASL可以使用以下公式计算:
```
ASL = (1/N) * (∑(i=1 to N)Ci)
```
其中,N是元素个数,Ci是查找第i个元素时比较的次数。
下面是一个使用二分查找算法计算ASL的示例代码:
```
double binary_search_ASL(int arr[], int n, int target) {
int left = 0, right = n - 1;
int sum = 0, count = 0;
while (left <= right) {
int mid = left + (right - left) / 2;
count++;
if (arr[mid] == target) {
sum += count;
count = 0;
break;
} else if (arr[mid] < target) {
left = mid + 1;
} else {
right = mid - 1;
}
}
if (count != 0) { // 目标元素不存在
return -1;
}
for (int i = 0; i < n; i++) {
count = 0;
left = 0, right = n - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
count++;
if (i == mid) {
break;
} else if (i < mid) {
right = mid - 1;
} else {
left = mid + 1;
}
}
sum += count;
}
return (double)sum / n;
}
```
最后,我们需要输出N等于11:00的拍定数的冰球成功情况。这部分需要根据具体情况来实现,因为你没有提供足够的信息,我无法给出具体的代码实现。
相关推荐
![cpp](https://img-home.csdnimg.cn/images/20210720083646.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)