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 相关文章推荐
通过下拉框的值来确定输入框是否可以为空的代码
Oct 18 Javascript
实例详解ECMAScript5中新增的Array方法
Apr 05 Javascript
再谈javascript常见错误及解决方法
Sep 16 Javascript
jQuery鼠标事件总结
Oct 13 Javascript
基于slideout.js实现移动端侧边栏滑动特效
Nov 28 Javascript
bootstrap学习使用(导航条、下拉菜单、轮播、栅格布局等)
Dec 01 Javascript
javascript实现日期三级联动下拉框选择菜单
Dec 03 Javascript
详解有关easyUI的拖动操作中droppable,draggable用法例子
Jun 03 Javascript
解决angularjs service中依赖注入$scope报错的问题
Oct 02 Javascript
JS拖拽排序插件Sortable.js用法实例分析
Feb 20 Javascript
js纯前端实现腾讯cos文件上传功能的示例代码
May 14 Javascript
js 执行上下文和作用域的相关总结
Feb 08 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
linux下删除7天前日志的代码(php+shell)
2011/01/02 PHP
JS查看对象功能代码
2008/04/25 Javascript
javascript中的self和this用法小结
2014/02/08 Javascript
JavaScript使用HTML5的window.postMessage实现跨域通信例子
2014/04/11 Javascript
jquery模拟LCD 时钟的html文件源代码
2014/06/16 Javascript
JavaScript实现同一页面内两个表单互相传值的方法
2015/08/12 Javascript
基于JavaScript实现添加到购物车效果附源码下载
2016/08/22 Javascript
JS封装的三级联动菜单(使用时只需要一行js代码)
2016/10/24 Javascript
详解nodeJS之路径PATH模块
2017/05/31 NodeJs
Webpack 服务器端代码打包的示例代码
2017/09/19 Javascript
一个简易时钟效果js实现代码
2020/03/25 Javascript
解决layui页面按钮点击无反应,也不报错的问题
2019/09/29 Javascript
vue动画—通过钩子函数实现半场动画操作
2020/08/09 Javascript
vue实践---vue不依赖外部资源实现简单多语操作
2020/09/21 Javascript
python3下实现搜狗AI API的代码示例
2018/04/10 Python
Python多进程multiprocessing.Pool类详解
2018/04/27 Python
使用python 3实现发送邮件功能
2018/06/15 Python
利用python求积分的实例
2019/07/03 Python
python Django框架实现web端分页呈现数据
2019/10/31 Python
django formset实现数据表的批量操作的示例代码
2019/12/06 Python
Python 中的pygame安装与配置教程详解
2020/02/10 Python
Windows下Pycharm远程连接虚拟机中Centos下的Python环境(图文教程详解)
2020/03/19 Python
python实现简单的学生管理系统
2021/02/22 Python
怀俄明州飞钓:Platte River Fly Shop
2017/12/28 全球购物
Supersmart英国:欧洲市场首批食品补充剂供应商之一
2018/05/05 全球购物
培训演讲稿范文
2014/01/12 职场文书
大学生开西餐厅创业计划书
2014/02/01 职场文书
高三家长寄语
2014/04/03 职场文书
网吧七夕活动策划方案
2014/08/31 职场文书
四风问题对照检查整改措施思想报告
2014/10/05 职场文书
初中作文评语集锦
2014/12/25 职场文书
出国留学导师推荐信
2015/03/26 职场文书
Nginx优化服务之网页压缩的实现方法
2021/03/31 Servers
php引用传递
2021/04/01 PHP
新手入门Mysql--sql执行过程
2021/06/20 MySQL
Nginx配置根据url参数重定向
2022/04/11 Servers