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 相关文章推荐
asp批量修改记录的代码
Jun 25 Javascript
js使用removeChild方法动态删除div元素
Aug 01 Javascript
JavaScript获取元素尺寸和大小操作总结
Feb 27 Javascript
jquery+ajax请求且带返回值的代码
Aug 12 Javascript
浅谈javascript中的call、apply、bind
Mar 06 Javascript
JS使用单链表统计英语单词出现次数
Jun 16 Javascript
JS跨域请求外部服务器的资源
Feb 06 Javascript
vue项目部署上线遇到的问题及解决方法
Jun 10 Javascript
node.js爬取中关村的在线电瓶车信息
Nov 13 Javascript
Vue.js中的组件系统
May 30 Javascript
基于element-ui封装表单金额输入框的方法示例
Jan 06 Javascript
字节飞书面试promise.all实现示例
Jun 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
PHP操作XML作为数据库的类
2010/12/19 PHP
PHP的可变变量名的使用方法分享
2012/02/05 PHP
php curl的深入解析
2013/06/02 PHP
php读取文件内容的三种可行方法示例介绍
2014/02/08 PHP
php+memcache实现的网站在线人数统计代码
2014/07/04 PHP
[原创]php获取数组中键值最大数组项的索引值
2015/03/17 PHP
PHP封装的HttpClient类用法实例
2015/06/17 PHP
php生成毫秒时间戳的实例讲解
2017/09/22 PHP
详解PHP字符串替换str_replace()函数四种用法
2017/10/13 PHP
javascript中动态加载js文件多种解决办法总结
2013/11/15 Javascript
通过隐藏iframe实现文件下载的js方法介绍
2014/02/26 Javascript
js实现iPhone界面风格的单选框和复选框按钮实例
2015/08/18 Javascript
JavaScript实现简单获取当前网页网址的方法
2015/11/09 Javascript
基于jquery实现全屏滚动效果
2015/11/26 Javascript
jQuery定义插件的方法
2015/12/18 Javascript
jQuery轮播图效果精简版完整示例
2016/09/04 Javascript
详细总结Javascript中的焦点管理
2016/09/17 Javascript
js+canvas实现动态吃豆人效果
2017/03/22 Javascript
vue数据传递--我有特殊的实现技巧
2018/03/20 Javascript
layui 监听select选择 获取当前select的ID名称方法
2019/09/24 Javascript
微信小程序使用echarts获取数据并生成折线图
2019/10/16 Javascript
判断JavaScript中的两个变量是否相等的操作符
2019/12/21 Javascript
Python实现把回车符\r\n转换成\n
2015/04/23 Python
详解Python中表达式i += x与i = i + x是否等价
2017/02/08 Python
python实现将一个数组逆序输出的方法
2018/06/25 Python
python之拟合的实现
2019/07/19 Python
Python Opencv提取图片中某种颜色组成的图形的方法
2019/09/19 Python
爬虫代理的cookie如何生成运行
2020/09/22 Python
优秀中专生推荐信
2013/11/17 职场文书
送餐员岗位职责范本
2014/02/21 职场文书
副董事长岗位职责
2014/04/02 职场文书
机械设计及其自动化专业求职信
2014/06/09 职场文书
清明节网上祭英烈寄语2015
2015/03/04 职场文书
2015年小学中秋节活动总结
2015/03/23 职场文书
《蟋蟀的住宅》教学反思
2016/02/17 职场文书
Li list-style-image 图片垂直居中实现方法
2023/05/21 HTML / CSS