博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
js算法初窥03(搜索及去重算法)
阅读量:6442 次
发布时间:2019-06-23

本文共 2842 字,大约阅读时间需要 9 分钟。

  前面我们了解了一些常用的排序算法,那么这篇文章我们来看看搜索算法的一些简单实现,我们先来介绍一个我们在实际工作中一定用到过的搜索算法——顺序搜索。

1、顺序搜索

  其实顺序搜索十分简单,我们还是以第一篇文章写好的架子作为基础,在其中加入顺序搜索的方法:

//顺序搜索this.sequentialSearch = function(item) {    for(var i = 0; i < array.length; i++) {        if(item === array[i]) {            return i;        };    };    return -1;};

  我想这个代码没什么好说的。你一定能理解的十分透彻。那么下面我们来看看二分搜索。

2、二分搜索

  我们先来做一个简单的游戏。想象一个场景,我们在聚会,大约有7、8个人,这个时候有人提议我们来做个游戏吧。我来想一个1到100的数字,你们来猜数字是什么,我会依照我想的数字告诉你们猜测的数字是比我脑海中的数字大了还是小了。这就是二分搜索。

  与顺序搜索不同的是,二分搜索需要在搜索之前对要搜索的数组排序。我们来看下代码:

//二分搜索this.binarySearch = function(item) {    //先对数组进行快速排序    this.quickSort();    //low和high是边界指针,也就是item是高了还是低了的表示,mid是我们数组的中间索引变量,element则是对应的mid的元素    var low = 0,high = array.length - 1,mid,element;    //如果low小于等于high说明边界范围是合理的。    while(low <= high) {        //为mid和element变量赋值。        mid = Math.floor((low + high) / 2);        element = array[mid];        // 如果中间值比我们要找的元素小,说明item在中间值的右侧,要注意我们的数组时排序过后的数组了。        // 所以我们直接让等于0的low的值设置为mid+1,因为item>element,所以item必然在mid+1开始到high的区间范围内。        // 下同。        if(element < item) {            low = mid + 1;        } else if(element > item) {            high = mid - 1;        } else {            return mid;        };    };    return -1;};

   其实二分搜索也并不难,看代码和注释就一定可以看懂的。感觉这篇内容实在是不太多,所以我决定再加入一些其他的内容吧。

3、去重

  想必大家在面试中被问到过最多的问题就是排序和去重了吧。其实这个东西真的算是老生常谈了,但是却又有它存在的必要,其实说到底,去重更重要的是思想,而不是实现,就跟前面我们学过的和算法一样。

  下面我们就介绍一下去重的一些实现方法吧。

  1)set方法

    set是ES6新增的一种数据结构——集合,我在前面的有关集合的章节中也介绍过这种数据结构,集合是一种不允许重复的数据存在的数据结构,我们刚好可以利用这种特性来为数组去重。如果你还不了解set数据结构,可以去或者查看。

this.uniqueSetWay = function () {    //array.form方法从类似数组或可迭代对象中创建一个新的数组实例    var set = new Set(array);    return Array.from(set);};//测试方法var repeatArray = new ArrayList();repeatArray.insert(1);repeatArray.insert(1);repeatArray.insert(3);repeatArray.insert(3);repeatArray.insert(5);repeatArray.insert(7);repeatArray.insert(7);repeatArray.insert(9);repeatArray.insert(9);repeatArray.insert(8);console.log(repeatArray.uniqueSetWay())

    要注意的是,我们这里仍旧使用了所构建的数组类。

  2)双循环

//双循环this.uniqueDoubleCycle = function () {     var newArr = [];    var len = array.length;    var isRepeat;      for(var i=0; i

    这种方法使用了双重循环设置一个标记位,确定我们加入新数组的元素是否是重复的,代码很好理解,但是这是效率最低的实现方式。

  3)排序辅助去重

//利用排序算法来辅助判断this.sortUnique = function () {    var newArr = [];                       this.quickSort();     //将原数组中的第一项放入新数组      var newArr = [array[0]];      // 我们来循环比较      for(var i = 1; i < array.length; i++){          //如果新数组中的最后一项与array[i]不想等,那么我们就把它加入新数组。        if(array[i] !== newArr[newArr.length - 1]){             newArr.push(array[i]);            }      }          return newArr;};

    我们就简单的介绍这三种去重方法,其实有关于去重的实现有很多种,如果大家想要继续学习有关去重的一些内容,我这里给大家贴上几篇不错的文章。这里就不再多说。

    1、

    2、

    3、

    当然,有关数组去重的文章远不止这些,只是个人觉得这些内容还不错。本文中的代码也是借鉴于此。那么本文到这里也就差不多结束了,下面会和大家一起学习一下算法模式(递归、动态规划等)。

 

  最后,由于本人水平有限,能力与大神仍相差甚远,若有错误或不明之处,还望大家不吝赐教指正。非常感谢!

一只想要飞得更高的小菜鸟

转载地址:http://xpcwo.baihongyu.com/

你可能感兴趣的文章
Windows Server 2012版本介绍
查看>>
Bossies 2015: The Best of Open Source Software Awards
查看>>
Linux ORACLE RAC 10201升级10203
查看>>
VSFTP通讯原理与搭建详解
查看>>
ext3grep
查看>>
【SCVMM2008R2添加主机】之二
查看>>
10分钟内快速部署Windows 7
查看>>
docker 构建magent的memcached 集群
查看>>
[LNMP]Nginx默认虚拟主机
查看>>
Oracle内部错误:ORA-00600[13013][5001]故障诊断一例
查看>>
Performance Snapshot and collect VMware support log bundle by command
查看>>
计算器、tuple操作、dict、其他常用操作
查看>>
永动机之永动机的客观存在
查看>>
38_泛型的通配符扩展应用
查看>>
Script:列出数据库中5%以上链式行的表
查看>>
Nginx+keepalived安装
查看>>
cisco数据中心理论小记-4
查看>>
【NetApp】aggr snapshot autodelete_base解释
查看>>
如何用命令加入域和退出域
查看>>
你见过js画出这样的矢量图以及动画特效吗?
查看>>