vue 怎么样不重复往数组里插入数据_前端数据结构与算法(1) -二分查找vs二叉树...

c75b05a4b285f33ad1b980ef868efb30.png

今天给大家开始介绍前端方面的数据结构,刚把vue源码过完就开始数据结构,可见它的地位有多重要。有人说我一前端又不是后端学这个数据结构干嘛,好吧,只能说你还没有这个意识,一是面试很多大厂就会考察,我面试别人也会出一些简单算法题来做,以此考察逻辑能力以及js基础能力。二是当你写逻辑方面代码时候,明明可以一层for循环搞定,非要三层for循环,这里就凸显巧用数据结构的好处了。闲话不多说,直接上来二分搜索。

一 二分搜索

所谓二分查找,就是在有序表中,每次都让被查找数据与当前表的中间结点进行比较,根据比较结果“舍弃”掉以中间结点划分的某一半子表。

总结出来它的基本逻辑: 优先和数组的中间元素比较,如果等于中间元素,则直接返回。如果不等于则取半继续查找。

适用场景:假设现在有一个数组,数组中的数据按照某个关键字排好了序,现在我们希望判断某个数据是否已存在于数组中,怎么样做才更快?

总结出来它的适应场景: 数组 有序

基本二分查找有 非递归版本 和 递归版本

c59d8a0c019db65d1cf8dc648e315c42.png
非递归版本

da23fd047561f1156fc21df40b63d3bf.png
递归版本

由上的方法我们可以总结出二分查找的几个特点:

1 每次我们都将表的大小减半,也就是除以二 ;

2 最坏情况下我们要一直“除以2”直到表只剩下一个元素;

3 二分查找花费的时间关键点就是比较了多少次,而比较的次数在最坏情况下就是表的大小n不断除以2直至n为1的次数。这样以来我们很快就能得出二分查找的时间复杂度:O(log2N) ;

那如果我们想要表的大小能够动态的变化,并且数据具有层级用什么来表示呢?没错,二叉树。

8defd6630594ff0db7e565175b20d873.png

在树结构中,每一个结点只有一个前件,称为父结点,没有前件的结点只有一个,称为树的根结点,简称树的(root)。每一个结点可以有多个后件,称为该结点的子结点。没有后件的结点称为叶子结点。一个结点所拥有的子结点的个数称为该结点的度,所有结点中最大的度称为树的度。树的最大层次称为树的深度。

同时,我们还可以看到一些基本的树的特点:

每个节点的键值大于左孩子,每个节点的键值大于右孩子。以左右孩子为根的子树仍然为二分搜索树。

759b39223b0347e661b3b451e8fcbd7b.png

二叉树是一种特殊的树,它的子节点个数不超过两个,且分别称为该结点的左子树(left subtree)与右子树(right subtree),二叉树常被用作二叉查找树和二叉堆或是二叉排序树(BST)。

二 二叉树的插入

那么现在我们就用javascript来时实现一个简单的二叉搜索树。

首先我们创建一个Node类,用于存放树的节点。首先要添加新的节点,首先需要创建一个Node对象,将数据传入该对象。 其次要检查当前的BST树是否有根节点,如果没有,那么表示是一棵新数,该节点就为该树的根节点,那么插入这个过程就结束了;否则,就要继续进行下一步了。 如果待插入节点不是根节点,那么就必须对BST进行遍历,找到合适的位置。该过程类似遍历链表,用一个变量存储当前节点,一层一层遍历BST,算法如下:

  1. 设值当前节点为根节点
  2. 如果待插入节点保存的数据小于当前节点,则新节点为原节点的左节点,反之,执行第4步
  3. 如果当前节点的左节点为null,就将新节点放到这个位置,退出循环;反之,继续执行下一次循环
  4. 设置新节点为原节点的右节点
  5. 如果当前节点的右节点为null,就将新节点放到这个位置,退出循环;反之,继续执行下一次循环

这样,就能保证每次添加的新节点能够放到正确的位置上.

72b149751b6d04c715060faa342fd904.png
三 二插树的查找

查找通常分为三种情况 查找最小值 查找最大值 查找定值

1 查找定值:

cf2f6a27af2294bb35809547090963ed.png

如果找到就返回该值,未找到就返回null;

2 查找最小值

5f398b7b5e7a903528f25841f7ae59d3.png

3 查找最大值

e62faf57936010106f9f8ab52e7f6f07.png

三 二叉树 的循环遍历

循环遍历分为 前序遍历 中序遍历 后序遍历

我们首先构造一个树

93afd8a85283adc0ef90be4cf0d9d4ac.png

daad87daf2abbf2c7ebed82ddaa0bb65.png

1 前序遍历

e9a095b2c183ff9271206aa7574c5a97.png

e0ffa5e10a3067d7230031bafb20ab58.png

2 中序遍历

3560c2254c9d2e2b4de7fda11ae5c934.png

3 后序遍历

51c211f94223de658b0a34d4c88d1694.png

4 广度优先遍历

6788c9b7e0010882f43a6f7bca57227b.png

四 二叉树 删除节点

删除节点的思路大致如下:

首先判断当前节点是否包含待删除的数据,如果包含,则删除该节点;如果不包含,则比较当前节点上的数据和待删除树的的大小关系。如果待删除的数据小于当前节点的数据,则移至当前节点的左子节点继续比较;如果大于,则移至当前节点的右子节点继续比较。 如果待删除节点是叶子节点(没有子节点),那么只需要将从父节点指向它的链接指向变为null; 如果待删除节点含有一个子节点,那么原本指向它的节点需要做调整,使其指向它的子节点; 最后,如果待删除节点包含两个子节点,可以选择查找待删除节点左子树上的最大值或者查找其右子树上的最小值,这里我们选择后一种。

dea78a2f6084eb66cc0fb54d9d8be47b.png

57a6d199f368acbc2b999609e5259268.png

至此,我们基本操作方法已经分析完了,快来动手实践下吧。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/557681.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MongoDB出错:ERROR: child process failed, exited with error number 1 To see additional infor

linux中安装mongoDB之后,启动不了,出现下边的错误,网上搜原因,很多说需要删除.lock文件,需要bin/mongod --repair修复,但是都不成功,最后发现是配置文件中路径问题。 [rootwqd mongodb]# bin/m…

js中立即执行函数会预编译吗_作为前端你了解JavaScript运行机制吗?

作为前端工程师,大家都知道js是前端一开始就要学会的知识点,js的代码你会写了,那js的运行机制你了解吗?只有了解了js的运行机制,才能在工作中如鱼得水,今天就跟随珠峰的老师一起来了解下js的运行机制吧。Ja…

nfine框架 上传文件_MVC之Struts2框架--你并不了解的高级应用

《“爱读书”--给你讲技术》,我来看书,你来进步,让我们开始吧!本书简介书名为《轻量级JavaEE企业应用实战》,是本人在学习JavaEE框架的时候阅读的第一本书,本书对于框架及相关基础知识讲述的比较详细和浅显…

阿里云服务器ping不通解决办法

阿里云服务器ping不通解决办法 阿里云服务器ping不通解决办法(云服务器搭建完环境访问不了ip解决办法) 问题:这里的服务器我以阿里云为例最近搞服务器,然后Ubuntu16.04下搭建LAMP环境后发现输入ip(http://1XX.XX.XX.…

java移动端接口测试_走进Java接口测试之测试框架TestNG数据驱动(入门篇)

前言我们在前面的文章中,和大家分享过接口自动化测试一些基本的实现方法,但是,你很快就会发现,如果在测试脚本中硬编码测试数据的话,测试脚本灵活性会非常低。而且,对于那些具有重复的请求,而只…

Windows更新右下角出现 天气温度等提示,如何取消

Windows更新后出现桌面下面出现 天气温度等提示,如何取消 解决:点击鼠标右键

经济专业为什么学python_既然有了会计学专业,为什么还要有税收学专业?

很多人说会计学也学税务知识,税务局招收公务员也面向会计,税务师事务所也招会计专业,那还有设置税收学专业的必要吗?按照国际通用说法,税收学只是会计学的组成部分,也可以说是一个方向,考会计师…

解决MongoDB Compass

远程连接mongoDB踩过的坑 我使用的是阿里云的服务器,用在服务器上安装完mongoDB之后,使用mongoDB Compass远程连接,连接不上。防火墙27017端口开放了,阿里云安全组27017端口也开放了,还是无法成功。 最后发现ping我的…

预测回归_回归分析预测技术简介

回归分析的基本概念是用一群变量预测另一个变量的方法。通俗点来讲,就是根据几件事情的相关程度来预测另一件事情发生的概率。回归分析的目的是找到一个联系输入变量和输出变量的最优模型。回归方法有许多种,可通过 3 种方法进行分类:自变量的…

【MongoDB 工具篇】MongoDB Compass介绍与简单使用

MongoDB Compass 是一款GUI工具,用于对MongoDB进行简单管理。 1 软件环境 使用的软件分别为: MongoDB Compass 1.19.12 MongoDB 4.2.0 2 软件介绍 2.1 连接到主机界面 安装完MongoDB Compass后,打开软件,进入连接到主机界面…

计算机网络—一个自治系统有5个局域网,其连接图如图所示。LAN2至LAN5上的主机数分别为:91,150,3,15。该自治系统分配到的IP地址块为30.138.118/23。试给出每一个局域网的地址块

计算机网络:一个自治系统有5个局域网,其连接图如图所示。LAN2至LAN5上的主机数分别为:91,150,3,15。该自治系统分配到的IP地址块为30.138.118/23。试给出每一个局域网的地址块(包括前缀&#xf…

取消语法检测_中考取消了考纲,学生要如何得高分

日前,教育部宣布取消初中学业水平考试大纲。对于广州的考生而言,意味着中考考纲取消。连日来,这一消息引发了学生、家长、老师们的巨大关注。为此,广州日报邀请了广州大学附属中学语文一级教师王琪、数学高级教师罗剑文以及广州广…

某公司为本科以上学历的人重新分配工作,分配原则如下。 (1)如果年龄不满18岁,学历是本科,男性要求报考研究生,女性则担任行政工作; (2)如果年龄满18岁不满5o 岁,学历本科,不分男女,任中层领导

软件测试——决策表 10.某公司为本科以上学历的人重新分配工作,分配原则如下。 (1)如果年龄不满18岁,学历是本科,男性要求报考研究生,女性则担任行政工作; (2)如果年龄满18岁不满5o 岁,学历本科,不分男女&…

.某学校的学生公寓有14栋楼,用A~N这14个大写字母的其中一个代表楼号,每栋楼的层数为6层,用1~6六个数字表示。每层楼有40个房间,编号为01~40。具体表示一个宿舍房间时,用1个字母加3位数字表

软件测试——等价类划分法 1.某学校的学生公寓有14栋楼,用A~N这14个大写字母的其中一个代表楼号,每栋楼的层数为6层,用1~6六个数字表示。每层楼有40个房间,编号为01~40。具体表示一个宿舍房间时…

如何免费下载和安装Windows 11

微软今天放出了 Windows 11 Build 22000.51 预览版,如果你想要尝鲜或者冒险,那么本文分享如何免费下载和安装 Windows 11 的小技巧。再次需要提醒的是,目前 Windows 11 系统极不稳定,充斥着大量 BUG,可能会导致系统崩溃…

北大青鸟消防控制器组网_北大青鸟JBF-61S20防火门监控器控制器接线示意图

北大青鸟JBF-61S20防火门监控器控制器接线示意图一,北大青鸟JBF-61S20防火门监控器控制器接线示意图功能防火门控制及状态 监测功能手动、自动关闭常开防火门;实时监控常开或常闭防火门的状态信息,并进行上报和显示。联网功能监控器可以与青鸟…

sqlserver发布订阅无法初始化快照_SQLServer2008R2 发布订阅及相关问题解决办法

前言:前两天接到领导的任务,将一个系统A的客户数据同步到另一个系统B中,以后客户录入入口只有A系统,B系统不提供录入入口,因为各种原因不能使用接口方式A系统和B系统直接交互同步,只能通过数据库重A库同步到…

怎么在linux上修改mysql端口映射_如何在Linux中更改默认的MySQL / MariaDB端口

在本指南中,我们将学习如何更改MySQL / MariaDB数据库在CentOS 7和基于Debian的Linux发行版中绑定的默认端口。 MySQL数据库服务器在Linux和Unix下运行的默认端口是3306 / TCP 。为了在Linux中更改默认的MySQL / MariaDB数据库端口,请通过执行以下命令打…

hashmap为什么线程不安全_StringBuilder为什么线程不安全?

点击上方“Java知音”,选择“置顶公众号”技术文章第一时间送达!作者:千山juejin.im/post/5d6228046fb9a06add4e37fe引言面试官:StringBuilder和StringBuffer的区别在哪?我:StringBuilder不是线程安全的&am…

JAVA中的那些名词解释

1.JDO: (Java Data Object )是Java对象持久化的新的规范,也是一个用于存取某种数据仓库中的对象的标准化API.作用:用于存取某种数据仓库中的对象 2.JPA: JPA是Java Persistence API的简称,中文名Java持久层API,是JDK 5.0注解或XML描述对象&a…