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 相关文章推荐
prototype class详解
Sep 07 Javascript
23个Javascript弹出窗口特效整理
Feb 25 Javascript
Jquery Change与bind事件代码
Sep 29 Javascript
js 判断上传文件大小及格式代码
Nov 13 Javascript
JS实现页面超时后自动跳转到登陆页面
Jan 19 Javascript
JavaScript中的getDay()方法使用详解
Jun 09 Javascript
基于Bootstrap里面的Button dropdown打造自定义select
May 30 Javascript
js模式化窗口问题![window.dialogArguments]
Oct 30 Javascript
JS中的BOM应用
Feb 02 Javascript
Three.js实现3D机房效果
Dec 30 Javascript
Vue+Express实现登录注销功能的实例代码
May 05 Javascript
详解vue-cli项目在IE浏览器打开报错解决方法
Dec 10 Vue.js
使用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
php读取mysql中文数据出现乱码的解决方法
2013/08/16 PHP
PHP常用的缓存技术汇总
2014/05/05 PHP
Yii使用CLinkPager分页实例详解
2014/07/23 PHP
在WordPress中实现评论头像的自定义默认和延迟加载
2015/11/24 PHP
Jquery Ajax的Get方式时需要注意URL地方
2011/04/07 Javascript
js校验表单后提交表单的三种方法总结
2014/02/28 Javascript
Jquery实现瀑布流布局(备有详细注释)
2015/07/31 Javascript
jquery实现网页定位导航
2016/08/23 Javascript
纯原生js实现table表格的增删
2017/01/05 Javascript
利用jquery实现实时更新歌词的方法
2017/01/06 Javascript
jQuery编写网页版2048小游戏
2017/01/06 Javascript
JS条形码(一维码)插件JsBarcode用法详解【编码类型、参数、属性】
2017/04/19 Javascript
js原生日历的实例(推荐)
2017/10/31 Javascript
jQuery EasyUI 选项卡面板tabs的使用实例讲解
2017/12/25 jQuery
Swiper自定义分页器使用详解
2017/12/28 Javascript
webpack中的热刷新与热加载的区别
2018/04/09 Javascript
使用webpack搭建vue项目及注意事项
2019/06/10 Javascript
使用js在layui中实现上传图片压缩
2019/06/18 Javascript
layui自己添加图片按钮并点击跳转页面的例子
2019/09/14 Javascript
使用p5.js实现动态GIF图片临摹重现
2019/10/23 Javascript
jQuery cookie的公共方法封装和使用示例
2020/06/01 jQuery
详解JS函数防抖
2020/06/05 Javascript
Python工厂函数用法实例分析
2018/05/14 Python
Python3 pywin32模块安装的详细步骤
2020/05/26 Python
Python应用自动化部署工具Fabric原理及使用解析
2020/11/30 Python
css3气泡 css3关键帧动画创建的动态通知气泡
2013/02/26 HTML / CSS
HTML5之语义标签介绍
2016/07/07 HTML / CSS
Amara德国:家居饰品、设计师品牌和豪华礼品
2019/05/20 全球购物
学校安全工作制度
2014/01/19 职场文书
团日活动总结范文
2014/04/25 职场文书
个性婚礼策划方案
2014/05/17 职场文书
咖啡厅商业计划书
2014/09/15 职场文书
教师三严三实心得体会
2014/10/11 职场文书
婚宴新郎致辞
2015/07/28 职场文书
MySQL 常见的数据表设计误区汇总
2021/06/07 MySQL
python实现简易自习室座位预约系统
2021/06/30 Python