随笔分类 -  数据结构与算法

摘要:栈介绍 栈是一种仅在表头进行插入和删除操作的线性表,并且属于后进先出(last-in,first-out,LIFO)原则,下面是栈的入栈和出栈的图示: 主要操作 栈主要有入栈和出栈操作,但要实现完整的栈操作,我们需要定义一些方法 push 入栈,将元素压入栈顶 pop 出栈,获取栈顶元素并将其从栈中 阅读全文
posted @ 2023-11-07 15:06 mingshan 阅读(17) 评论(0) 推荐(0) 编辑
摘要:最近看JDK11的CompletableFuture源码实现时,发现内部使用了Treiber stack,维基百科上作以下描述: The Treiber stack algorithm is a scalable lock-free stack utilizing the fine-grained 阅读全文
posted @ 2023-11-07 14:44 mingshan 阅读(93) 评论(0) 推荐(0) 编辑
摘要:在前面的文章中总结了二叉树的一些操作,提供了二叉树前中后的递归和非递归的实现。在非递归的实现中,基本思想是利用栈来模拟递归调用遍历的过程,本质上和递归实现没有区别,空间复杂度为O(n)。是否存在一种算法,它不使用栈也不破坏二叉树结构,但是可以完成对二叉树的遍历?即: 空间复杂度为\(O(1) 阅读全文
posted @ 2023-11-07 14:42 mingshan 阅读(54) 评论(0) 推荐(0) 编辑
摘要:链表作为一种数据结构我们是比较熟知的,相对数组来说插入和删除操作性能比较高,因为数组涉及到移位操作,但数组可以利用二分法进行快速查找,而在链表中想要获取当前元素,就必须知道该元素的上一个节点(头节点除外),这就限制了链表在查找操作的性能,试想有没有一种数据结构,在链表基础上也能实现类似二分查找这样较 阅读全文
posted @ 2023-11-07 14:34 mingshan 阅读(42) 评论(0) 推荐(0) 编辑
摘要:链式队列介绍 链式队列拥有队列的特性,只不过和顺序队列的区别是,顺序队列底层用的是数组存储元素,而链式队列用的是链表结构存储数据,也就是把一个元素和指向下个结点的指针封装成一个结点,这里称为Node,当队列为空,头指针与尾指针均指向头结点,只不过头结点为空结点,下面是链式队列的结构图 一个结点抽象成 阅读全文
posted @ 2023-11-06 08:45 mingshan 阅读(35) 评论(0) 推荐(0) 编辑
摘要:LeetCode一道对链表排序的题:148.排序链表,原题如下: 你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。 进阶: 你可以在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序吗? 我们直接整进阶的。 题目分析 如果做这个题之前知道归并排序和合并两个 阅读全文
posted @ 2023-11-06 08:42 mingshan 阅读(9) 评论(0) 推荐(0) 编辑
摘要:图(Graph)这个数据结构在平时开发中遇到的比较少,但我认为它是十分重要的,因为从真实的世界中来看,很多东西都可以抽象为图的表示,比如人际关系,地理位置,天马行空的东西都可以抽象为图,所以它比链表等基础数据结构高级一点点,也比较复杂,属于非线性结构。数学中有一个图论的分支也是与其有关。了解图在程序 阅读全文
posted @ 2023-11-03 09:07 mingshan 阅读(64) 评论(0) 推荐(0) 编辑
摘要:哈希表(Hash Table,也叫散列表),是存储键值对(key-value)的数据结构,主要利用hash算法将key映射到表中,以便加快查找速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。对于数组而言,查找数据容易,但添加删除数据比较慢;对于链表来说,添加删除数据容易,但查找数据比较慢, 阅读全文
posted @ 2023-11-02 10:20 mingshan 阅读(3) 评论(0) 推荐(0) 编辑
摘要:堆这个数据结构在我大学的教材上没有讲解,但平时听说过堆排序什么的,无疑是要用到这个数据结构,所以本篇文章主要是总结下堆的概念和实现。 堆概念 在维基百科中,是这样定义堆的: 堆(英语:Heap)是计算机科学中的一种特别的树状数据结构。若是满足以下特性,即可称为堆:“给定堆中任意节点 P 和 C,若 阅读全文
posted @ 2023-11-02 10:14 mingshan 阅读(858) 评论(0) 推荐(0) 编辑
摘要:双向链表描述 双向链表也叫双链表,它的每个数据结点都有两个指针,分别指向前驱结点和后继节点,同时有一个数据域来保存数据,双向链表的图示如下: 从图片可以看出,双链表的头结点的前驱结点和尾结点的后继结点为空,这一点要注意,对双链表的操作要检查这两种情况。 双向链表结构 每个数据结点都有两个指针,分别指 阅读全文
posted @ 2023-11-02 10:11 mingshan 阅读(28) 评论(0) 推荐(0) 编辑
摘要:在维基百科中,关于分治算法(divide-and-conquer)的介绍如下:在计算机科学中,分治法是建基于多项分支递归的一种很重要的算法范式。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。这个概念 阅读全文
posted @ 2023-11-02 10:09 mingshan 阅读(57) 评论(0) 推荐(0) 编辑
摘要:这里有n个房子在一列直线上,现在我们需要给房屋染色,共有k种颜色。每个房屋染不同的颜色费用也不同,你希望每两个相邻的房屋颜色不同 费用通过一个nxk 的矩阵给出,比如cost[0][0]表示房屋0染颜色0的费用,cost[1][2]表示房屋1染颜色2的费用。 样例: 输入: costs = [[14 阅读全文
posted @ 2023-11-02 10:08 mingshan 阅读(52) 评论(0) 推荐(0) 编辑
摘要:一条包含字母A-Z 的消息通过以下映射进行了 编码 : 'A' -> 1 'B' -> 2 ... 'Z' -> 26 要 解码 已编码的消息,所有数字必须基于上述映射的方法,反向映射回字母(可能有多种方法)。例如,"111" 可以将 "1" 中的每个 "1" 映射为 "A" ,从而得到 "AAA" 阅读全文
posted @ 2023-11-02 10:07 mingshan 阅读(27) 评论(0) 推荐(0) 编辑
摘要:先来看一下这道题简化的描述: 现有2元,5元,7元三种硬币,假设硬币都足够多,现求解:最少用多少枚上述硬币拼出27块钱? 递归解法 看到这个问题,我们一下子就可以想到一个树形结构,27块钱可以分别减去上面三种硬币的面额,剩下的值可以继续减去上面三种硬币的面额,直至无法再减,计算出刚好能减完的路线(从 阅读全文
posted @ 2023-11-02 10:07 mingshan 阅读(71) 评论(0) 推荐(0) 编辑
摘要:ArrayQueue假溢出 我们在利用数组实现队列的时候,发现数组队列会出现假溢出问题,即队列还没有满,但不能再往队列中放入元素了,如下图所示: 在数据进行出队的时候,每一个元素出队,指向队列头元素的head就会向后移动,导致head之前的元素被“遗忘”了,无法再次利用,出队的代码如下: @Over 阅读全文
posted @ 2023-11-01 15:03 mingshan 阅读(20) 评论(0) 推荐(0) 编辑
摘要:最近看到邓公讲利用栈来求解中缀表达式的课程,讲的十分清楚,由于课程是用c++写的代码,我这里用Java简单实现下。 中缀表达式是一个通用的算术或逻辑公式表示方法。我们平时做的四则运算将数字与运算符拼接起来就是中缀表达式。算法思想比较清晰明了,下面我列下算法过程: 首先创建两个栈,一个是操作符栈,用于 阅读全文
posted @ 2023-10-31 16:57 mingshan 阅读(208) 评论(0) 推荐(0) 编辑
摘要:二叉树定义 二叉树(Binary Tree)是n(n >= 0)个结点所构成的集合,它或为空树(n=0);或为非空树,对于非空树T: 有且仅有一个称之为根的结点 除根节点以外的其余结点分为两个互不相交的子集T1T2,分别称为T的左子树和右子树,且T1T2本身又是二 阅读全文
posted @ 2023-10-30 15:07 mingshan 阅读(17) 评论(0) 推荐(0) 编辑
摘要:二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树),它具有以下特点: 若任一节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若任一节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 任意节点的左、右子树也分别为二叉查找树; 没有键值相等的节 阅读全文
posted @ 2023-10-30 15:07 mingshan 阅读(17) 评论(0) 推荐(0) 编辑
摘要:第一个看到树状数组(Binary Indexed Tree)这个数据结构时,真的被吸引了,设计真是简洁,属于理论很复杂,但实现不复杂的那种算法。该算法多用于高效计算数列的前缀和, 区间和动态单点值的修改。要理解树状数组的工作原理,必须要知道二进制的运算法则,比如 &、 -、补码和反码等。下面先介绍下 阅读全文
posted @ 2023-10-30 15:06 mingshan 阅读(86) 评论(0) 推荐(0) 编辑
摘要:在计算机科学中,AVL树是最早被发明的自平衡二叉查找树。在AVL树中,任一节点对应的两棵子树的最大高度差为1,因此它也被称为高度平衡树。查找、插入和删除在平均和最坏情况下的时间复杂度都是 O(logn)。所以我们可知,AVL树首先是二叉查找树(BST),不了解BST的同学可以了解一下,因为AVL 阅读全文
posted @ 2023-10-30 15:03 mingshan 阅读(9) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示