javascript数据结构与算法之检索算法


Posted in Javascript onApril 04, 2015

查找数据有2种方式,顺序查找和二分查找。顺序查找适用于元素随机排列的列表。二分查找适用于元素已排序的列表。二分查找效率更高,但是必须是已经排好序的列表元素集合。

一:顺序查找
顺序查找是从列表的第一个元素开始对列表元素逐个进行判断,直到找到了想要的结果,或者直到列表的结尾都没有找到想要找的元素。

代码如下:

function seqSearch(data,arr) {
  for(var i = 0; i < arr.length; ++i) {
    if(arr[i] == data) {
      return true;
    }
  }
  return false;
}

我们也可以返回匹配元素位置的顺序查找函数,代码如下:

function seqSearch(data,arr) {
  for(var i = 0; i < arr.length; ++i) {
    if(arr[i] == data) {
      return i;
    }
  }
  return -1;
}

二:查找最小值和最大值

在数组中查找最小值算法如下:

   1. 将数组第一个元素赋值给一个变量,把这个变量作为最小值。
   2. 开始遍历数组,从第二个元素依次同当前最小值进行比较。
   3. 如果当前元素的数值小于当前最小值,则将当前元素设为新的最小值。
   4. 移动到下一个元素,重复步骤3.
   5.  当程序结束时,这个变量中存储的就是最小值。

代码如下:

function findMin(arr) {
  var min = arr[0];
  for(var i = 1; i < arr.length; ++i) {
    if(arr[i] < min) {
      min = arr[i];
    }
  }
  return min;
}

查找最大值算法和上面最小值类似,先将数组中第一个元素设为最大值,然后循环对数组剩余的每个元素与当前最大值进行比较,如果当前元素的值大于当前的最大值,则将该元素的值赋值给最大值。代码如下:

function findMax(arr) {
  var max = arr[0];
  for(var i = 1; i < arr.length; ++i) {
    if(arr[i] > max) {
      max = arr[i];
    }
  }
  return max;
 }

三:二分查找法。

 如果你要查找的数据是有序的,二分查找算法比顺序查找算法效率更高。二分查找算法基本原理如下:

 1. 将数组的第一个位置设置为下边界(0).
 2. 将数组的最后一个元素所在的位置设置为上边界(数组的长度减1)。
 3. 若下边界等于或小于上边界,则做如下操作:
    A. 将中点设置为(上边界加上下边界) 除以2.
    B. 如果中点的元素小于查询的值,则将下边界设置为中点元素所在下标加1.
    C. 如果中点的元素大于查询的值,则将上边界设置为中点元素所在下标减1.
    D. 否则中点元素即为要查找 的数据,可以进行返回。

代码如下:

// 二分查找算法
function binSearch(data,arr) {
var lowerBound = 0;
  var upperBound = arr.length - 1;
  while(lowerBound <= upperBound) {
    var mid = Math.floor((upperBound + lowerBound)/2);
    if(arr[mid] < data) {
      lowerBound = mid + 1;
    }else if(arr[mid] > data) {
      upperBound = mid - 1;
    }else {
      return mid;
    }
  }
  return -1;
}
 // 快速排序
function qSort(list) {
  if(list.length == 0) {
    return [];
  }
  // 存储小于基准值的值
  var left = [];
  // 存储大于基准值的值
  var right = [];
  var pivot = list[0];
  for(var i = 1; i < list.length; i++) {
    if(list[i] < pivot) {
      left.push(list[i]);
    }else {
      right.push(list[i])
    }
  }
  return qSort(left).concat(pivot,qSort(right));
}
 // 测试代码
var numbers = [0,9,1,8,7,6,2,3,5,4];
var list = qSort(numbers);
console.log(binSearch(6,list));

四:计算重复次数;
当二分查找算法binSearch()函数找到某个值时,如果在数据集中还有其他相同的值出现,那么该函数会定位在类似值附近,换句话说,其他相同的值可能会出现已找到值的左边或者右边。

那么我们最简单的方案是写2个循环,一个同时对数据集向下遍历或者向左遍历,统计重复次数;然后,向上或向右遍历,统计重复次数。代码如下:

// 计算重复次数
function count(data,arr) {
  var count = 0;
  var arrs = [];
  var position = binSearch(data,arr);
  if(position > -1) {
    ++count;
    arrs.push({"index":count});
    for(var i = position -1; i > 0; --i) {
      if(arr[i] == data) {
        ++count;
        arrs.push({"index":count});
      }else {
        break;
      }
    }
    for(var i = position + 1; i < arr.length; ++i) {
      if(arr[i] == data) {
        ++count;
        arrs.push({"index":count});
      }else {
        break;
      }
    }
  }
  return arrs;
}
 // 测试重复次数的代码
var arr = [0,1,1,1,2,3,4,5,6,7,8,9];
var arrs = count(1,arr);
console.log(arrs);
console.log(arrs.length);

如下图所示:

javascript数据结构与算法之检索算法

Javascript 相关文章推荐
JS 自动安装exe程序
Nov 30 Javascript
获取元素距离浏览器周边的位置的方法getBoundingClientRect
Apr 17 Javascript
JavaScript 32位整型无符号操作示例
Dec 08 Javascript
JavaScript获取图片的原始尺寸以宽度为例
May 04 Javascript
jQuery中unwrap()方法用法实例
Jan 16 Javascript
在Node.js应用中读写Redis数据库的简单方法
Jun 30 Javascript
jqGrid表格应用之新增与删除数据附源码下载
Dec 02 Javascript
Angularjs在初始化未完毕时出现闪烁问题的解决方法分析
Aug 05 Javascript
前端编码规范(3)JavaScript 开发规范
Jan 21 Javascript
react-native动态切换tab组件的方法
Jul 07 Javascript
JavaScript自定义超时API代码实例
Apr 30 Javascript
使用Vue-cli 中为单独页面设置背景图片铺满全屏
Jul 17 Javascript
使用jquery制作弹出框效果
Apr 03 #Javascript
javascript 实现map集合
Apr 03 #Javascript
jQuery制作简洁的图片轮播效果
Apr 03 #Javascript
jQuery制作效果超棒的手风琴折叠菜单
Apr 03 #Javascript
jQuery实现左右切换焦点图
Apr 03 #Javascript
基于jquery ui的alert,confirm方案(支持换肤)
Apr 03 #Javascript
javascript制作sql转换为stringBuffer的小工具
Apr 03 #Javascript
You might like
多文件上载系统完整版
2006/10/09 PHP
php UTF-8、Unicode和BOM问题
2010/05/18 PHP
DEDE采集大师官方留后门的删除办法
2011/01/08 PHP
PHP获取MSN好友列表类的实现代码
2013/06/23 PHP
Opcache导致php-fpm崩溃nginx返回502
2015/03/02 PHP
php获取一定范围内取N个不重复的随机数
2016/05/28 PHP
Yii框架中sphinx索引配置方法解析
2016/10/18 PHP
PHP中SESSION过期设置
2021/03/09 PHP
functional继承模式 摘自javascript:the good parts
2011/06/20 Javascript
一个网页标题title的闪动提示效果实现思路
2014/03/22 Javascript
JavaScript动态加载样式表的方法
2015/03/21 Javascript
为何JS操作的href都是javascript:void(0);呢
2015/11/12 Javascript
简单理解vue中Props属性
2016/10/27 Javascript
js模拟微博发布消息
2017/02/23 Javascript
AngularJS入门教程二:在路由中传递参数的方法分析
2017/05/27 Javascript
微信浏览器禁止页面下拉查看网址实例详解
2017/06/28 Javascript
JavaScript数据结构之双向链表和双向循环链表的实现
2017/11/28 Javascript
vue绑定的点击事件阻止冒泡的实例
2018/02/08 Javascript
Vue.js 中的 v-show 指令及用法详解
2018/11/19 Javascript
vue弹出框组件封装实例代码
2019/10/31 Javascript
JS+canvas五子棋人机对战实现步骤详解
2020/06/04 Javascript
浅析JavaScript 函数柯里化
2020/09/08 Javascript
python对指定目录下文件进行批量重命名的方法
2015/04/18 Python
使用Python压缩和解压缩zip文件的教程
2015/05/06 Python
Django验证码的生成与使用示例
2017/05/20 Python
Python之自动获取公网IP的实例讲解
2017/10/01 Python
python3 json数据格式的转换(dumps/loads的使用、dict to str/str to dict、json字符串/字典的相互转换)
2019/04/01 Python
使用python3调用wxpy模块监控linux日志并定时发送消息给群组或好友
2019/06/05 Python
Python使用pdb调试代码的技巧
2020/05/03 Python
python从ftp获取文件并下载到本地
2020/12/05 Python
阿里健康大药房:阿里自营网上药店
2017/08/01 全球购物
学生党员思想汇报范文
2014/01/09 职场文书
信访工作经验交流材料
2014/05/23 职场文书
python基于opencv批量生成验证码的示例
2021/04/28 Python
python基础入门之普通操作与函数(三)
2021/06/13 Python
mysql函数之截取字符串的实现
2022/08/14 MySQL