js算法初窥03(简单搜索及去重算法)

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

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<len; i++) {  //第一次循环
        isRepeat = false;
        for(var j=i+1; j<len; j++) {  //第二次循环
            if(array[i] === array[j]){
                isRepeat = true;
                break;
            }
        }
        if(!isRepeat){
            newArr.push(array[i]);
        }
    }
    return newArr;
};

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

  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、【 js 算法 】这么全的数组去重,你怕不怕?

    2、也谈JavaScript数组去重

    3、js数组去重

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

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

原文地址:https://www.cnblogs.com/zaking/p/9062185.html

时间: 2024-10-20 22:43:21

js算法初窥03(简单搜索及去重算法)的相关文章

js算法初窥02(排序算法02-归并、快速以及堆排序)

上一篇,我们讲述了一些简单的排序算法,其实说到底,在前端的职业生涯中,不涉及node.不涉及后台的情况下,我目前还真的没想到有哪些地方可以用到这些数据结构和算法,但是我在前面的文章也说过了.或许你用不到,但是,真的,如果你想要在前端领域有一个不错的发展.数据结构和算法一定是你的必修课.它不仅仅让你在处理问题的时候可以有一个思维底蕴,更重要的是,在遇到一些奇葩产品的时候,你可以和他PK到底!嗯,到底! 哈哈,开个小玩笑.咱们还是聊点有营养的.上一篇的算法比较简单,主内容就是循环,次内容就是比较.但

网页3D效果库Three.js初窥

网页3D效果库Three.js初窥 背景 一直想研究下web页面的3D效果,最后选择了一个比较的成熟的框架Three.js下手 ThreeJs官网 ThreeJs-github; 接下来我会陆续翻译 Three.js官网的文档,部分文字和代码为我个人添加. 第一部分:three.js介绍 创建场景 这部分的目标是为Three.js做一个简单的介绍,我们会以创建一个场景,一个旋转的立方里开始,文章的结尾会有一个可运行的完整示例为你解惑. 开始之前 在你使用Three.js之前,你需要在你的电脑上建

初窥ElasticSearch

初窥ElasticSearch 官网上面的,不知道讲的是什么.. youtube上面有一个start with,内容是在windows下面跑这个elastic search,然后用一个fidler工具可视化测试 https://www.youtube.com/watch?v=60UsHHsKyN4 粗略看起来,其实es和其他db没什么大区别,只是在搜索上有很多强大功能,所以很适合用在需要搜索的项目.貌似用curl发送一个JSON格式的数据(实际上是命令)到es就可以做CRUD elasticse

Flutter 即学即用系列博客——04 Flutter UI 初窥

前面三篇可以算是一个小小的里程碑. 主要是介绍了 Flutter 环境的搭建.如何创建 Flutter 项目以及如何在旧有 Android 项目引入 Flutter. 这一篇我们来学习下 Flutter 的 UI. 前言 说到 UI,我就简单说下 Flutter 作为一门跨平台语言具有的优势之一,提高效率吧. 举个例子: 假设现在要开发一个界面,Android 开发需要一天,iOS 开发也需要一天.那么就是两天. 如果你用 Flutter 开发,就只需要一天(因为 Android 和 iOS 都

Hadoop学习笔记(9) ——源码初窥

Hadoop学习笔记(9) ——源码初窥 之前我们把Hadoop算是入了门,下载的源码,写了HelloWorld,简要分析了其编程要点,然后也编了个较复杂的示例.接下来其实就有两条路可走了,一条是继续深入研究其编程及部署等,让其功能使用的淋漓尽致.二是停下来,先看看其源码,研究下如何实现的.在这里我就选择第二条路. 研究源码,那我们就来先看一下整个目录里有点啥: 这个是刚下完代码后,目录列表中的内容. 目录/文件 说明 bin 下面存放着可执行的sh命名,所有操作都在这里 conf 配置文件所在

[基础] AHK函数对象初窥 ① _实例2_实际可用版

;# 母文章 https://zhuanlan.zhihu.com/p/48977298;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; 脚本名称:函数对象初窥①_实例2 [直接可用版本] ; 脚本版本号 v0.2 ; AHK版本: 1.1.30 ; 语言:中文 ; 作者:心如止水<QQ:2531574300> <Autohotkey高手群(34

Scrapy 1.4 文档 01 初窥 Scrapy

初窥 Scrapy Scrapy 是用于抓取网站并提取结构化数据的应用程序框架,其应用非常广泛,如数据挖掘,信息处理或历史存档. 尽管 Scrapy 最初设计用于网络数据采集(web scraping),但它也可用于使用 API(如 Amazon Associates Web Services)提取数据或用作通用的网络爬虫. 爬虫(spider)示例 为了向您展示 Scrapy 带给您的是什么,我们将使用最简单的方式运行一个爬虫,向您展示一个 Scrape Spider 的例子. 这是一个爬虫的

Boost.ASIO简要分析-1 初窥

Boost.Asio是一个主要用于网络及底层I/O编程的跨平台C++库. 1. 初窥 Boost.Asio支持对I/O对象进行同步及异步操作. 1.1 同步操作 同步操作的事件顺序如下图所示: 1) 调用者调用I/O对象的connect函数开始连接操作,socket.connect(server_endpoint): 2) I/O对象将连接请求传递给io_service: 3) io_service调用操作系统函数: 4) 操作系统返回结果给io_service: 5) io_service将结

C++拾遗(二)——初窥标准库类型

本篇博文的开始,先介绍一道书上看到的智力题:有20瓶药丸,其中19瓶装有1克/粒的药丸,余下一瓶装有1.1克/粒的药丸.有一台称重精准的天平,只是用一次天平的情况下如何找出比较重的那瓶药丸? 好了,直接公布答案.从药瓶#1取出一粒药丸,从药瓶#2取出两粒,从药瓶#3取出三粒,依此类推.如果每粒药丸均重1克,则称得总重量为210克(1 + 2 + … + 20 = 20 * 21 / 2 = 210),“多出来的”重量必定来自每粒多0.1克的药丸.药瓶的编号可由算式(weight - 210 gr