编程统计,长度为N的有序数组进行二分查找时,查找成功与失败的平均查找长度。注意,表达成总查找长度除以总查找个数的形式。
输入样例:
输入数组的元素个数:一个正整数:
6
输出样例:
在第一行输出查找成功的平均查找长度,在第二行输出查找失败的平均查找长度: (不要求计算,也不进行约分,仅输出成分数形式)
14/6
27/7
如图所示的二叉排序树
查找成功的平均查找长度为:∑(本层高度*本层元素个数)/节点总数=(1*1+2*2+3*3+3*4)/9
查找不成功的平均查找长度:∑(本层高度*本层补上的叶子个数)/补上的叶子总数=(2*1+3*3+4*6)/10
查找成功的平均查找长度为:二叉树每一层的节点数乘以层数,然后累加,最后除以元素个数n。
查找失败的平均查找长度为:把每一个节点的叶子节点补齐,然后计算叶子节点的个数乘以所在的层数,然后累加,最后除以元素个数n加一。
代码实现:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int high=high(n); //二叉树的高度
int allSearch=0; //成功总查找次数
for(int i=1; i<high; i++)
allSearch+=(i*Math.pow(2,i-1));
int lastHeightNodes = n - (int)Math.pow(2,high-1) + 1; //最下面一层的节点数
allSearch+=(lastHeightNodes*high);
System.out.println(allSearch+"/"+n);
int unAllSearch=lastHeightNodes*2*(high+1); //失败总查找次数(满)
int mm = (int)Math.pow(2,high-1)-lastHeightNodes;
unAllSearch+=(mm*high);
System.out.println(unAllSearch+"/"+(n+1));
}
public static int high(int n){ //高度
int s=0;
while(n>0)
{
n=n/2;
s++;
}
return s;
}
}