题意:
编程统计,长度为N的有序数组进行二分查找时,查找成功与失败的平均查找长度。注意,表达成总查找长度除以总查找个数的形式。
输入样例:
输入数组的元素个数:一个正整数:
6
输出样例:
在第一行输出查找成功的平均查找长度,在第二行输出查找失败的平均查找长度: (不要求计算,也不进行约分,仅输出成分数形式)
14/6
27/7
题解:首先画出一个具有n个节点的二叉树。
查找成功的平均查找长度为:二叉树每一层的节点数乘以层数,然后累加,最后除以元素个数n。
查找失败的平均查找长度为:把每一个节点的叶子节点补齐,然后计算叶子节点的个数乘以所在的层数,然后累加,最后除以元素个数n加一。
例如:
我是利用二叉树的性质写的:具体性质可参考这篇博客
代码:
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
#include<queue>
#include<algorithm>
using namespace std;
int high(int n)
{
int s=0;
while(n)
{
n=n/2;
s++;
}
return s;
}
int main()
{
int n;
scanf("%d",&n);
int h=high(n);
int i,j,k;
int cg=0;
for(i=1; i<h; i++)
cg+=(i*pow(2,i-1));
int ss=0;
for(i=pow(2,h-1); i<=n; i++)
ss++;
cg+=(ss*h);
printf("%d/%d\n",cg,n);
int kk=ss*2*(h+1);
int mm=pow(2,h-1)-ss;
kk+=(mm*h);
printf("%d/%d\n",kk,n+1);
return 0;
}