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文件 document.createElement
Oct 14 Javascript
JQuery.Ajax之错误调试帮助信息介绍
Jul 04 Javascript
使用javascript获取页面名称
Dec 23 Javascript
JavaScript实现动态删除列表框值的方法
Aug 12 Javascript
在Linux系统中搭建Node.js开发环境的简单步骤讲解
Jan 26 Javascript
JS 动态判断PC和手机浏览器实现代码
Sep 21 Javascript
JS实现的检验身份证格式并输出出生日期,年龄,性别,出生地示例
May 17 Javascript
JavaScript中的this/call/apply/bind的使用及区别
Mar 06 Javascript
React.js组件实现拖拽排序组件功能过程解析
Apr 27 Javascript
vue实现div单选多选功能
Jul 16 Javascript
详解node.js 事件循环
Jul 22 Javascript
JavaScript canvas实现流星特效
May 20 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
rrmdir php中递归删除目录及目录下的文件
2011/05/15 PHP
php-perl哈希算法实现(times33哈希算法)
2013/12/30 PHP
php获取文件内容最后一行示例
2014/01/09 PHP
php中convert_uuencode()与convert_uuencode函数用法实例
2014/11/22 PHP
在JavaScript中使用inline函数的问题
2007/03/08 Javascript
JavaScript调用Activex控件的事件的实现方法
2010/04/11 Javascript
原生Js实现按的数据源均分时间点幻灯片效果(已封装)
2010/12/28 Javascript
JavaScript 数组详解
2013/10/10 Javascript
js+css实现导航效果实例
2015/02/10 Javascript
百度地图api如何使用
2015/08/03 Javascript
jquery实现动画菜单的左右滚动、渐变及图形背景滚动等效果
2015/08/25 Javascript
vue 中Virtual Dom被创建的方法
2019/04/15 Javascript
利用Vue的v-for和v-bind实现列表颜色切换
2020/07/17 Javascript
[02:48]DOTA2超级联赛专访海涛:你们的选择没有错
2013/06/07 DOTA
python搭建微信公众平台
2016/02/09 Python
asyncio 的 coroutine对象 与 Future对象使用指南
2016/09/11 Python
Python获取文件所在目录和文件名的方法
2017/01/12 Python
python使用fork实现守护进程的方法
2017/11/16 Python
django 外键model的互相读取方法
2018/12/15 Python
django settings.py 配置文件及介绍
2019/07/15 Python
python根据用户需求输入想爬取的内容及页数爬取图片方法详解
2020/08/03 Python
Python绘制词云图之可视化神器pyecharts的方法
2021/02/23 Python
泰国王权免税店官方网站:KingPower
2019/03/11 全球购物
阿姆斯特丹城市卡:Amsterdam Pass
2019/12/01 全球购物
Java语言程序设计测试题选择题部分
2014/04/03 面试题
资产评估专业学生的自我鉴定
2013/11/14 职场文书
通信工程毕业生求职信
2013/11/16 职场文书
四川成都导游欢迎词
2014/01/18 职场文书
初中考试作弊检讨书
2014/02/01 职场文书
房产委托公证书样本
2014/04/04 职场文书
安全保卫工作竞聘材料
2014/08/25 职场文书
2014年银行客户经理工作总结
2014/11/12 职场文书
工作推荐信模板
2015/03/25 职场文书
党员志愿者服务倡议书
2015/04/29 职场文书
2016学习依法治国心得体会
2016/01/15 职场文书
JS精髓原型链继承及构造函数继承问题纠正
2022/06/16 Javascript