![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
文章平均质量分 93
数据结构入门到精通
默语玄
这个作者很懒,什么都没留下…
展开
-
数据结构之----贪心算法
贪心算法通常用于解决最优化问题,其原理是在每个决策阶段都做出局部最优的决策,以期望获得全局最优解。贪心算法会迭代地做出一个又一个的贪心选择,每轮都将问题转化成一个规模更小的子问题,直到问题被解决。贪心算法不仅实现简单,还具有很高的解题效率。相比于动态规划,贪心算法的时间复杂度通常更低。在零钱兑换问题中,对于某些硬币组合,贪心算法可以保证找到最优解;对于另外一些硬币组合则不然,贪心算法可能找到很差的解。贪心选择性质和最优子结构。贪心选择性质代表贪心策略的有效性。原创 2023-12-17 14:43:31 · 865 阅读 · 0 评论 -
数据结构之---- 动态规划
动态规划对问题进行分解,并通过存储子问题的解来规避重复计算,实现高效的计算效率。不考虑时间的前提下,所有动态规划问题都可以用回溯(暴力搜索)进行求解,但递归树中存在大量的重叠子问题,效率极低。通过引入记忆化列表,可以存储所有计算过的子问题的解,从而保证重叠子问题只被计算一次。记忆化递归是一种从顶至底的递归式解法,而与之对应的动态规划是一种从底至顶的递推式解法,其如同“填写表格”一样。由于当前状态仅依赖于某些局部状态,因此我们可以消除 𝑑𝑝 表的一个维度,从而降低空间复杂度。原创 2023-12-17 14:42:30 · 1094 阅读 · 0 评论 -
数据结构之---- 回溯算法
回溯算法本质是穷举法,通过对解空间进行深度优先遍历来寻找符合条件的解。在搜索过程中,遇到满足条件的解则记录,直至找到所有解或遍历完成后结束。回溯算法的搜索过程包括尝试与回退两个部分。它通过深度优先搜索来尝试各种选择,当遇到不满足约束条件的情况时,则撤销上一步的选择,退回到之前的状态,并继续尝试其他选择。尝试与回退是两个方向相反的操作。回溯问题通常包含多个约束条件,它们可用于实现剪枝操作。剪枝可以提前结束不必要的搜索分支,大幅提升搜索效率。回溯算法主要可用于解决搜索问题和约束满足问题。原创 2023-12-16 19:00:00 · 1386 阅读 · 0 评论 -
数据结构之---- 分治算法
分治算法是一种常见的算法设计策略,包括分(划分)和治(合并)两个阶段,通常基于递归实现。问题能否被分解、子问题是否独立、子问题是否可以被合并。归并排序是分治策略的典型应用,其递归地将数组划分为等长的两个子数组,直到只剩一个元素时开始逐层合并,从而完成排序。引入分治策略往往可以带来算法效率的提升。一方面,分治策略减少了操作数量;另一方面,分治后有利于系统的并行优化。分治既可以解决许多算法问题,也广泛应用于数据结构与算法设计中,处处可见其身影。相较于暴力搜索,自适应搜索效率更高。原创 2023-12-16 14:53:59 · 1537 阅读 · 0 评论 -
数据结构之---- 排序算法
冒泡排序通过交换相邻元素来实现排序。通过添加一个标志位来实现提前返回,我们可以将冒泡排序的最佳时间复杂度优化到 𝑂(𝑛)。插入排序每轮将未排序区间内的元素插入到已排序区间的正确位置,从而完成排序。虽然插入排序的时间复杂度为 𝑂(𝑛2) ,但由于单元操作相对较少,它在小数据量的排序任务中非常受欢迎。快速排序基于哨兵划分操作实现排序。在哨兵划分中,有可能每次都选取到最差的基准数,导致时间复杂度劣化至 𝑂(𝑛2)。引入中位数基准数或随机基准数可以降低这种劣化的概率。原创 2023-12-15 11:37:52 · 939 阅读 · 0 评论 -
数据结构----搜索之二分查找
暴力搜索是通过遍历数据结构的每个元素来定位目标元素。“线性搜索”适用于数组和链表等线性数据结构。它从数据结构的一端开始,逐个访问元素,直到找到目标元素或到达另一端仍没有找到目标元素为止。“广度优先搜索”和“深度优先搜索”是图和树的两种遍历策略。广度优先搜索从初始节点开始逐层搜索,由近及远地访问各个节点。深度优先搜索是从初始节点开始,沿着一条路径走到头为止,再回溯并尝试其他路径,直到遍历完整个数据结构。暴力搜索的优点是简单且通用性好,无须对数据做预处理和借助额外的数据结构。然而,原创 2023-12-15 09:08:10 · 1062 阅读 · 0 评论 -
数据结构之---- 图
图由顶点和边组成,可以被表示为一组顶点和一组边构成的集合。相较于线性关系(链表)和分治关系(树),网络关系(图)具有更高的自由度,因而更为复杂。有向图的边具有方向性,连通图中的任意顶点均可达,有权图的每条边都包含权重变量。邻接矩阵利用矩阵来表示图,每一行(列)代表一个顶点,矩阵元素代表边,用 1 或 0 表示两个顶点之间有边或无边。邻接矩阵在增删查操作上效率很高,但空间占用较多。邻接表使用多个链表来表示图,第 𝑖 条链表对应顶点 𝑖 ,其中存储了该顶点的所有邻接顶点。原创 2023-12-14 09:56:08 · 850 阅读 · 0 评论 -
数据结构之---- 堆、建堆操作、Top‑K 问题
在某些情况下,我们希望使用一个列表的所有元素来构建一个堆,这个过程被称为“建堆操作”。给定一个长度为 𝑛 无序数组 nums ,请返回数组中前 𝑘 大的元素。对于该问题,我们先介绍两种思路比较直接的解法,再介绍效率更高的堆解法。堆是一棵完全二叉树,根据成立条件可分为大顶堆和小顶堆。大(小)顶堆的堆顶元素是最大(小)的。优先队列的定义是具有出队优先级的队列,通常使用堆来实现。原创 2023-12-14 09:54:41 · 990 阅读 · 0 评论 -
数据结构之----二叉树、二叉树遍历、二叉树数组表示、二叉搜索树
层序遍历是从顶部到底部逐层遍历二叉树,并在每一层按照从左到右的顺序访问节点。层序遍历本质上属于广度优先遍历,它体现了一种一圈一圈向外扩展的逐层遍历方式。前序、中序和后序遍历都属于深度优先遍历,它体现了一种“先走到尽头,再回溯继续”的遍历方式。下图展示了对二叉树进行深度优先遍历的工作原理。深度优先遍历就像是绕着整个二叉树的外围“走”一圈,在每个节点都会遇到三个位置,分别对应前序遍历、中序遍历和后序遍历。二叉树是一种非线性数据结构,体现“一分为二”的分治逻辑。原创 2023-12-13 11:58:48 · 1325 阅读 · 0 评论 -
数据结构之----哈希表、哈希冲突、哈希算法
是指多个输入对应同一输出的情况称为哈希冲突通常情况下哈希函数的输入空间远大于输出空间,因此理论上哈希冲突是不可避免的。比如,输入空间为全体整数,输出空间为数组容量大小,则必然有多个整数映射至同一桶索引。哈希冲突会导致查询结果错误,严重影响哈希表的可用性。为解决该问题,我们可以每当遇到哈希冲突时就进行哈希表扩容,直至冲突消失为止。此方法简单粗暴且有效,但效率太低,因为哈希表扩容需要进行大量的数据搬运与哈希值计算。改良哈希表数据结构,使得哈希表可以在存在哈希冲突时正常工作。原创 2023-12-13 09:33:38 · 1296 阅读 · 0 评论 -
数据结构之----栈、队列、双向队列
队列是一种遵循先入先出规则的线性数据结构。顾名思义,队列模拟了排队现象,即新来的人不断加入队列的尾部,而位于队列头部的人逐个离开。如图所示,我们将队列的头部称为队首,尾部称为队尾,将把元素加入队尾的操作称为入队,删除队首元素的操作称为出队。在队列中,我们仅能在头部删除或在尾部添加元素。如图所示,双向队列提供了更高的灵活性,允许在头部和尾部执行元素的添加或删除操作。栈是一种遵循先入后出原则的数据结构,可通过数组或链表来实现。原创 2023-12-12 15:12:21 · 1298 阅读 · 0 评论 -
数据结构之----数组、链表、列表
链表是一种线性数据结构,其中的每个元素都是一个节点对象,各个节点通过“节点指针”相连接。节点指针记录了下一个节点的内存地址,通过它可以从当前节点访问到下一个节点。链表的设计使得各个节点可以被分散存储在内存各处,它们的内存地址是无须连续的。链表的组成单位是「节点 node」对象。每个节点都包含两项数据:节点的“值”和指向下一节点的“指针”。链表节点 ListNode 除了包含值,还需额外保存一个引用(指针)。因此在相同数据量下,链表比数组占用更多的内存空间。/* 链表节点类 */int val;原创 2023-12-12 11:54:23 · 1336 阅读 · 0 评论 -
数据结构之----算法简单介绍
数据结构是指计算机中组织和存储数据的方式。空间占用尽量减少,从而节省计算机内存。数据操作尽可能快速,涵盖数据访问、添加、删除、更新等。提供简洁的数据表示和逻辑信息,以便使得算法高效运行。数据结构设计是一个充满权衡的过程。如果想要在某方面取得提升,往往需要在另一方面作出妥协。链表相较于数组,在数据添加和删除操作上更加便捷,但牺牲了数据访问速度。图相较于链表,提供了更丰富的逻辑信息,但需要占用更大的内存空间。原创 2023-12-11 20:05:44 · 1812 阅读 · 0 评论 -
数据结构之----逻辑结构、物理结构
逻辑结构是指数据元素之间的逻辑关系,而逻辑结构又分为线性结构和非线性结构两大类。线性结构比较直观,指数据在逻辑关系上呈线性排列在数组和链表中,数据按照顺序依次排列,体现了数据之间的线性关系。非线性结构则与线性结构相反,指数据在逻辑关系上呈非线性排列在图中,数据由节点和边构成,反映了复杂的网络关系。而在树中,数据从顶部向下按层次排列,表现出祖先与后代之间的派生关系。而非线性数据结构又可以进一步被划分为树形结构和网状结构。线性结构:数组、链表、队列、栈、哈希表。元素之间是一对一的顺序关系。树形结构。原创 2023-12-11 17:02:16 · 700 阅读 · 0 评论 -
数据结构之----原码、反码、补码
反码:正数的反码与其原码相同,负数的反码是对其原码除符号位外的所有位取反。补码:正数的补码与其原码相同,负数的补码是在其反码的基础上加 1。下图是原码、反码和补码之间的转换方法。原创 2023-12-11 14:33:37 · 405 阅读 · 0 评论