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 相关文章推荐
删除select中所有option选项jquery代码
Aug 12 Javascript
在JavaScript中判断整型的N种方法示例介绍
Jun 18 Javascript
兼容最新firefox、chrome和IE的javascript图片预览实现代码
Aug 08 Javascript
JavaScript截断字符串的方法
Jul 15 Javascript
初步了解javascript面向对象
Nov 09 Javascript
JavaScript中数组的各种操作的总结(必看篇)
Feb 13 Javascript
使用bootstrap插件实现模态框效果
May 10 Javascript
vue生成随机验证码的示例代码
Sep 29 Javascript
使用node打造自己的命令行工具方法教程
Mar 26 Javascript
微信小程序实现刷脸登录
May 25 Javascript
微信小程序云开发之云函数详解
May 16 Javascript
vue跳转页面的几种方法(推荐)
Mar 26 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
融入意大利的咖啡文化
2021/03/03 咖啡文化
PHP中集成PayPal标准支付的实现方法分享
2012/02/06 PHP
PHP大批量插入数据库的3种方法和速度对比
2014/07/08 PHP
根据地区不同显示时间的javascript代码
2007/08/13 Javascript
JS与框架页的操作代码
2010/01/17 Javascript
探索Emberjs制作一个简单的Todo应用
2012/11/07 Javascript
js创建一个input数组并绑定click事件的方法
2014/06/12 Javascript
javascript获取网页宽高方法汇总
2015/07/19 Javascript
JS实现不规则TAB选项卡效果代码
2015/09/16 Javascript
探究Vue.js 2.0新增的虚拟DOM
2016/10/20 Javascript
js Canvas实现的日历时钟案例分享
2016/12/25 Javascript
WebPack基础知识详解
2017/01/16 Javascript
jQuery+PHP+Mysql实现抽奖程序
2020/04/12 jQuery
jQuery实现简单的滑动导航代码(移动端)
2017/05/22 jQuery
Node.js 使用命令行工具检查更新
2017/06/08 Javascript
Vue中自定义全局组件的实现方法
2017/12/08 Javascript
JS获取input[file]的值并显示在页面的实现方法
2018/03/09 Javascript
JS实现网页烟花动画效果
2020/03/10 Javascript
javascript实现简单留言板案例
2021/02/09 Javascript
用Python写冒泡排序代码
2016/04/12 Python
在CentOS6上安装Python2.7的解决方法
2018/01/09 Python
使用Python开发SQLite代理服务器的方法
2018/12/07 Python
Python之使用adb shell命令启动应用的方法详解
2019/01/07 Python
flask框架路由常用定义方式总结
2019/07/23 Python
python实现扑克牌交互式界面发牌程序
2020/04/22 Python
在终端启动Python时报错的解决方案
2020/11/20 Python
使用CSS3制作版头动画效果
2020/12/24 HTML / CSS
STUBHUB日本:购买和出售全球活动门票
2018/07/01 全球购物
电子商务个人职业生涯规划范文
2014/02/12 职场文书
考生诚信考试承诺书
2014/05/23 职场文书
孩子教育的心得体会
2014/09/01 职场文书
公安机关查摆剖析材料
2014/10/10 职场文书
消防演习感想
2015/08/10 职场文书
80后创业总结的9条职场用人思想,记得收藏
2019/08/13 职场文书
基于Pygame实现简单的贪吃蛇游戏
2021/12/06 Python
Golang使用Panic与Recover进行错误捕获
2022/03/22 Golang