![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构学习笔记
文章平均质量分 91
Neflibatata
啥也不会
展开
-
堆-数据结构和算法之美学习笔记
堆这种数据结构的应用场景非常多,最经典的莫过于堆排序了。堆排序是一种原地的、时间复杂度为 O(nlogn) 的排序算法。堆是一种特殊的树,只要满足这两点,它就是一个堆堆是一个完全二叉树堆中每一个节点的值都必须大于等于(或小于等于)其子树中每个节点的值对于每个节点的值都大于等于子树中每个节点值的堆,我们叫做“大顶堆”。对于每个节点的值都小于等于子树中每个节点值的堆,我们叫做“小顶堆”。其中第 1 个和第 2 个是大顶堆,第 3 个是小顶堆,第 4 个不是堆。除此之外,从图中还可以看出来,对于同原创 2021-01-03 20:20:22 · 147 阅读 · 0 评论 -
二叉树-数据结构和算法之美学习笔记
树(Tree)树”这种数据结构很像我们现实生活中的“树”,这里面每个元素我们叫做“节点”;用来连接相邻节点之间的关系,我们叫做“父子关系”如下:A 节点就是 B 节点的父节点,B 节点是 A 节点的子节点。B、C、D 这三个节点的父节点是同一个节点,所以它们之间互称为兄弟节点。我们把没有父节点的节点叫做根节点,也就是图中的节点 E。我们把没有子节点的节点叫做叶子节点或者叶节点,比如图中的 G、H、I、J、K、L 都是叶子节点。还有三个比较相似的概念:高度(Height)、深度(Depth)、层(L原创 2020-12-24 23:30:24 · 194 阅读 · 0 评论 -
散列表-数据结构和算法之美学习笔记
散列表的英文叫“Hash Table”,我们平时也叫它“哈希表”或者“Hash 表”散列表用的是数组支持按照下标随机访问数据的特性,所以散列表其实就是数组的一种扩展,由数组演化而来。可以说,如果没有数组,就没有散列表。键(key)/关键字;散列函数;散列值可以总结出这样的规律:散列表用的就是数组支持按照下标随机访问的时候,时间复杂度是 O(1) 的特性。我们通过散列函数把元素的键值映射为下标,然后将数据存储在数组中对应下标的位置。当我们按照键值查询元素时,我们用同样的散列函数,将键值转化数组下标,从原创 2020-12-23 23:12:03 · 152 阅读 · 0 评论 -
线性排序-数据结构和算法之美学习笔记
三种时间复杂度是 O(n) 的排序算法:桶排序、计数排序、基数排序。因为这些排序算法的时间复杂度是线性的,所以我们把这类排序算法叫作线性排序;之所以能做到线性的时间复杂度,主要原因是,这三个算法是非基于比较的排序算法,都不涉及元素之间的比较操作学习重点是掌握这些排序算法的适用场景一、桶排序顾名思义,会用到“桶”,核心思想是将要排序的数据分到几个有序的桶里,每个桶里的数据再单独进行排序。桶内排完序之后,再把每个桶里的数据按照顺序依次取出,组成的序列就是有序的了桶排序的时间复杂度为什么是 O(n) 呢原创 2020-12-23 12:44:01 · 117 阅读 · 0 评论 -
基础排序-数据结构和算法之美学习笔记
排序算法的执行效率**最好情况、最坏情况、平均情况时间复杂度:**分析排序算法的时间复杂度时,要分别给出最好情况、最坏情况、平均情况下的时间复杂度。除此之外,你还要说出最好、最坏时间复杂度对应的要排序的原始数据是什么样的。**时间复杂度的系数、常数 、低阶:**时间复杂度反映的是数据规模 n 很大的时候的一个增长趋势,所以它表示的时候会忽略系数、常数、低阶。但是实际的软件开发中,我们排序的可能是 10 个、100 个、1000 个这样规模很小的数据,所以,在对同一阶时间复杂度的排序算法性能对比的时候,原创 2020-12-21 23:04:44 · 103 阅读 · 0 评论 -
递归-数据结构和算法之美学习笔记
基本上,所有的递归问题都可以用递推公式来表示递归需要满足的三个条件一个问题的解可以分解为几个子问题的解;比如,电影院的例子,你要知道,“自己在哪一排”的问题,可以分解为“前一排的人在哪一排”这样一个子问题。这个问题与分解之后的子问题,除了数据规模不同,求解思路完全一样;比如电影院例子,求解“自己在哪一排”的思路,和前面一排人求解“自己在哪一排”的思路,是一模一样的存在递归终止条件:把问题分解为子问题,把子问题再分解为子子问题,一层一层分解下去,不能存在无限循环,这就需要有终止条件。还是电影院的例子原创 2020-12-19 22:21:06 · 103 阅读 · 1 评论 -
队列-数据结构和算法之美学习笔记
队列这个概念非常好理解。你可以把它想象成排队买票,先来的先买,后来的人只能站末尾,不允许插队。先进者先出,这就是典型的“队列”栈只支持两个基本操作:入栈 push()和出栈 pop()。队列跟栈非常相似,支持的操作也很有限,最基本的操作也是两个:入队 enqueue(),放一个数据到队列尾部;出队 dequeue(),从队列头部取一个元素。队列跟栈一样,也是一种操作受限的线性表数据结构应用非常广泛,比如循环队列、阻塞队列、并发队列。它们在很多偏底层系统、框架、中间件的开发中,起着关键性的作用。比如高原创 2020-12-19 18:16:32 · 95 阅读 · 1 评论 -
栈-数据结构和算法之美学习笔记
后进者先出,先进者后出,这就是典型的“栈”结构,从栈的操作特性上来看,栈是一种“操作受限”的线性表,只允许在一端插入和删除数据事实上,从功能上来说,数组或链表确实可以替代栈,但要知道,特定的数据结构是对特定场景的抽象,而且,数组或链表暴露了太多的操作接口,操作上的确灵活自由,但使用时就比较不可控,自然也就更容易出错当某个数据集合只涉及在一端插入和删除数据,并且满足后进先出、先进后出的特性,这时我们就应该首选“栈”这种数据结构栈既可以用数组来实现,也可以用链表来实现。用数组实现的栈,我们叫作顺序栈,用原创 2020-12-19 13:23:11 · 154 阅读 · 1 评论 -
链表-数据结构和算法之美学习笔记
链表的底层存储结构 数组需要一块连续的内存空间来存储,对内存的要求比较高。如果我们申请一个 100MB 大小的数组,当内存中没有连续的、足够大的存储空间时,即便内存的剩余总可用空间大于 100MB,仍然会申请失败。而链表恰恰相反,它并不需要一块连续的内存空间,它通过“指针”将一组零散的内存块串联起来使用,所以如果我们申请的是 100MB 大小的链表,根本不会有问题单链表链表通过指针将一组零散的内存块串联在一起。其中,我们把内存块称为链表的“结点”。为了将所有的结点串起来,每个链表的结点除了存储数原创 2020-12-18 17:53:35 · 145 阅读 · 3 评论