暂时未有相关云产品技术能力~
他强由他强,清风拂山岗;他横由他横,明月照大江;他自狠来他自恶,我自一口真气足;
优先队列本身就是一种队列。 普通队列:先进先出、后进后出,如排队买票吃饭一样。 优先队列:出队顺序和入队顺序无关,和优先级相关。如去医院看病,床位非常的紧张,需要排队才能去做手术的话,此时做手术的这个队伍的顺序就是一个优先队列。因为医生是根据每一个患者的病症的不同以及需要这个手术的紧急程度的不同来去安排谁先做手术谁后做手术,也可以认为每一个患者是有一个优先级的。优先级高者先得,这样的一个队列就叫做优先队列,它和普通队列最主要的区别是在于出队这个操作上,入队很简单,但是优先级高的先出队。
堆是一个特殊的树结构。 在前面的文章中,使用了二分搜索树实现了集合和映射这两个相对来讲更加高层的数据结构。树这种数据结构本身在计算机科学领域占有重要的地位,树这种形状本身可以产生非常多的拓展,在面对不同的问题的时候可以稍微改变或者限制树这种数据结构的性质,从而产生不同的数据结构,高效的解决不同的问题。 之后的文章会有四个不同的例子,堆、线段树、字典树、并查集,通过这些不同的数据结构的学习可以体会到数据结构的灵活之处,以及在设计数据结构的时候其中的一些思考非常重要,因为这些思考会让你对数据结构这个领域有更加深刻的认识。
映射是高层的数据结构,高层的数据结构还有栈和队列,这种数据结构更像是定义好了这种数据结构的相应的使用接口。 有了这些使用的接口包括这些数据结构本身所维持的一些性质,就可以非常容易的把它们放入一些具体的应用中,但是底层实现可以是多种多样的。 比如栈和队列的底层实现即可以是动态数组也可以是链表,映射 Map 也是类似这样的数据结构。
集合是高层的数据结构,高层的数据结构还有栈和队列,这种数据结构更像是定义好了这种数据结构的相应的使用接口。 有了这些使用的接口包括这些数据结构本身所维持的一些性质,就可以非常容易的把它们放入一些具体的应用中,但是底层实现可以是多种多样的。 比如栈和队列的底层实现即可以是动态数组也可以是链表,集合 Set 也是类似这样的数据结构。
上篇二分搜索树的文章中,认识了树这种高效的结构,对递归也有更深层次的认识,也体会到了二分搜索树前中后序递归遍历的思想,也就是深度优先遍历。二分搜索树的遍历,对每一个节点都有三次的访问机会。前序遍历访问节点都是在第一个访问机会的位置才去访问节点,中序遍历访问节点都是在第二个访问机会的位置才去访问节点,后序遍历访问节点都是在第三个访问机会的位置才去访问节点。 接下来开始认识一下树遍历非递归的思想,也就是层序遍历(广度优先遍历)。还有删除树节点以及更多二分搜索树的feature。
线性数据结构是把所有的数据排成一排,树结构是倒立的树,由一个根节点延伸出很多新的分支节点。在计算机科学领域很多问题的处理,当你将数据使用树结构进行存储后,出奇的高效。 这篇文章讲的二分搜索树(Binary Search Tree),二分搜索树有它的局限性。后面还会有平衡二叉树:AVL;红黑树,除了他们,平衡二叉树还有很多种。
上篇文章已经从底层完整实现了一个单链表这样的数据结构,并且也依托链表这样的数据结构实现了栈和队列,在实现队列的时候对链表进行了一些改进。 递归不光用于树这样的结构中还可以用在链表这样的结构中,链表本身就天然的具有递归结构性质,只不过链表太简单了,它是一个线性结构,所以可以使用非递归的方式,如使用循环的方式就可以非常容易的解决链表的问题,从链表开始就要打好递归的基础,对深入学习树结构包括更加深刻的理解递归算法都是非常有好处的。
链表是最基础的动态数据结构。 动态数组、栈、队列,底层都是依托静态数组,靠 resize 解决固定容量问题。它们所谓的动态,是从用户的角度上来看的。 链表是真正的动态数据结构,它是数据结构中的一个重点,也有可能是一个难点吧。它是最简单的一种动态数据结构,其它更高级的动态数据结构有二分搜索树、Trie、平衡二叉树、AVL、红黑树等等。 熟悉了最简单的动态数据结构,那么对于更高级的也会比较容易掌握了。
数据结构是计算机领域专业必学的知识点,因为数据结构研究的就是数据如何在计算机中进行组织和存储,从而高效的获取数据或者修改数据。 有时可以让我们根据不同的应用,灵活选择最合适的数据结构继而解决相应的问题。
队列是一种先进先出的数据结构(先到先得),First In First Out(FIFO) 先进先出,就像你去银行取钱。
栈是一种后进先出的数据结构,Last In First Out(LIFO),看似很简单但其实是应用非常广泛的数据结构。就像你先往饼干罐里装饼干,要吃的时候往外拿。
你可以把数组想象成是把数据码成一排进行存放,在强语言中数据的类型是确认的,而在弱语言中数据的类型是不确认的,但是也有方法可以进行确认。js 中的数组是有局限性的。