![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
文章平均质量分 85
平行宇宙(EUEH)
这个作者很懒,什么都没留下…
展开
-
字符串匹配基础(上)
一、BF算法BF算法中文称作“暴力匹配算法”,也叫“朴素匹配算法”。我们先来了解两个概念主串和模式串。来看下面的例子:比如说,在字符串A(长度为n)中查找字符串B(长度为m),那么字符串A就是主串,字符串B就是模式串。因为我们是在主串中查找模式串,所以n>m。BF算法可以用一句话来概括:我们在主串中,检查起始位置分别是 0、1、2....n-m 且长度为 m 的 n-m+1 个子串,看有没有跟模式串匹配的。如下图所示:从上面的例子和算法思想我们可以知道,在极端情况下,比如主串是原创 2021-04-22 14:26:06 · 233 阅读 · 0 评论 -
如何基于堆实现排序?
扫码关注公众号,获取更多内容目录一、建堆二、排序堆排序的时间复杂度非常稳定,是O(nlogn),并且还是原地排序算法,我们可以把堆排序的过程大致分解为两个步骤:建堆和排序。一、建堆首先将数组原地(不借助另外一个数组,就在原数组上操作)建成一个堆,建堆有两种思路:第一种:借助在堆中插入一个元素的思路,数组中有n个数据,我们可以假设起初堆中只有一个数据(下标为1的数据)。然后我们调用上一节讲的插入操作,将下标为2到n的数据依次插入到堆中。这样就将包含n个数据的数组,组织成了堆。原创 2021-04-12 13:41:15 · 273 阅读 · 0 评论 -
堆
一、什么是堆堆是一种特殊的二叉树,它满足如下两个条件:1、堆是一个完全二叉树(除了最后一层,其他层的节点个数都是满的,最后一层的子节点都靠左排列)。2、堆中每一个节点的值都必须大于等于(或小于等于)其子树中的每个节点的值。对于每个节点的值都大于等于子树中每个节点的值的堆,叫做“大顶堆”。对于每个节点的值都小于等于子树中每个节点的值的堆,叫做“小顶堆”。我们来分析一下下图,看看这几个二叉树是不是堆?是什么堆?第1个和第2个是大顶堆,第三个是小顶堆,第4个不是堆(堆是完全二叉树,原创 2021-04-12 10:32:07 · 1325 阅读 · 0 评论 -
二叉树(下)
一、二叉查找树二叉查找树又叫二叉搜索树,它不仅支持快速查找一个数据,还支持快速插入、删除一个数据。二叉查找树要求,在树中的任意一个节点,它左子树中的每个节点的值,都要小于这个节点的值,而右子树节点的值都大于这个节点的值。其结构如下所示:1、二叉查找树的查找操作查找操作的概括如下:先取根节点,如果它等于我们要查找的数据,那就返回,如果要查找的数据比根节点的值小,那就在左子树中递归查找,如果要查找的数据比根节点的值大,就去右子树中查找。代码实现如下:public class Bin原创 2021-04-08 16:11:12 · 190 阅读 · 0 评论 -
二叉树(上)
扫码关注公众号,获取更多内容目录一、什么是树?二、二叉树三、二叉树的遍历一、什么是树?我们先看下图的例子,这些“树”都有什么特征?“树”这种数据结构很像真实生活中的“树”,这里面每个元素我们叫做“节点”。比如下面这幅图,A节点叫做B节点的父节点,B节点是A节点的子节点。B,、C、D这三个节点的父节点是同一个节点,它们之间互称为兄弟节点。没有父节点的节点叫做根节点,下图中E就是根节点。没有子节点的节点叫做叶子节点或者叶节点,比如下图中的G、H、I、J、K、L,他们都是叶原创 2021-03-31 15:10:59 · 227 阅读 · 1 评论 -
散列表(下)
扫码关注公众号,获取更多内容目录一、LRU缓存淘汰算法二、Java LinkedHashMap分析一、LRU缓存淘汰算法我们如何实现一个LRU缓存淘汰算法如果单纯用链表实现LRU缓存淘汰算法的话,我们要怎么实现呢?首先我们需要维护一个按照访问时间从大到小有序排序的链表结构,缓存的大小是有限的,当空间不够,需要淘汰一个数据的时候,我们就直接将链表头部的节点删除,当需要缓存某个数据的时候,先在链表中查找这个数据,如果没找到,就将该数据放在链表尾部,如果有,就把该数据移动到链表尾部原创 2021-03-30 14:16:54 · 125 阅读 · 0 评论 -
递归
扫码关注公众号,获取更多内容目录一、什么是递归?二、递归需要满足的三个条件三、如何编写递归代码?四、递归代码要警惕堆栈溢出五、递归代码要警惕重复计算一、什么是递归?程序调用自身的编程技巧称为递归,光看定义可能不是很理解,我们举一个例子:周末你和女朋友去电影院看电影,女朋友问你现在坐在第几排,电影院里太黑看不清,这时候怎么办?这时候递归就可以派上用场了,你开始问前面一排的人,他是第几排,你只要在他的数字上加1,就知道自己在第几排了,但是前面的人也不知道自己在第.原创 2021-03-15 15:05:58 · 145 阅读 · 0 评论 -
队列
一、什么是队列?队列是一种操作受限的线性表数据结构,其特点是:先进先出,后进后出。队列支持两个基本操作:入队 enqueue(),放一个数据到队列尾部;出队 dequeue(),从队列头部取一个元素。二、顺序队列和链式队列队列可以用数组来实现,也可以用链表来实现。用数组实现的队列叫作顺序队列,用链表实现的队列叫作链式队列。1、数组实现队列// 用数组实现的队列public class ArrayQueue { // 数组:items,数组大小:n privat.原创 2021-03-14 13:55:43 · 121 阅读 · 0 评论 -
栈
扫码关注公众号,获取更多内容目录一、什么是栈?二、如何实现一个栈?三、支持动态扩容的顺序栈四、栈在函数调用中的应用五、栈在表达式求值中的应用六、栈在括号匹配中的应用七、实现浏览器的前进、后退功能一、什么是栈?栈是一种“操作受限”的线性表,只允许在一端插入和删除数据,典型的栈结构为:先进后出,后进先出。关于栈,我举一个非常贴切的例子:一摞叠在一起的盘子。我们平时放盘子的时候,都是从下往上一个一个放;取的时候,我们是从上往下一个一个地依次取,不能从中间.原创 2021-03-11 18:18:48 · 232 阅读 · 0 评论 -
链表(上)
扫码关注公众号,获取更多内容目录一、底层存储结构二、常见的链表1、单链表2、循环链表3、双向链表4、双向循环链表三、链表与数组性能一、底层存储结构我们观察下图数组需要一块连续的内存空间来存储,对内存的要求比较高。如果我们申请一个 100MB 大小的数组,当内存中没有连续的、足够大的存储空间时,即便内存的剩余总可用空间大于 100MB,仍然会申请失败。而链表恰恰相反,它并不需要一块连续的内存空间,它通过“指针”将一组零散的内存块串联起来使用,所以如果我.原创 2021-03-09 16:56:43 · 122 阅读 · 0 评论 -
数组
扫码关注公众号,获取更多内容目录一、什么是数组?二、数组是如何实现根据下标随机访问的三、为什么数组的“插入”和“删除”是低效的?1、插入操作2、删除操作一、什么是数组?数组(Array)是一种线性表数据结构。它用一组连续的内存空间,来存储一组具有相同类型的数据。我们提取出几个关键词:线性表:线性表就是数据排成像一条线一样的结构。每个线性表上的数据最多只有前和后两个方向。其实除了数组,链表、队列、栈等也是线性表结构。而与它相对立的概念是非线性表,比如二.原创 2021-03-09 14:25:50 · 268 阅读 · 0 评论