习题:
2:我写的做不到log(n),而是n2;(9.3章节有log(n))
int erfeng(string &s, int l, int r, char n)
{
intmid;
while(l<=r)
{
mid =((l+r)>>1);
if(s[mid]==n)
{
int i;
for(i=mid;i>=0; i--)
{
if(s[i]!=n)
{break;}
}
if(i==0&&s[i]==n)
returni;
else returni+1;
}
if(s[mid]>n)
{
r=mid-1;//控制-1!!!!
}
else
{
l=mid+1;//控制+1!!!!
}
}
return-1;
}//复杂度为O(log(n))
第六题:
这个过程一定会终止的,为什么呢?
如题意,我们每次都至少会倒出一颗豆子,要么倒出两颗白豆子或是0颗白豆子;
所以在咖啡罐子里的白豆子的奇偶性是不会变化的;
所以如果,白豆子初始的时候是奇数的话,那么最后一定会留意个白豆子下来;
第七题:
二分,然后又带点模糊搜索,话说我写的不太好效率不是很满意;
int erfeng(string &s, int l, int r, char n)
{
while(l<r)
{
if(n==s[l])
{printf("在线段%d上\n", l+1); return 0;}
if(n==s[r])
{printf("在线段%d上\n", r+1); return 0;}
if(s[(l+r)/2]==n)
{
printf("在线段%d上\n", (l+r)/2+1);
return0;
}
if(s[(l+r)/2]>n)
{
if(s[(l+r)/2-1]<n)
{
printf("在线段%d与线段%d之间\n",(l+r)/2, (l+r)/2+1);
return0;
}
r=(l+r)/2-1;//控制-1!!!!
}
else if(s[(l+r)/2]<n)
{
if(s[(l+r)/2+1]>n)
{
printf("在线段%d与线段%d之间\n",(l+r)/2+1, (l+r)/2+2);
return0;
}
l=(l+r)/2+1;//控制+1!!!!9
}
}
printf("找不到\n");
return0;
}
第九题:
其实书本上有个地方挺误导人的;
p42,quare(exp(x, n/2));
这个伪代码很容易让人误会啊,让人以为翻译过来是:
exp(x, n/2)*exp(x, n/2);
其实应该这样的:exp(x*x, n/2);
完整代码如下:这样就很容易看明白了;
long function1(int x, int n)
{
if (0 ==n)
{
return1;
}
if(n%2==0)
{
//returnfunction1(x, n/2)*function1(x, n/2);
returnfunction1(x*x, n/2);
}
else returnx*function1(x, n-1);
}
这个算法的复杂度是O(logn)效率非常的好;
999999 999999999
-912380481
Time1:0
-912380481
Time2:3.66e+06
12345 12345556
1419728353
Time1:0
1419728353
Time2:40000
Time1是采用书本的方法的时间,
TIme2是采用最普通的遍历地方法的时间;
2:我写的做不到log(n),而是n2;(9.3章节有log(n))
int erfeng(string &s, int l, int r, char n)
{
}//复杂度为O(log(n))
第六题:
这个过程一定会终止的,为什么呢?
如题意,我们每次都至少会倒出一颗豆子,要么倒出两颗白豆子或是0颗白豆子;
所以在咖啡罐子里的白豆子的奇偶性是不会变化的;
所以如果,白豆子初始的时候是奇数的话,那么最后一定会留意个白豆子下来;
第七题:
二分,然后又带点模糊搜索,话说我写的不太好效率不是很满意;
int erfeng(string &s, int l, int r, char n)
{
}
第九题:
其实书本上有个地方挺误导人的;
p42,quare(exp(x, n/2));
这个伪代码很容易让人误会啊,让人以为翻译过来是:
exp(x, n/2)*exp(x, n/2);
其实应该这样的:exp(x*x, n/2);
完整代码如下:这样就很容易看明白了;
long function1(int x, int n)
{
}
这个算法的复杂度是O(logn)效率非常的好;
999999 999999999
Time1:0
Time2:3.66e+06
12345 12345556
Time1:0
Time2:40000
Time1是采用书本的方法的时间,
TIme2是采用最普通的遍历地方法的时间;
本文探讨了算法优化技巧,包括如何实现二分查找的正确边界控制,避免常见误区,并给出了高效的递归算法实现,对比了不同算法的执行效率。
647

被折叠的 条评论
为什么被折叠?



