数据结构与算法
文章平均质量分 96
技术范王有志
金融行业高级架构师,专注于分享硬核 Java 技术,分布式与微服务,数据库,应用框架,金融系统架构设计等。
展开
-
实现AVL树
今天的内容还是比较简单的,类似于小学的看图写作,只不过我们这次是将图示的过程翻译成的代码。大家可以重点理解下各种旋转的过程(实际上还是上一篇的内容),至于叫法,大家就不用太纠结。下一篇呢,会和大家分享另一棵平衡二分搜索树–大名鼎鼎的红黑树。原创 2024-01-23 20:04:42 · 934 阅读 · 0 评论 -
二分搜索树
今天我们一起认识了二分搜索树的特性,二分搜索树是在二叉树的基础上添加了“排序”的特性,使其变得“有序”。接着我们一起实现了自己的二分搜索树,核心方法通过递归实现,不知道有没有再次加深你对递归的理解?你以为这就完了吗?其实还遗留了3点。首先是二分搜索树的优势在哪?核心方法的时间复杂度如何?为什么用二分搜索树而不是链表?留给大家思考。其次是二分搜索树的遍历,虽然可以照搬二叉树的遍历,不过动手写一写,看一看输出的结果,你会有新的发现。原创 2024-01-22 20:45:13 · 904 阅读 · 0 评论 -
平衡二分搜索树
通过二分搜索树的“退化”引出了平衡二分搜索树,然后一起了解了如何通过节点的高度和平衡因子来判定是否属于平衡二分搜索树;引入了AVL树,实现了自动平衡特性的平衡二分搜索树,通常大家称呼这类拥有自动平衡特性的为自平衡二分搜索树;学习了AVL树中导致失衡的场景,以及自动平衡的机制–树旋转的理论基础。原计划在今天的内容中完成AVL树的实现,不过有小伙伴提议添加Python的实现。添加Python实现的话内容就会比较多了,方便我再水一篇。虽然Java实现只需要简单的改造下。原创 2024-01-22 20:45:50 · 490 阅读 · 0 评论 -
遍历二叉树
今天我们一起学习了二叉树的遍历,分别通过迭代和递归实现了二叉树的深度优先遍历,迭代的方式是比较符合人的思维,所以我们开始就会铆足劲从迭代入手,但是容易忽略借助其他数据结构,而递归更符合计算机的思维,初次接触并不容易想到,还需要多加练习来熟悉递归。最后借助队列实现了二叉树的层序遍历,过程还是比较简单的,不过多赘述了,比较有难度的一点是如何将层序遍历的结果输出为二维结构,大家可以试一下力扣上面的题目。特别说明:文中使用到的数据结构和是我自己实现的,可以参考文末的代码仓库。原创 2024-01-21 17:17:53 · 908 阅读 · 0 评论 -
认识二叉树
今天我们初步认识了树中的概念和定义,希望通这张图能够让你快速的理解,而不需要死记硬背。接着我们一起看了4种二叉树结构,这些特殊的结构也是我们学习后面二叉树何种实现的基础。最后介绍了二叉树的两种存储结构,对于这种动态数据结构通过一维数组的实现方式,我们了解其原理就够了。你可能会发觉今天画了很多图,是因为我们要学习的数据结构从一维升到了二维,靠想象我已经很难在脑袋中描绘出它们了。如果文章中出现任何错误,还请批评指正。最后欢迎大家关注分享硬核Java技术的金融摸鱼侠王有志,我们下次再见!原创 2024-01-21 17:16:41 · 925 阅读 · 0 评论 -
数据结构:栈和队列
今天我们一起学习了栈和队列,它们是线性表中比较特殊的存在,如果要给线性表划分层级的话,基础的是数组和链表,在此之上我们可以构建出“更高级”的栈和队列。在通过生活中的例子解释了栈和队列后我们学习了栈在计算机世界中丰富的应用,以及一种的队列–循环队列。到今天为止线性表中比较基础的内容已经结束了,如果想要彻底的掌握它们还需要勤加练习。接下来,我们就要开始树的学习了,各位小伙伴们加油。原创 2024-01-14 14:51:35 · 1092 阅读 · 1 评论 -
优雅的删除链表元
今天我们对单向链表的删除方法不断的优化,减少复杂逻辑,减少代码量。介绍了使用虚拟头节点处理链表中的问题,成功的消除了特殊逻辑,然后是通过递归,实现了“终极优雅”。最后,我们第二次聊到了递归,当然这不会是我们最后一次聊递归,在后面树的内容中,递归会更加频繁的出现。原创 2024-01-14 14:50:37 · 984 阅读 · 0 评论 -
第一个动态结构:链表
在数据结构:线性表入门中,我们知道数组使用连续的内存,可如果程序已经运行了很久,内存中没有足够的连续内存,这时需要一个线性表结构,除了使用360安全卫士清理内存外,该怎么办呢?早在1955年就有人想到了这个问题,从而诞生了一种影响深远的数据结构-链表。原创 2024-01-11 20:52:29 · 1016 阅读 · 0 评论 -
线性表入门
王有志,一个分享硬核Java技术的互金摸鱼侠加入Java人的提桶跑路群:共同富裕的Java人从今天开始就进入到数据结构的部分了,整体分为3个部分:线性表,树和图,从认识每种数据结构到它们的高级应用。今天我们先从最简单的线性表和数组开始。什么是线性表?线性表是我们工作中最常用的数据结构之一,同时它也是我们接触到的最简单的数据结构。根据操作节点的自由度,我们可以将线性表分为两大类:非受限线性表和受限线性表。非受限线性表:数组,链表受限线性表:栈,队列除此之外,字符串也是一种特殊的线性表。在原创 2024-01-11 20:51:38 · 885 阅读 · 0 评论 -
“高端”的位运算
今天的内容到这里就结束了,我们来回顾下都聊了哪些内容:首先是简单介绍了计算机中的原码,反码和补码,接着是Java中7种位运算操作符,不过并不是所有语言都提供了无符号右移(>>>),最后介绍了一些简单位运算的技巧,但位运算的用法远不止这些,包括听起来很高端的布隆过滤器,也使用了位运算,这也是为什么我说位运算“高端”。最后补充一篇关于为什么要使用位运算的问答《》,虽然已经过去了11年,但依旧可以作为参考。原创 2024-01-09 20:46:30 · 920 阅读 · 0 评论 -
使用迭代优化递归程
今天的内容到这里就结束了,我们来回顾下都聊了哪些内容:首先是回顾了递归求解斐波那契数列的问题,通过“记忆”优化了递归的执行速度,但是增加了空间复杂度。然后为了更高效,我们引入了迭代,虽然我并不鼓励大家记忆概念和定义,但是你要明白相似概念的区别。最后我们通过迭代的方式求解斐波那契数列,实现了 O(n) 复杂度。当然,斐波那契数列还有OlognOlogn的解法,不过这不是我们今天的内容。原创 2024-01-09 20:45:35 · 1193 阅读 · 0 评论 -
从斐波那契数列到递归
今天的内容到这里就结束了,我们来回顾下都聊了哪些内容:首先是认识了斐波那契数列,斐波那契数列远没有看起来这么简单,随着n的增大,斐波那契数列的相邻两数比值会越来越趋近于0.618,就是自然界中的黄金分割。通过斐波那契数列,我们认识了递归这一编程技巧,以及编译器对递归的优化。最后我们通过递归跟踪的方式计算了大O记号下斐波那契数列的时间复杂度。原创 2024-01-07 17:33:34 · 896 阅读 · 0 评论 -
算法的复杂度分析
今天的内容到这里就结束了,我们来回顾下都聊了哪些内容:今天的主要内容是算法的复杂度分析,解释了算法复杂度分析渐进分析大O记号大Ω记号和大θ记号,其中渐近分析和大O记号是数学概念引申到计算机领域的,因此会有一些数学证明,好在我们的算法和数学比起来还是很简单的,分析起来难度也不是很大。然后计算了3种常见的渐进时间复杂度,并通过函数曲线展示了其余量级渐进复杂度的变化情况。原创 2024-01-07 15:36:44 · 1165 阅读 · 0 评论