首页
学习
活动
专区
工具
TVP
发布

我是攻城师

专栏作者
492
文章
956642
阅读量
119
订阅数
5分钟轻松理解二叉树的深度遍历策略
我们知道普通的线性数据结构如链表,数组等,遍历方式单一,都是从头到尾遍历就行,但树这种数据结构却不一样,我们从一个节点出发,下一个节点却有可能遇到多个分支路径,所以为了遍历树的全部节点,我们需要借助一个临时容器,通常是栈这种数据结构,来存储当遇到多个分叉路径时的,存暂时没走的其他路径,等走过的路径遍历完之后,再继续返回到原来没走的路径进行遍历,这一点不论在递归中的遍历还是迭代中的遍历中其实都是一样的,只不过递归方法的栈是隐式的,而我们自己迭代遍历的栈需要显式的声明。
我是攻城师
2019-07-08
9290
深入理解Trie树
前面的文章介绍过各种高效的的数据结构,比如二叉搜索树,AVL树,红黑树,B树,跳跃表等,今天我们再来学习一种多路树,叫做Trie树。
我是攻城师
2019-06-03
1.9K0
深入理解什么是B树?
前面的文章,我们已经介绍过其他的几种高级的动态数据结构,典型如红黑树,跳跃表等,今天我们再来学习另外一种高级数据结构B树,我们知道树的查询时间复杂度和其树的高度有直接关系,当我们向红黑树里面插入大量的数据时,有两个问题:
我是攻城师
2019-05-14
4.8K0
深入理解什么是跳跃表
前面的文章我们学习了性能高效的基于二叉搜索树的动态数据结构红黑树,其平均时间复杂度为O(logN),今天我们再来学习另外一种优秀的数据结构跳跃表,其综合性能与红黑树一样,而且功能更强大,从某种意义上来说是可以替代红黑树的。
我是攻城师
2019-05-07
2.5K0
什么是二叉搜索树
二叉搜索树是一种综合效率比较好的一种数据结构,搜索、插入、删除的复杂度等于树高, 平均空间复杂度为O(n),时间复杂度为O(log n),最坏时间复杂度为O(n),(当插入的数列有序,导致二叉树退化为线性表),故一些其他的树,在二叉搜索树基础上进行改良的平衡树,如AVL树、红黑树等,可以使得树的高度总是得到平衡,从而使得最坏的情况下,时间复杂度也能达到O(log n)。
我是攻城师
2019-04-28
9900
还分不清楚一些二叉树种类和概念?
刚接触二叉树的学习的时候,相信很多人可能会被二叉树各种各样的叫法和概念给绕晕了,今天就来科普一下关于二叉树我们需要知道的一些树的种类,以及它的特点。
我是攻城师
2019-04-28
3.4K0
数据结构与数据类型的区别,联系,本质?
数据结构与数据类型相信我们并不陌生,在日常开发中天天都能接触到,但如果要让你解释一下它们的本质区别和联系,你是否能准确的描述呢?
我是攻城师
2019-03-19
7.6K3
数据结构之(树)
在计算机科学中,树(英语:tree)是一种非线性的抽象数据类型(ADT)或是实现这种抽象数据类型的数据结构,用来模拟具有树状结构性质的数据集合。它是由n(n>0)个有限节点组成一个具有层次关系的集合
我是攻城师
2019-03-19
8520
为什么Java里面String类是不可变的
在Java里面String类型是不可变对象,这一点毫无疑问,那么为什么Java语言的设计者要把String类型设计成不可变对象呢?这是一个值得思考的问题。
我是攻城师
2019-03-06
6930
什么是线程安全?
线程安全在多线程编程时是一个比较重要的概念,我们下先来看下维基百科是如何定义这个概念的:
我是攻城师
2019-03-06
1.9K0
理解BitMap算法的原理
位图:一种常用的数据结构,代表了有限域中的稠集(dense set),每一个元素至少出现一次,没有其他的数据和元素相关联。在索引,数据压缩,海量数据处理等方面有广泛应用。
我是攻城师
2018-11-30
6.7K0
理解递归算法的原理
递归(Recursion)在计算机科学中是指一种通过重复将问题分解为同类的子问题而解决问题的方法,其核心思想是分治策略。 递归式方法可以被用于解决很多的计算机科学问题,因此它是计算机科学中十分重要的一个概念。绝大多数编程语言支持函数的自调用,在这些语言中函数可以通过调用自身来进行递归。
我是攻城师
2018-10-19
9.7K2
理解Java并发工具包线程池的设计
创建线程的流程依赖底层的操作系统,不同的操作系统可能不一样,此外更多的线程意味着 OS调度需要做更多的工作来决定哪一个线程可以访问资源,并且要通过OS调度切换维护线程的各种状态。
我是攻城师
2018-09-30
6900
理解算法的复杂度
在计算机科学中,算法的时间复杂度是一个函数,它定性描述该算法的运行时间,时间复杂度常用大O符号表示,不包括这个函数的低阶和首项系数,使用这种方式时,时间的复杂度可被成为是渐近的(asymptotic analysis),渐近是指在数学分析中是一种描述函数在极限附近的行为的方法,有多个科学领域应用此方法。
我是攻城师
2018-09-30
8450
理解Java7和8里面HashMap+ConcurrentHashMap的扩容策略
(2)在(1)的基础上,理解ConcurrentHashMap的并发安全的设计和实现思路
我是攻城师
2018-09-30
1.4K0
理解Java8并发工具类ConcurrentHashMap的实现
前面的文章已经分析过List和Queue相关的接口与并发实现类,本篇我们来分析一下非常Java里面非常重要的一个数据结构HashMap。(注意Set类型在这里我们不在单独分析,因为Set本身并不能算一种数据结构,它可以借助任何其他数据结构如array或者map类来实现。)
我是攻城师
2018-09-30
9300
理解Java队列接口Queue的设计
Queue接口不属于Java并发包下面的类,它是java.util下面的一个接口,虽然这个接口跟并发没有直接关系,但是它抽象和定义了在Java里面队列的通用方法,最重要的是这个类也是Java并发大神Doug Lea设计的,所以学习和了解这个接口是非常有必要的。
我是攻城师
2018-09-30
1.9K0
理解Java并发里面的CAS概念
我们知道在Java多线程里面关于共享变量的操作,一定是要使用线程同步来保证线程安全的,一旦涉及线程同步,就需要加锁,一旦加锁就意味着某一个时候只能有一个线程在操作,其他的线程如果没有得到锁就会阻塞起来,此时的线程的状态是BLOCKED,当前面的线程释放锁的时候,系统会自动调度当前的线程进入临界区,这里面存在一个问题,就是线程的上下文切换的问题,虽然比起来进程的上下文切换,线程的上下文切换更轻量级,但仍然也是有一定开销的,比如最简单的i++的例子,那么如何有没有一种不需要加锁也能保证线程安全的数据结构呢?答案是肯定的,这就是今天需要谈到的CAS(Compare And Swap或 Compare And Set)。
我是攻城师
2018-07-23
9920
Java里面volatile关键字修饰引用变量的陷阱
如果我现在问你volatile的关键字的作用,你可能会回答对于一个线程修改的变量对其他的线程立即可见。这种说法没多大问题,但是不够严谨。
我是攻城师
2018-07-23
9490
JDK8中LinkedList的工作原理剖析
LinkedList虽然在日常开发中使用频率并不是很多,但作为一种和数组有别的数据结构,了解它的底层实现还是很有必要的。 在这之前我们先来复习下ArrayList的优缺点,ArrayList基于数组的动态管理实现的,数组在内存中是一块连续的存储地址并且数组的查询和遍历是非常快的;缺点在于在添加和删除元素时,需要大幅度拷贝和移动数据,还要考虑是否需要扩容操作,所以效率比较低。 正是由于上面的不足,才出现了链表的这种数据结构,首先链表在内存中并不是连续的,而是通过引用来关联所有元素的,所以链表的优点在于添加和删
我是攻城师
2018-05-15
6900
点击加载更多
社区活动
腾讯技术创作狂欢月
“码”上创作 21 天,分 10000 元奖品池!
Python精品学习库
代码在线跑,知识轻松学
博客搬家 | 分享价值百万资源包
自行/邀约他人一键搬运博客,速成社区影响力并领取好礼
技术创作特训营·精选知识专栏
往期视频·千货材料·成员作品 最新动态
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档