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 相关文章推荐
[全兼容哦]--实用、简洁、炫酷的页面转入效果loing
May 07 Javascript
IE8 原生JSON支持
Apr 13 Javascript
javascript 隐藏/显示指定的区域附HTML元素【legend】用法
Mar 05 Javascript
js继承的实现代码
Aug 05 Javascript
jquery offset函数应用实例
Nov 14 Javascript
js实现有时间限制消失的图片方法
Feb 27 Javascript
使用 JavaScript 进行函数式编程 (一) 翻译
Oct 02 Javascript
全面了解函数声明与函数表达式、变量提升
Aug 09 Javascript
Jquery调用iframe父页面中的元素及方法
Aug 23 Javascript
JS判断一个数是否是水仙花数
Jun 11 Javascript
js实现文字列表无缝滚动效果
Jun 23 Javascript
Windows下Node.js安装及环境配置方法
Sep 18 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
php中$_SERVER[PHP_SELF] 和 $_SERVER[SCRIPT_NAME]之间的区别
2009/09/05 PHP
让PHP更快的提供文件下载的代码
2012/06/13 PHP
PHP中PDO连接数据库中各种DNS设置方法小结
2016/05/13 PHP
thinkphp分页实现效果
2016/10/13 PHP
PHP ElasticSearch做搜索实例讲解
2020/02/05 PHP
JQuery触发事件例如click
2013/09/11 Javascript
js获取某元素的class里面的css属性值代码
2014/01/16 Javascript
IE6-8中Date不支持toISOString的修复方法
2014/05/04 Javascript
jQuery插件Elastislide实现响应式的焦点图无缝滚动切换特效
2015/04/12 Javascript
jQuery实现的分页功能示例
2017/01/22 Javascript
jQuery插件artDialog.js使用与关闭方法示例
2017/10/09 jQuery
加载 vue 远程代码的组件实例详解
2017/11/20 Javascript
浅谈webpack-dev-server的配置和使用
2018/05/17 Javascript
JavaScript反射与依赖注入实例详解
2018/05/29 Javascript
灵活使用console让js调试更简单的方法步骤
2019/04/23 Javascript
Python读取和处理文件后缀为.sqlite的数据文件(实例讲解)
2017/06/27 Python
windows下python虚拟环境virtualenv安装和使用详解
2019/07/16 Python
Python3实现zip分卷压缩过程解析
2019/10/09 Python
基于python实现微信好友数据分析(简单)
2020/02/16 Python
python requests包的request()函数中的参数-params和data的区别介绍
2020/05/05 Python
使用keras时input_shape的维度表示问题说明
2020/06/29 Python
python爬虫看看虎牙女主播中谁最“顶”步骤详解
2020/12/01 Python
Python中BeautifulSoup通过查找Id获取元素信息
2020/12/07 Python
伯利陶器:Burleigh Pottery
2018/01/03 全球购物
Spartoo美国:欧洲排名第一的在线时装零售商
2019/12/12 全球购物
志愿者服务感言
2014/02/27 职场文书
中式结婚主持词
2014/03/14 职场文书
环境日宣传活动总结
2014/07/09 职场文书
金融管理专业求职信
2014/07/10 职场文书
新党章心得体会
2014/09/04 职场文书
典型事迹材料范文
2014/12/29 职场文书
西部计划志愿者工作总结
2015/08/11 职场文书
2019年七夕情人节浪漫祝福语大全!
2019/08/08 职场文书
总结Python变量的相关知识
2021/06/28 Python
MyBatis核心源码深度剖析SQL语句执行过程
2022/05/20 Java/Android
Mysql如何查看是否使用到索引
2022/12/24 MySQL