- 1、本文档共12页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
二分查找、三分搜索
二分查找、三分搜索 蔡尚真 609787 二分查找 二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。 二分查找 1.二分查找的时间复杂度是O(log(n)),最坏情况下的时间复杂度是O(n)。 2.二分查找的一个条件是待查询的数组是有序的,我们假设这里的数组是升序的。 3.二分查找的主要思路就是设定两个指针start和end分别指向数组元素的首尾两端,然后比较数组中间结点arry[mid]和待查找元素。如果待查找元素小于中间元素,那么表明待查找元素在数组的前半段,那么将end=mid-1,如果待查找元素大于中间元素,那么表明该元素在数组的后半段,将start=mid+1;如果中间元素等于待查找元素,那么返回mid的值。 int BinarySearch(int arry[],int len,int value) { int l=0; int r=len-1; while(l=r) { int mid=(l+r)/2; if(arry[mid]==value) return mid; else if(valuearry[mid]) r=mid-1; else l=mid+1; } return -1; } //最基本的二分查找 algorithm中的二分查找 首先 #include algorithm 已知有一序列 a[] ={1,2,2,2,2,4,7} lower_bound 返回一个迭代器指向其中第一个这个元素 upper_bound 返回一个迭代器指向其中最后一个这个元素的下一个位置 binary_search 返回一个存在与否的bool值 #include iostream #include algorithm #include map #include set #include ctime #include cmath #include string #include list using namespace std; int a[7] ={1, 2, 2, 2, 2, 4, 7}; int main() { int *p; bool f; p = lower_bound(a, a + 7, 2); printf(%d\n, p - a); p = lower_bound(a, a + 7, 3); printf(%d\n, p - a); p = upper_bound(a, a + 7, 2); printf(%d\n, p - a); p = upper_bound(a, a + 7, 3); printf(%d\n, p - a); f = binary_search (a, a + 7, 2); printf(%d\n, f); f = binary_search (a, a + 7, 3); printf(%d\n, f); getchar(); return 0; } 二分查找的思考 如果自己写lower_bound、upper_bound 的实现代码,应该如何在原有的二分查找基础上修改。 三分搜索(以凹函数为例) 当 mm点的值比m点的值大,搜索范围可以从[l,r]变成[l, mm], 同理当 m点的值比mm点的值大,搜索范围可以从[l,r]变成[m, r], 三分搜索 那么凸函数呢? double Calc(Type a) //Type :某种数据类型 { /* 根据题目的意思计算 */ } double Solve() { double l, r; double mid, midmid; double mid_value, midmid_value; l = MIN; r = MAX; //MIN MAX 为搜索的上下边界 while (l + EPS r) //EPs 要求的精度 { //mid 和midmid的具体公式无所谓 //只要mid在midmid的右边,能满足精度要求即可 mid = (l + r) / 2; midmid = (mid + r) / 2; m
文档评论(0)