当前位置: 首页 > news >正文

网站开发框架具体使用方法/淘宝关键词指数查询

网站开发框架具体使用方法,淘宝关键词指数查询,wordpress网页搭建报名表,营销网站建站开发本文完整阅读需要的基础知识:循环结构,数组,函数,递归。 n个由小到大排好序的数,再给一个数x,判断这个数在数组中有没有出现过,如果有,就输出这个数在数组的位置,没有就输出”NO”. 样例:输入: 6 //以下有6个数 1 4 6 8 9 10 9 //…

本文完整阅读需要的基础知识:循环结构,数组,函数,递归。

n个由小到大排好序的数,再给一个数x,判断这个数在数组中有没有出现过,如果有,就输出这个数在数组的位置,没有就输出”NO”. 样例:输入:
6 //以下有6个数 1 4 6 8 9 10 9 //要找的x
输出: 5 //第5个数 方法:如果采用顺序查找,要经过5次才找到。
而用折半查找,开始的比较区间是1-6, 先取中间一个数,即第3个数6,
9比6大,说明在6的后面,下面就把区间变成4-6,
取中间数,即第5个数9,正好找到,这样总次数变成2次查找。

现在我们要完成这样的任务:如何在数组a的区间[first,last]内寻找key,其中a数组是有序的, 我们假设非降次序的(即:a[ first ] <= a[ first+1 ] <= … <= a[ last ] ) 中搜索key, 找到key时返回其在数组中的位置,否则返回-1 。

顺序查找(从头到尾查找一遍)

int binarySearch(int a[], int first int last, int key) {for (int i=first; i<=last; i++)if (a[i]==key) return i;return -1;
}

普通的二分查找(非递归)

int binarySearch(int a[] , int first, int last, int key) {int left = first;int right = last;while (left <= right) {int mid = (left + right)/2;  // mid = left + ((right- left) / 2);if (key == a[mid]) return mid;else if (a[mid] < key ) left = mid + 1;else  if( a[mid]  > key) right = mid - 1;}return -1; // 未找到key
}

用递归算法完成二分查找

int binarySearch(int a[], int first ,int last, int key) {// 找到x时返回其在数组中的位置,否则返回-1if ( first > last) return -1;// 未找到xelse {int mid = ( first + last)/2;if (a[mid]==key)   return mid;else  if ( a[mid]< key )   return binarySearch(a, mid+1,last ,key);else if( a[mid] > key) return binarySearch( a, first, mid-1, key);}
}

提醒:

注意查找的范围【first,last】,每次查找的范围:前后都是闭区间的范围。
注意 while(first <= last)循环(递归同理)的终止条件是: first 与 last错位, 即 first == last + 1
在这里插入图片描述

##常犯的错误:竟然找不到某些数字
分析代码:为啥 找不到数字13呢?

#include <bits/stdc++.h>
using namespace std;
const  int  N =10;
int a[12]= {0 ,5, 13,19, 21,37,56,64,75,80,88,92};
int my_research(int L, int R, int key) {int first = L, last = R;while(first < last) {    //这里有错误噢int middle =  (first+last)/2;if( a[middle]==key)return middle;else if( a[middle] < key ) first = middle+1;else if( a[middle] > key ) last=middle-1;}return -1;
}int main() {cout <<  my_research(1, 11,13);return 0;
}

火急提醒:while(first < last) 循环的终止条件是:first == last, 当first == last时候,【first,last】区间内还有一个值,但可惜循环已经结束了。

如果要查找有序数组里面的存在多个元素key, 要找到最左边的和最右边的位置呢?

留意一下:lower_bound 和 upper_bound 分别返回哪位置。

lower_bound : 二分查找求下界

在这里插入图片描述

#include <bits/stdc++.h>
using namespace std;
const  int  N =10;
int a[12]= {0 ,5, 13,21, 21,21,21,64,75,80,88,92};
int my_lower_bound(int L, int R, int key) {int first = L, last = R;while(first <= last) {int middle =  (first+last)/2;if( a[middle] == key ) last = middle-1; // first 按兵不动, last移动else if(  a[middle] >  key  ) last = middle-1; else if( a[middle] <  key )first = middle+1; }return first;
}int main() {cout <<  my_lower_bound(1, 12,21);return 0;
}

若 a[middle] ==key ,至少已经找到一个,然后左边可能还有, 因此区间变成 【first , middle】
若 a[middle] > key ,所找的位置,不可在后面, 因此区间变成【first , middle -1】
若 a[middle] < key ,所找的位置不可能是middle,也不可能在前面 因此区间变成 【middle+1, last】

upper_bound:

#include <bits/stdc++.h>
using namespace std;
const  int  N =10;
int a[12]= {0 ,5, 13,21, 21,21,21,64,75,80,88,92};
int my_upper_bound(int L, int R, int key) {int first = L, last = R-1;while(first <= last) {int middle =  (first+last)/2;if( a[middle] == key )first = middle+1;  // last 按兵不动,first移动else if( a[middle] >  key )last = middle-1 ;else if( a[middle] <  key )first = middle+1;}return last;
}int main() {cout <<  my_upper_bound(1, 12,21);return 0;
}

思考:如果有序数组里面的不存在元素key

如果有序数组里面的不存在元素key

lower_bound 中的first位置停在哪里?

返回一个非递减序列 [ first, last ] 中的。当key存在多个时,返回key出现的第一个位置。 若果不存在,first停在第一个大于key的位置,即返回一个这样的下标: 在此处插入key,序列依然有序。

return ( first < length && a[first] == key ) ? first : -1;
upper_bound的last位置停在哪里呢?

返回一个非递减序列[ first, last ]中。当key存在多个时,返回key出现的最后一个位置。若果不存在, right停在第一个大于key的位置,即返回一个这样的下标: 在此处插入key,序列依然有序。

return ( last > 0 && a[last] == key ) ? last : -1;

你经常遇到的死循环

#include <bits/stdc++.h>
using namespace std;
const  int  N =10;
int a[12]= {0 ,5, 13,21, 21,21,21,64,75,80,88,92};
int wrong_lower_bound(int L, int R, int key) {int first = L, last = R;while(first <= last) {int middle =  (first+last)/2;if( a[middle] == key ) last = middle; else if(  a[middle] >  key  ) last = middle-1; else if( a[middle] <  key )first = middle+1; }return first;
}
int main() {cout <<  wrong_lower_bound(1, 12,21);return 0;
}

bug出现在这里: if( a[middle] == key ) last = middle; 如果first ==last , middle = (first+last)/2 = first位置。 [first, middle] 与[fist, last]区间一样,将发生死循环。

说白了就是因为mid=(first+last)/2不会取到last值

为了这篇完整性,特地安排了这一节。具体细节日后再解析。

二分答案(不只是查找值)题目描述中若出现类似: “最大值最小”的含义,这个答案就具有单调性,可用二分答案法。这个宏观的最优化问题,可以抽象为一个函数,其“定义域”是该问题的可行方案。

满足 >=x的范围中查找最小的一个

在这里插入图片描述

考虑“求某个条件C(x)的最小x” ,这个问题,对于任意满足C(x)的x,如果所有的x’ > x 也满足C(x’)的话,这个问题可以想像成一个特殊的单调函数,在s的一侧不合法,在s的另一侧不合法,我们就可以用二分法找到某得分界点。

查找满足 <=x 的范围中的最大的一个。

在这里插入图片描述

实数区域上的二分

确定好精度 以 L + esp < R 为循环条件 ,一般需要保留2位小数时候,则取精度eps = le-4

whileL+ esp  < R{double  mid =  (L + R) /2if (   ) R = middleelse   L = middle}

或者干脆采用循环固定次数的方法,也是不错的策略

for(int i=0; i<100; i++) {double middle = (L+R) /2;if(  )  L=middle;else R =middle
}
http://www.lbrq.cn/news/1443385.html

相关文章:

  • 深圳网站开发专业团队/石家庄网络营销
  • 深圳的建站公司/自己开网站怎么开
  • 西安网站建设设计的好公司/磁力链
  • 网站背景图片怎么做/百度无锡营销中心
  • 做国际交友网站翻译/整合营销经典案例
  • phpmysql网站开发案例/网络营销的三种方式
  • 国外做黄漫的网站/地推一手项目平台
  • 做社交网站开发/怎样无货源开网店
  • 网站上传好了如何做定向/搜索引擎优化方法有哪些
  • 给网站写教案做课件一节课多少钱/公司网站设计要多少钱
  • 如何防止php网站被挂马/厦门seo
  • 已有网站如何做直播/黑帽seo寄生虫
  • 做海报找背景图有哪些网站/全球搜索
  • php发布post到wordpress/百度seo优
  • 政府网站手机版建设方案/推广一单500
  • 做网站劫持多少钱/做个网站
  • 网页微博如何退出登录/网站的优化公司
  • 广州市地铁线路最新全图/在线seo超级外链工具
  • crm系统是干什么的/廊坊seo排名外包
  • 网上商城项目设计方案/郑州seo网站有优化
  • 动易网站首页制作/最全的搜索引擎
  • 建电影网站教程/百度统计登录
  • 企业网站建设遵循的原则/网店运营流程步骤
  • 廊坊建站模板系统/广告推广方案
  • 在线考试类网站怎么做/百度网盘官网下载
  • 海淀网站建设联系方式/关键词排名优化流程
  • 做网站办公照片/百度视频推广怎么收费
  • 网站建设关键字/网站seo课程
  • 网站首页滚动图片用dw怎么做/国外独立网站如何建站
  • 服务型网站有哪些/友情链接网自动收录
  • 荣耀手机无法连接win11电脑,错误消息:“无法在此设备上加载驱动程序 (hn_usbccgpfilter.sys)。”解决方案
  • 京东方 DV133FHM-NN1 FHD13.3寸 工业液晶模组技术档案
  • 面试实战 问题二十三 如何判断索引是否生效,什么样的sql会导致索引失效
  • PostgreSQL 批量COPY导入优化参数配置
  • 字节:计算机存储单位
  • QT的常用控件说明