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 相关文章推荐
jQuery阻止同类型事件小结
Apr 19 Javascript
jQuery实现类似滑动门切换效果的层切换
Sep 23 Javascript
浅析JavaScript中的delete运算符
Nov 30 Javascript
JavaScript字符串对象replace方法实例(用于字符串替换或正则替换)
Oct 16 Javascript
javascript中数组方法汇总
Jul 07 Javascript
Angularjs全局变量被作用域监听的正确姿势
Feb 06 Javascript
Javascript的无new构建实例详解
May 15 Javascript
浅谈angular懒加载的一些坑
Aug 20 Javascript
JavaScript SHA-256加密算法详细代码
Oct 06 Javascript
详解React-Todos入门例子
Nov 08 Javascript
jQuery实现两个select控件的互移操作
Dec 22 Javascript
p5.js入门教程之平滑过渡(Easing)
Mar 16 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 咖啡文化
简单示例AJAX结合PHP代码实现登录效果代码
2008/07/25 PHP
PHP用mb_string函数库处理与windows相关中文字符及Win环境下开启PHP Mb_String方法
2015/11/11 PHP
php+mysql实现的二级联动菜单效果详解
2016/05/10 PHP
Thinkphp框架中D方法与M方法的区别
2016/12/23 PHP
JavaScript 判断浏览器类型及版本
2009/02/21 Javascript
JavaScript类库D
2010/10/24 Javascript
jquery.qrcode在线生成二维码使用示例
2013/08/21 Javascript
纯Javascript实现Windows 8 Metro风格实现
2013/10/15 Javascript
javascript的parseFloat()方法精度问题探讨
2013/11/26 Javascript
js 通用订单代码
2013/12/23 Javascript
JQuery给元素绑定click事件多次执行的解决方法
2014/05/29 Javascript
jquery背景跟随鼠标滑动导航
2015/11/20 Javascript
EasyUi中的Combogrid 实现分页和动态搜索远程数据
2016/04/01 Javascript
浅谈js的html元素的父节点,子节点
2016/08/06 Javascript
HTML中setCapture、releaseCapture 使用方法浅析
2016/09/25 Javascript
Javascript 实现计算器时间功能详解及实例(二)
2017/01/08 Javascript
JavaScript实现的鼠标响应颜色渐变效果完整实例
2017/02/18 Javascript
bootstrap+jQuery实现的动态进度条功能示例
2017/05/25 jQuery
jQuery remove()过滤被删除的元素(推荐)
2017/07/18 jQuery
jquery版轮播图效果和extend扩展
2017/07/18 jQuery
小程序实现搜索界面 小程序实现推荐搜索列表效果
2019/05/18 Javascript
python web框架学习笔记
2016/05/03 Python
利用Anaconda简单安装scrapy框架的方法
2018/06/13 Python
Python骚操作之动态定义函数
2019/03/26 Python
python使用 request 发送表单数据操作示例
2019/09/25 Python
详解用Pytest+Allure生成漂亮的HTML图形化测试报告
2020/03/31 Python
如何用Python和JS实现的Web SSH工具
2021/02/23 Python
加拿大领先的冒险和户外零售商:Atmosphere
2017/12/19 全球购物
澳大利亚在线批发商:Simply Wholesale
2021/02/24 全球购物
企业演讲稿范文大全
2014/05/20 职场文书
2015年公司新年寄语
2014/12/08 职场文书
2015元旦晚会主持人开场白+结束语
2014/12/14 职场文书
2015年端午节活动总结
2015/02/11 职场文书
高三化学教学反思
2016/02/22 职场文书
Python基本数据类型之字符串str
2021/07/21 Python