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 相关文章推荐
javascript函数库-集合框架
Apr 27 Javascript
用倒置滤镜把div倒置,再把table倒置。
Jul 31 Javascript
js异步加载的三种解决方案
Mar 04 Javascript
动态改变div的z-index属性的简单实例
Aug 08 Javascript
用js正确判断用户名cookie是否存在的方法
Jan 28 Javascript
jQuery trigger()方法用法介绍
Jan 13 Javascript
javascript仿百度输入框提示自动下拉补全
Jan 07 Javascript
使用javascript插入样式
Mar 14 Javascript
使用JS实现图片展示瀑布流效果的实例代码
Sep 12 Javascript
使用jquery datatable和bootsrap创建表格实例代码
Mar 17 Javascript
webpack多入口文件页面打包配置详解
Jan 09 Javascript
JavaScript实现的贝塞尔曲线算法简单示例
Jan 30 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
兼容PHP5的PHP目录管理函数库
2008/07/10 PHP
Laravel获取当前请求的控制器和方法以及中间件的例子
2019/10/11 PHP
基于jQuery的日期选择控件
2009/10/27 Javascript
一句jQuery代码实现返回顶部效果(简单实用)
2016/12/28 Javascript
jquery实现左右滑动式轮播图
2017/03/02 Javascript
Mongoose经常返回e11000 error的原因分析
2017/03/29 Javascript
用vue的双向绑定简单实现一个todo-list的示例代码
2017/08/03 Javascript
jQuery实现ajax回调函数带入参数的方法示例
2018/06/26 jQuery
koa2实现登录注册功能的示例代码
2018/12/03 Javascript
js console.log打印对象时属性缺失的解决方法
2019/05/23 Javascript
Vue将页面导出为图片或者PDF
2020/08/17 Javascript
Node.JS枚举统计当前文件夹和子目录下所有代码文件行数
2019/08/23 Javascript
layui 解决form表单点击无反应的问题
2019/10/25 Javascript
vue自定义组件(通过Vue.use()来使用)即install的用法说明
2020/08/11 Javascript
[03:51]吞吞映像 每周精彩击杀top10第二弹
2014/06/25 DOTA
Python实现分割文件及合并文件的方法
2015/07/10 Python
一个基于flask的web应用诞生 bootstrap框架美化(3)
2017/04/11 Python
Python数据可视化编程通过Matplotlib创建散点图代码示例
2017/12/09 Python
Python 数据处理库 pandas 入门教程基本操作
2018/04/19 Python
python 获取指定文件夹下所有文件名称并写入列表的实例
2018/04/23 Python
python实现对象列表根据某个属性排序的方法详解
2019/06/11 Python
ipad上运行python的方法步骤
2019/10/12 Python
使用python创建生成动态链接库dll的方法
2020/05/09 Python
Python压缩模块zipfile实现原理及用法解析
2020/08/14 Python
css3动画过渡实现鼠标跟随导航效果
2018/02/08 HTML / CSS
css3实现图片遮罩效果鼠标hover以后出现文字
2013/11/05 HTML / CSS
日本最大的药妆连锁店:Matsukiyo松本清药妆店
2017/11/23 全球购物
天鹅的故事教学反思
2014/02/04 职场文书
水电工岗位职责
2014/02/12 职场文书
《中彩那天》教学反思
2014/02/22 职场文书
学生会副主席竞聘书
2014/03/31 职场文书
同学聚会通知短信
2015/04/20 职场文书
2016年学校十一国庆节活动总结
2016/04/01 职场文书
JS实现数组去重的11种方法总结
2022/04/04 Javascript
【D4DJ】美少女DJ企划 动画将于明年冬季开播第2季
2022/04/11 日漫
索尼ICF-5900W收音机测评
2022/04/24 无线电