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

一 二分搜索

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

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

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

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

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

非递归版本
递归版本

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

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

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

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

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

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

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

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

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

二 二叉树的插入

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

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

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

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

三 二插树的查找

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

1 查找定值:

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

2 查找最小值

3 查找最大值

三 二叉树 的循环遍历

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

我们首先构造一个树

1 前序遍历

2 中序遍历

3 后序遍历

4 广度优先遍历

四 二叉树 删除节点

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

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

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

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

  1. vue 怎么样不重复往数组里插入数据_Vue.js在数组中插入重复数据的实现代码分享...

    1.在默认的情况下,Vue.js默认不支持往数组中加入重复的数据.可以使用track-by="$index"来实现. 2.不使用track-by="$index" ...

  2. C语言在一个有序数组里插入一个元素,使其成为一个新的有序数组

    C语言在一个有序数组里插入一个元素,使其成为一个新的有序数组 #include<stdio.h> int main(){int a[11] = { 1,5,8,9,25,26,31,35, ...

  3. 常见数据结构和算法实现(排序/查找/数组/链表/栈/队列/树/递归/海量数据处理/图/位图/Java版数据结构)

    常见数据结构和算法实现(排序/查找/数组/链表/栈/队列/树/递归/海量数据处理/图/位图/Java版数据结构) 数据结构和算法作为程序员的基本功,一定得稳扎稳打的学习,我们常见的框架底层就是各类数据 ...

  4. javascript数据结构与算法---检索算法(二分查找法、计算重复次数)

    javascript数据结构与算法---检索算法(二分查找法.计算重复次数) /*只需要查找元素是否存在数组,可以先将数组排序,再使用二分查找法*/ function qSort(arr){if (a ...

  5. c语言判断数组里的数据先递增后递减,查找两个有序序数组(一个递增、一个递减)中第K大的数...

    题目不难,关键是边界条件要想清楚.先写一个时间复杂度为O(K) 的解法. #include using namespace std; //a[] increase //b[] decrease //u ...

  6. influxdb 插入数据_脚本采集数据插入到influxdb数据库里

    #!/bin/bash # 定时收集java服务metrics # curl http://10.7.16.42:6301/metrics demo # 参数: post_influxdb_write ...

  7. 算法【二分查找】(数组)

    1 .山脉数组的巅峰索引 信息 我们把符合下列属性的数组 A 称作山脉: A.length >= 3 存在 0 < i < A.length - 1 使得A[0] < A[1] ...

  8. mysql怎样循环插入数据_你向 Mysql 数据库插入 100w 条数据用了多久?

    多线程插入(单表) 多线程插入(多表) 预处理SQL 多值插入SQL 事务(N条提交一次) 多线程插入(单表) 问:为何对同一个表的插入多线程会比单线程快?同一时间对一个表的写操作不应该是独占的吗? ...

  9. 怎样在数组末尾添加数据_如何利用C++实现可变长的数组?

    应该执行什么功能? 假设我们要实现一个将自动扩展的数组类,是否需要实现函数?让我们从下面主要功能使用的功能开始,看看我们需要实现哪些功能. 输出结果: 0 1 2 3 4 0 1 2 100 4 您需 ...

最新文章

  1. 2014/Province_Java_B/2/调和级数
  2. 支持java虚拟主机_为何缺乏支持Java的虚拟主机
  3. IntelliJ IDEA统计项目代码行数
  4. 光流(八)--总结篇
  5. 设置电脑右下角显示自己的大名
  6. 编程实现对率回归,并给出西瓜数据集 3.0α 上的结果.
  7. “酷我音乐”借“大数据”名义 恐已窥探并收集用户隐私长达数年
  8. java实现断点续播_哪些播放器有断点续播和定点播放功能?
  9. python实现税后工资_Python实现扣除个人税后的工资计算器示例
  10. ROS从入门到精通3-5:blender机器人模型定制皮肤贴图
  11. 免费配音软件哪个好?快把这些软件收好
  12. jsp+ssm计算机毕业设计智能视频推荐网站【附源码】
  13. 15-面向对象的程序设计--no
  14. 利用selenium携带cookies实现免登录
  15. Netty案例(二)之耗时任务的处理
  16. mysql 漏洞 wa_[漏洞案例]thinkcmf 2.x从sql注入到getshell实战
  17. 杭电2017单人排位赛2-B魔法宝石
  18. list redis 怎样做排行_Redis中5种数据结构的使用场景介绍
  19. Java内功修炼系列:代理模式及动态代理
  20. ui设计移动端字体适配_JavaScript之独立使用lib-flexible.js适配移动端UI设计750px设计图...

热门文章

  1. oracle中dbms_DBMS中的实例和架构
  2. ruby hash方法_Ruby中带有示例的Hash.keys方法
  3. 双重检查锁,原来是这样演变来的,你了解吗
  4. python基本的信号与槽函数的使用 信号发射 槽函数接收
  5. MFC中CString类字符串与长整型、浮点型、字符数组char数据之间的相互转换
  6. docker 创建容器报: Error response from daemon: C: drive is not shared.
  7. 智能指针分配动态数组
  8. php模板意思,php中的 是什么意思
  9. linux软件中心替代,Ubuntu 16.04 LTS 将替换 Ubuntu 软件中心
  10. 基于jmx监控kafka_0542-6.1.0-非安全环境下Kafka管理工具Kafka Eagle安装使用