算法正确性证明:
检验到参数的每类取值
检验算法的每个分支
算法所需空间:
n+5
算法所需时间:
成功检索所需要的元素比较次数=级数
不成功检索所需要的元素比较次数=级数-1
考虑:
成功最好平均最坏
不成功最好成功最坏
对于含有n个内节点的二元树,证明E=2n+1。其中E,I分别为外部和内部路径长度。
当n=1时,E=2,I= 0,所以E(n)=I(n)+2n成立;
不妨假设 ,E(k)=I(k)+2k成立;
当n=k+1时,不妨对二元树中h级的叶子节点x(内节点)进行如下操作:
将内节点x从原树中移除,此时形成一颗新的具有k个节点的二元树,且E(K)=I(K)+2K。
当重新添加x到二元数时,则E(K+1)=E(K)-(h-1)+2h,I(K+1)=I(K)+(h-1)。
则E(K+1) = I(K)+2K-(h-1)+2h = I(K)+(h-1)+2K+2 = I(K+1)+2(K+1)。
即E(K+1) = I(K+1)+2(K+1)
#include <iostream>
using namespace std;
int a[10001];
//三分查找
int thrSearch(int l, int r, int x)
{
if(l <= r)
{
cout << l << "test" << r << endl;
int lMid = l + (r-l)/3;
int rMid = lMid + (r-l)/3;
if(x == a[lMid])
return lMid;
if(x == a[rMid])
return rMid;
if(x < a[lMid])
return thrSearch(l, lMid-1, x);
else if (x > a[rMid])
return thrSearch(rMid+1, r, x);
else
return thrSearch(lMid+1, rMid-1, x);
}
return -1;
}
void Solve(void)
{
double Left, Right;
double mid, midmid;
double mid_value, midmid_value;
Left = MIN; Right = MAX;
while (Left < Right)
{
mid = (Left + Right) / 2;
midmid = (mid + Right) / 2;
mid_area = Calc(mid);
midmid_area = Calc(midmid);
if (mid_area >= midmid_area) Right = midmid;
else Left = mid;
}
}
int main()
{
for (int i = 1; i <= 5; ++i) {
a[i] = i;
}
cout << thrSearch(1, 5, 4);
}