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

南阳那里有做网站的小程序开发公司哪家正规

南阳那里有做网站的,小程序开发公司哪家正规,网站开发pmp,代运营推广公司1.前言 常见的查找算法有顺序查找、二分查找、插值查找、斐波那契查找、树表查找、分块查找、哈希查找等。如果进行归类,那么二分查找、插值查找(一种查找算法)以及斐波那契查找都可以归为插值查找(大类)。而插值查找…

1.前言

常见的查找算法有顺序查找、二分查找、插值查找、斐波那契查找、树表查找、分块查找、哈希查找等。如果进行归类,那么二分查找、插值查找(一种查找算法)以及斐波那契查找都可以归为插值查找(大类)。而插值查找和斐波那契查找是在二分查找的基础上的优化查找算法。

这些算法中最重要的就是Hash查找二分查找

记住:凡是涉及到在排好序的地方(全局或部分)查找的都可以考虑使用二分查找来优化查找效率

插值查找使用的公式为:
x = ( k e y − a r r [ i ] ) ( r − i ) a r r [ r ] − a r r [ i ] x = \frac{(key-arr[i])(r-i)}{arr[r]-arr[i]} x=arr[r]arr[i](keyarr[i])(ri)
其中,ir分别代表数组的第一个和最后一个索引, key代表待查找的元素

分块查找是折半查找和顺序查找的一种改进方法,分块查找由于只要求索引表是有序的,对块内节点没有排序要求,因此特别适合解决节点动态变化的情况。

2.基本查找

基本查找也就是顺序查找,不需要在乎数组是否排序,缺点是效率较低

function search(arr, key) {for (let index = 0; index < arr.length; index++) {if (arr[index] === key) {return index;}}
}

3.二分查找与分治

分治就是把整体拆分为局部,一个复杂的问题可以拆分成很多相似的小问题。二分查找是将中间结果与目标进行比较,一次去掉一半。
在这里插入图片描述

3.1 循环方法

// 二分查找——循环方式
function binarySearch(array, low, high, target) {while (low < high) {let mid = (low + high) / 2;if (array[mid] < target) {low = mid + 1} else if (array[mid] > target) {high = mid - 1;} else {return mid;}}return -1;
}

/ 运算符效率较低,可以写成移位符 >>, 还存在一个问题,当lowhigh 过于大时,low + high可能会溢出,可以将 let mid = (low + high) / 2;改为let mid = low + ((high - low) >> 1);,只要lowhigh 没有溢出,mid就不会溢出。

最终代码如下:

function binarySearch(array, low, high, target) {while (low < high) {let mid = low + ((high - low) >> 1);if (array[mid] < target) {low = mid + 1} else if (array[mid] > target) {high = mid - 1;} else {return mid;}}return -1;
}

3.2 递归方法

按照递归三步法,代码如下:

// 二分查找——递归方式
function binarySearch(array, low, high, target) {// 递归终止条件if (low <= high) {let mid = low + ((high - low) >> 1);// 不同情况判断if (array[mid] === target) {return mid;} else if (array[mid] < target) {return binarySearch(array, mid + 1, high, target);} else {return binarySearch(array, low, mid - 1, target);}}// 表示没有搜索到return -1;
}

4.有重复元素的二分查找

在上面的基础上,如果元素存在重复,要求如果重复就找左侧第一个,比如[1, 2, 2, 2, 3, 3, 3, 4, 5, 6],要返回第一个2的索引值——1

分析:基于上面简单的二分查找,在这里我们找到target不要着急返回,而是在重复元素的这个区间继续进行查找,一直找到最左侧的重复元素,再返回最左侧元素的重复索引。在重复元素的这个区间继续进行查找方法有好几种,第一种方法比较简单,就是使用线性查找,一个一个的向左进行查找直到找到最左侧的重复元素。

// 元素中有重复的二分查找,在上面的基础上,元素存在重复,如果重复则找左侧第一个
function binarySearchOfRepeat(array, target) {// 特判if (array === null || array.length  === 0) {return -1;}let left = 0;let right = array.length - 1;while (left <= right) {let mid = left + ((right - left) >> 1);if (array[mid] < target) {left = mid + 1;} else if (array[mid] > target) {right = mid - 1;} else {// 找到目标值后,还应该继续向左侧进行线性查找,直到左侧没有重复值while (mid !== 0 && array[mid] === target) {mid--;}// 如果一直找到了开头还都是重复值,就返回开头if (mid === 0 && array[mid] === target) {return mid;}// 不然就返回mid + 1return mid + 1;}}return -1;
}

这里之所以返回mid + 1,是因为假如序列为[1, 2, 2, 2, 2, 3, 3],当target=3,当内层的while循环退出时,nums[mid]=2,因此必须返回mid + 1

第二种方法呢就是使用折半查找:

function binarySearchOfRepeat(array, target) {// 特判if (array === null || array.length  === 0) {return -1;}let left = 0;let right = array.length - 1;while (left <= right) {let mid = left + ((right - left) >> 1);if (target < array[mid]) {right = mid - 1;} else if (target > array[mid]) {left = mid + 1;} else {// 如果存在重复元素,在该段重复数组区间内进行折半查找while (left < mid) {				let midLeft = left + ((mid - left) >> 1);// 如果array[midLeft] === target,直接去掉一半右边的重复值if (array[midLeft] === target) {mid = midLeft;} // 如果array[midLeft] !== target,说明超过了重复区间,让left =  midLeft + 1,继续查找else {left =  midLeft + 1;}}return left;}}return -1;
}

拓展——使用递归进行有重复元素的二分查找

再拓展一下,使用递归方法。

function binarySearchOfRepeat(array, target, left, right) {// 不能发生边界逾矩if (left > right) {return -1;}let mid = left + ((right - left) >> 1);if (array[mid] === target) {// 在重复区间内使用递归来找到最左侧的位置let leftmostInRepeat = binarySearchOfRepeat(array, target, left, mid - 1);// 如果没有重复返回mid,如果有重复返回重复区间最左侧值索引return (leftmostInRepeat === -1) ? mid : leftmostInRepeat;} else if (target < array[mid]) {return binarySearchOfRepeat(array, target, left, mid - 1);} else {return binarySearchOfRepeat(array, target, mid + 1, right);}
}function findLeftmostRepeatIndex(array, target) {if (array === null || array.length === 0) {return -1;}return binarySearchOfRepeat(array, target, 0, array.length - 1);
}
http://www.yayakq.cn/news/714833/

相关文章:

  • 海东企业网站建设公司企业网站页脚信息
  • c 网站开发连接mysql9377网页游戏
  • 东莞阳光网站建设成效郑州技术支持seo
  • 网站建设的成功之处有哪些企业seo是什么意思
  • 帝国怎么做中英文网站提供营销单页网站
  • 一般网站维护需要做什么服装设计手稿设计图
  • 北京建网站的公司公司网站制作步骤流程图
  • 外贸网站多语言wordpress 只显示某分类
  • 外贸网站建设要求找客户信息的软件
  • 宁波网站推广怎么做如何做微信官方网站
  • 天津网站建设网站推广wordpress 页面链接
  • 网站建设要准备些什么以下可以制作二维码的网站为
  • 网站主机空间wordpress应用下载主题
  • 网站建设厘金手指排名二二开发公司是生产经营单位吗
  • 网站到期续费吗免费咨询皮肤科医生在线
  • 营销型网站建设范文免费制作h5页面平台
  • 建设网站的视频制作网站和制作网页的分别
  • 网站名称注意事项漯河网上商城网站建设
  • 网站制作的评价国家域名注册
  • 中国建设机械教育网官方网站南京网站制作费用
  • 织梦后台怎么加自己做的网站上海襄阳网站建设
  • 湖南营销型网站建设推广大学网站首页设计
  • 外贸网站设计风格wordpress赞插件
  • 兼职做效果图设计到哪个网站找郑州做优化的公司有哪些
  • 温州哪里有做网站沈阳做网站建设
  • 如何用ip做网站建造师在建项目查询网
  • 做个网站大约多少钱wordpress子域名图床
  • 移动手机网站开发南宁网站搜索引擎优化
  • 海盐网站建设在线做的网站
  • 厦门城乡建设局网站课程网站开发卷宗