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

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数组去重

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

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

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

  1. js算法初窥03(搜索及去重算法)

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

  2. js算法初窥05(算法模式02-动态规划与贪心算法)

    在前面的文章中(js算法初窥02(排序算法02-归并.快速以及堆排)我们学习了如何用分治法来实现归并排序,那么动态规划跟分治法有点类似,但是分治法是把问题分解成互相独立的子问题,最后组合它们的结果,而 ...

  3. js算法初窥07(算法复杂度)

    算法复杂度是我们来衡量一个算法执行效率的一个度量标准,算法复杂度通常主要有时间复杂度和空间复杂度两种.时间复杂度就是指算法代码在运行最终得到我们想要的结果时所消耗的时间,而空间复杂度则是指算法中用来存 ...

  4. js算法初窥01(排序算法01-冒泡、选择、插入)

    排序,我想大家一定经历过或者正在经历着.或许你不懂算法,对排序算法一无所知,但是你一定用过一些第三方库的api来一键排序,那么,在你享受便捷的同时,你是否想过它的底层是如何实现的?这样的算法实现方式是 ...

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

    上一篇,我们讲述了一些简单的排序算法,其实说到底,在前端的职业生涯中,不涉及node.不涉及后台的情况下,我目前还真的没想到有哪些地方可以用到这些数据结构和算法,但是我在前面的文章也说过了.或许你用不 ...

  6. js算法初窥04(算法模式01-递归)

    终于来到了有点意思的地方--递归,在我最开始学习js的时候,基础课程的内容就包括递归,但是当时并不知道递归的真正意义和用处.我只是知道,哦...递归是自身调用自身,递归要记得有一个停止调用的条件.那时 ...

  7. js算法初窥06(算法模式03-函数式编程)

    在解释什么是函数式编程之前,我们先要说下什么是命令式编程,它们都属于编程范式的一种.命令式编程其实就是一块一块的代码,其中包括了我们要执行的逻辑或者判断或者一些运算.也就是按部就班的一步一步完成我们所 ...

  8. 数据挖掘经典算法PrefixSpan的一个简单Python实现

    前言 用python实现了一个没有库依赖的"纯" py-based PrefixSpan算法. Github 仓库 https://github.com/Holy-Shine/Pr ...

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

    网页3D效果库Three.js初窥 背景 一直想研究下web页面的3D效果,最后选择了一个比较的成熟的框架Three.js下手 ThreeJs官网 ThreeJs-github; 接下来我会陆续翻译 ...

随机推荐

  1. zookeeper+kafka集群安装之二

    zookeeper+kafka集群安装之二 此为上一篇文章的续篇, kafka安装需要依赖zookeeper, 本文与上一篇文章都是真正分布式安装配置, 可以直接用于生产环境. zookeeper安装 ...

  2. OAF更改动态头行

    选择头信息,动态刷新行信息.本文将详细介绍该种需求的做法. 本例沿用<OAF-头行结构>的am与vo,所以在进行本例之前,请先完成<OAF-头行结构> 一.创建页面 在test ...

  3. ERP-非财务人员的财务培训教(一.二)------财务基础知识

    二.基本财务管理知识 第一节 财务管理基础知识(一) 财务与会计的关系 会计的基础知识 (一) 财务与会计的关系 财务与会计的内涵 1.会计 会计工作主要是解决三个环节的问题: 会计凭证 会计账簿 会 ...

  4. nfc近场通信

    NFC简介: Near Field Communication 近场通信,是一种数据传输技术. 与wifi.蓝牙.红外线等数据传输技术的一个主要差异就是有效距离一般不能超过4cm. NFC支持3种工作 ...

  5. PHP开发环境apache搭建

    首先我们先来了解一下PHP的一些相关的基础知识: PHP是啥? php其实就是超文本预处理程序,一种制作网站的脚本程序. 通常PHP的运行环境有以下两种: wamp  windows+apache+m ...

  6. Mac OS X下64位汇编与Linux下64位汇编的一些不同

    1 首先系统调用号大大的不同:mac64和linux32的系统调用号也不同(虽然局部可能有相同) 2 mac64的系统调用号在: /usr/include/sys/syscall.h 可以查到,但是调 ...

  7. LeetCode(62)-Two Sum

    题目: Given an array of integers, return indices of the two numbers such that they add up to a specifi ...

  8. WebStorm常用快捷键总结

    在使用WebStorm的过程中,常用快捷键整理: 1.  必备快捷键 Ctrl+/:注释当前行 Ctrl+Shift+/:当前位置插入注释 Ctrl+Alt+/:块注释,并Focus到首行,写注释说明 ...

  9. OpenNMS安装手册

    一. 系统需求Windows Server 2008 R2 SP1 64位JDK 8 update 5 for Windows 64位PostgreSQL 9.3.5 for Windows 64位O ...

  10. sql中的case when then else end

    hive中的case when的用法举例 select * from (select id, count(distinct ] in ("Virus","Worm&quo ...