
算法面试精选汇编
文章平均质量分 79
涵盖常见算法招聘面试技术知识点,快速提升面试能力,增加项目经验,轻松搞定大厂Offer。
白话机器学习
10年IT从业经验,人工智能高级算法工程师、CSDN博客专家、阿里云专家、《2023博客之星马龄赛道11-15年》第一名、《2023博客之星,城市赛道》长春TOP1,CSDN付费资源项目实践专家
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
关于算法和数据结构的基本概念
数据结构可以分为「逻辑结构」和「物理结构」。集合结构线性结构树形结构图形结构。顺序存储结构链式存储结构。「逻辑结构」指的是数据之间的关系,「物理结构」指的是这种关系在计算机中的表现形式。例如:线性表中的「栈」,其数据元素之间的关系是一对一的,除头和尾结点之外的每个结点都有唯一的前驱和唯一的后继,这体现的是逻辑结构。而对于栈中的结点来说,可以使用顺序存储(也就是顺序栈)的方式存储在计算机中,其结构在计算机中的表现形式就是一段连续的存储空间,栈中每个结点和它的前驱结点、后继结点在物理上都是相邻的。原创 2023-06-01 16:37:26 · 148 阅读 · 0 评论 -
万字总结,看这一篇就够了,常见语言语法面试题汇总
delete会调用对象的析构函数,和malloc对应free只会释放内存; new调用构造函数。 malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。 它们都可用于申请动态内存和释放内存。 对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free原创 2023-06-27 20:48:32 · 284 阅读 · 0 评论 -
算法数据结构——区间动态规划介绍
区间动态规划:线性 DP 的一种,简称为「区间 DP」。以「区间长度」划分阶段,以两个坐标(区间的左、右端点)作为状态的维度。一个状态通常由被它包含且比它更小的区间状态转移而来。区间 DP 的主要思想就是:先在小区间内得到最优解,再利用小区间的最优解合并,从而得到大区间的最优解,最终得到整个区间的最优解。根据小区间向大区间转移情况的不同,常见的区间 DP 问题可以分为两种:单个区间从中间向两侧更大区间转移的区间 DP 问题。比如从区间 [i + 1, j - 1] 转移到更大区间 [i, j]。原创 2023-06-27 17:38:09 · 1329 阅读 · 0 评论 -
算法数据结构——背包问题详解(第五篇)
定义状态 $dp[w]$ 表示为:将物品装入一个最多能装重量为 $w$ 的背包中,恰好装满背包的情况下,能装入背包的最大价值总和。原创 2023-06-08 16:05:04 · 417 阅读 · 0 评论 -
算法数据结构——背包问题详解(第四篇)
思路 1:动态规划混合背包问题其实就是将「0-1 背包问题」、「完全背包问题」和「多重背包问题」这 $3$ 种背包问题综合起来,有的是能取 $1$ 件,有的能取无数件,有的只能取 $count[i]$ 件。其实只要理解了之前讲解的这 $3$ 种背包问题的核心思想,只要将其合并在一起就可以了。并且在「多重背包问题」中,我们曾经使用「二进制优化」的方式,将「多重背包问题」转换为「0-1 背包问题」,那么在解决「混合背包问题」时,我们也可以先将「多重背包问题」转换为「0-1 背包问题」,然后直接再区分是「0-1原创 2023-06-08 16:00:22 · 513 阅读 · 0 评论 -
算法数据结构——背包问题详解(第三篇)
$O(n \times W \times C)$,其中 $n$ 为物品种类数量,$W$ 为背包的载重上限,$C$ 是物品的数量数组长度。:有 $n$ 种物品和一个最多能装重量为 $W$ 的背包,第 $i$ 种物品的重量为 $weight[i]$,价值为 $value[i]$,件数为 $count[i]$。:$O(W \times \sum \log_2{count[i]})$,其中 $W$ 为背包的载重上限,$count[i]$ 是第 $i$ 种物品的数量。则最终结果为 $dp。原创 2023-06-08 15:57:49 · 199 阅读 · 0 评论 -
算法数据结构——背包问题详解(第二篇)
因为在计算 $dp[w]$ 时,我们需要用到第 $i$ 轮计算之后的 $dp[w - weight[i - 1]]$,所以我们需要按照「从 $0 \sim W$ 正序递推的方式」递推 $dp[w]$,这样才能得到正确的结果。:$O(n \times W \times \sum\frac{W}{weight[i]})$,其中 $n$ 为物品种类数量,$W$ 为背包的载重上限,$weight[i]$ 是第 $i$ 种物品的重量。则最终结果为 $dp[W]$,其中 $W$ 为背包的载重上限。原创 2023-06-08 15:56:04 · 303 阅读 · 0 评论 -
算法数据结构——背包问题详解(第一篇)
背包问题:背包问题是线性 DP 问题中一类经典而又特殊的模型。背包问题可以描述为:给定一组物品,每种物品都有自己的重量、价格以及数量。再给定一个最多能装重量为 $W$ 的背包。现在选择将一些物品放入背包中,请问在总重量不超过背包载重上限的情况下,能装入背包的最大价值总和是多少?根据物品限制条件的不同,背包问题可分为:0-1 背包问题、完全背包问题、多重背包问题、分组背包问题,以及混合背包问题等。原创 2023-06-08 15:54:04 · 1098 阅读 · 0 评论 -
算法数据结构——矩阵线性规划类问题解法(接上一篇)
则我们可以枚举 $i$ 的因子,从中找到在满足 $j$ 能够整除 $i$ 的条件下,最小的 $dp[j] + \frac{i}{j}$,即为 $dp[i]$,即 $dp[i] = min_{j | i}(dp[i], dp[j] + \frac{i}{j})$。由于 $j$ 能够整除 $i$,则 $j$ 与 $\frac{i}{j}$ 都是 $i$ 的因子,两者中必有一个因子是小于等于 $\sqrt{i}$ 的,所以在枚举 $i$ 的因子时,我们只需要枚举区间 $[1, \sqrt{i}]$ 即可。原创 2023-06-08 15:53:30 · 253 阅读 · 0 评论 -
算法数据结构——线性动态规划算法(Linear-DP)超详细总结加应用案例讲解
线性动态规划:具有「线性」阶段划分的动态规划方法统称为线性动态规划(简称为「线性 DP」),如下图所示。如果状态包含多个维度,但是每个维度上都是线性划分的阶段,也属于线性 DP。比如背包问题、区间 DP、数位 DP 等都属于线性 DP。线性 DP 问题的划分方法有多种方式。如果按照「状态的维度数」进行分类,我们可以将线性 DP 问题分为:一维线性 DP 问题、二维线性 DP 问题,以及多维线性 DP 问题。原创 2023-06-08 15:50:18 · 3553 阅读 · 0 评论 -
算法数据结构——记忆化搜索(Memoization Search)算法超详细总结加应用案例讲解
记忆化搜索(Memoization Search):是一种通过存储已经遍历过的状态信息,从而避免对同一状态重复遍历的搜索算法。记忆化搜索是动态规划的一种实现方式。在记忆化搜索中,当算法需要计算某个子问题的结果时,它首先检查是否已经计算过该问题。如果已经计算过,则直接返回已经存储的结果;否则,计算该问题,并将结果存储下来以备将来使用。举个例子,比如「斐波那契数列」的定义是:$f(0) = 0, f(1) = 1, f(n) = f(n - 1) + f(n - 2)$。原创 2023-06-08 15:47:01 · 14202 阅读 · 0 评论 -
算法数据结构——动态规划算法(Dynamic Programming)超详细总结加应用案例讲解
动态规划(Dynamic Programming):简称DP,是一种求解多阶段决策过程最优化问题的方法。在动态规划中,通过把原问题分解为相对简单的子问题,先求解子问题,再由子问题的解而得到原问题的解。动态规划最早由理查德 · 贝尔曼于 1957 年在其著作「动态规划(Dynamic Programming)」一书中提出。这里的 Programming 并不是编程的意思,而是指一种「表格处理方法」,即将每一步计算的结果存储在表格中,供随后的计算查询使用。原创 2023-06-08 15:41:23 · 9094 阅读 · 2 评论 -
算法数据结构——位运算(Bit Operation)使用方法总结
位运算(Bit Operation):在计算机内部,数是以「二进制(Binary)」的形式来进行存储。位运算就是直接对数的二进制进行计算操作,在程序中使用位运算进行操作,会大大提高程序的性能。在学习二进制数的位运算之前,我们先来了解一下什么叫做「二进制数」。二进制数(Binary):由 $0$ 和 $1$ 两个数码来表示的数。二进制数中每一个 $0$ 或每一个 $1$ 都称为一个「位(Bit)」。我们通常使用的十进制数有 $0 \sim 9$ 共 $10$ 个数字,进位规则是「满十进一」。例如:$7。原创 2023-06-07 14:16:26 · 2044 阅读 · 0 评论 -
算法数据结构——玩转贪心算法(Greedy Algorithm)使用套路及具体应用实例讲解
贪心算法(Greedy Algorithm):一种在每次决策时,总是采取在当前状态下的最好选择,从而希望导致结果是最好或最优的算法。贪心算法是一种改进的「分步解决算法」,其核心思想是:将求解过程分成「若干个步骤」,然后根据题意选择一种「度量标准」,每个步骤都应用「贪心原则」,选取当前状态下「最好 / 最优选择(局部最优解)」,并以此希望最后得出的结果也是「最好 / 最优结果(全局最优解)」。原创 2023-06-07 14:15:10 · 2111 阅读 · 0 评论 -
算法数据结构——玩转回溯算法(Backtracking)使用套路及具体应用实例讲解
回溯算法(Backtracking):一种能避免不必要搜索的穷举式的搜索算法。采用试错的思想,在搜索尝试过程中寻找问题的解,当探索到某一步时,发现原先的选择并不满足求解条件,或者还需要满足更多求解条件时,就退回一步(回溯)重新选择,这种走不通就退回再走的技术称为「回溯法」,而满足回溯条件的某个状态的点称为「回溯点」。简单来说,回溯算法采用了一种「走不通就回退」的算法思想。回溯算法通常用简单的递归方法来实现,在进行回溯过程中更可能会出现两种情况:找到一个可能存在的正确答案;原创 2023-06-07 14:04:38 · 1277 阅读 · 0 评论 -
算法数据结构——玩转分治算法(Divide and Conquer)使用套路及具体应用实例讲解
分治算法(Divide and Conquer):字面上的解释是「分而治之」,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。简单来说,分治算法的基本思想就是:把规模大的问题不断分解为子问题,使得问题规模减小到可以直接求解为止。原创 2023-06-07 13:57:36 · 1502 阅读 · 0 评论 -
算法数据结构——玩转递归算法(Recursion)使用套路及具体应用实例讲解
递归(Recursion):指的是一种通过重复将原问题分解为同类的子问题而解决的方法。在绝大数编程语言中,可以通过在函数中再次调用函数自身的方式来实现递归。举个简单的例子来了解一下递归算法。比如阶乘的计算方法在数学上的定义为:根据阶乘计算方法的数学定义,我们可以使用调用函数自身的方式来实现阶乘函数fact(n)if n == 0:return 1以n = 6为例,上述代码中阶乘函数的计算过程如下:fact(6)= 6 * 120= 720上面的例子也可以用语言描述为:函数从。原创 2023-06-07 11:17:13 · 1223 阅读 · 0 评论 -
算法数据结构——枚举算法(Enumeration Algorithm)讲解,如何简单快速的解决问题
枚举算法(Enumeration Algorithm):也称为穷举算法,指的是按照问题本身的性质,一一列举出该问题所有可能的解,并在逐一列举的过程中,将它们逐一与目标状态进行比较以得出满足问题要求的解。在列举的过程中,既不能遗漏也不能重复。枚举算法的核心思想是:通过列举问题的所有状态,将它们逐一与目标状态进行比较,从而得到满足条件的解。由于枚举算法要通过列举问题的所有状态来得到满足条件的解,因此,在问题规模变大时,其效率一般是比较低的。原创 2023-06-06 15:50:28 · 7179 阅读 · 0 评论 -
算法数据结构——图的拓扑排序问题
拓扑排序(:一种对有向无环图(DAG)的所有顶点进行线性排序的方法,使得图中任意一点 $u$ 和 $v$,如果存在有向边 $$,则 $u$ 必须在 $v$ 之前出现。对有向图进行拓扑排序产生的线性序列称为满足拓扑次序的序列,简称拓扑排序。图的拓扑排序是针对有向无环图(DAG)来说的,无向图和有向有环图没有拓扑排序,或者说不存在拓扑排序。原创 2023-06-06 15:47:15 · 1513 阅读 · 0 评论 -
算法数据结构——图的遍历之广度优先搜索算法(Breadth First Search)
广度优先搜索算法(Breadth First Search):简称为 BFS,又译作宽度优先搜索 / 横向优先搜索。是一种用于遍历或搜索树或图的算法。该算法从根节点开始,沿着树的宽度遍历树或图的节点。如果所有节点均被访问,则算法中止。广度优先遍历类似于树的层次遍历过程。呈现出一层一层向外扩张的特点。先看到的节点先访问,后看到的节点后访问。遍历到的节点顺序符合「先进先出」的特点,所以广度优先搜索可以通过「队列」来实现。原创 2023-06-06 15:23:14 · 9052 阅读 · 0 评论 -
算法数据结构——图的遍历之深度优先搜索算法(Depth First Search)
深度优先搜索算法(Depth First Search):英文缩写为 DFS。是一种用于搜索树或图的算法。所谓深度优先,就是说每次都尝试向更深的节点走。深度优先搜索采用了回溯思想,该算法沿着树的深度遍历树的节点,会尽可能深的搜索树的分支。当节点v的所在边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为止。原创 2023-06-06 15:19:31 · 10425 阅读 · 0 评论 -
算法数据结构——图的存储结构(邻接矩阵、边集数组、邻接表、链式前向星、哈希邻接表)及相关应用(图的遍历、连通性、生成树、最短路径、网络流量、二分图问题)
这里的「流」指的是:网络上的流。:如果连通图 $G$ 是一个带权无向图,生成树 $T$ 是图 $G$ 的一个最小生成树,如果有另一棵生成树 $T_1$,$T_1 \ne T$,满足不存在树 $T^{'}$,$T^{'} \ne T$,且 $w(T^{'}) < W(T_1)$,则称 $T_1$ 是图 $G$ 的次小生成树。另一个哈希表用来存放顶点相连的边信息,哈希表的键是边的终点,值是边的权重。在下文中,我们约定用 $n$ 代表顶点数目,$m$ 代表边数目,$TD(v_i)$ 表示顶点 $v_i$ 的度。原创 2023-06-06 15:13:46 · 1797 阅读 · 0 评论 -
算法数据结构基础——图(Graph)
图(Graph):由顶点的非空有限集合 $V$ (由 $n > 0$ 个顶点组成)与边的集合 $E$(顶点之间的关系)构成的结构。其形式化定义为 $G = (V, E)$。顶点(Vertex):图中的数据元素通常称为顶点,在下面的示意图中我们使用圆圈来表示顶点。边(Edge):图中两个数据元素之间的关联关系通常称为边,在下面的示意图中我们使用连接两个顶点之间的线段来表示边。原创 2023-06-06 15:07:23 · 1740 阅读 · 0 评论 -
万字长文,并查集(Union Find)精讲及应用实例
并查集(Union Find):一种树型的数据结构,用于处理一些不交集(Disjoint Sets)的合并及查询问题。不交集指的是一系列没有重复元素的集合。合并(Union):将两个集合合并成一个集合。查找(Find):确定某个元素属于哪个集合。通常是返回集合内的一个「代表元素」。简单来说,并查集就是用来处理集合的合并和集合的查询。并查集中的「集」指的就是我们初中所学的集合概念,在这里指的是不相交的集合,即一系列没有重复元素的集合。原创 2023-06-06 14:54:22 · 7776 阅读 · 2 评论 -
算法数据结构——线段树(Segment Tree)精讲及python实现
线段树(Segment Tree):一种基于分治思想的二叉树,用于在区间上进行信息统计。它的每一个节点都对应一个区间leftright通常是整数。每一个叶子节点表示了一个单位区间(长度为1),叶子节点对应区间上。每一个非叶子节点的左子节点表示的区间都为,右子节点表示的的区间都为。线段树是一棵平衡二叉树,树上的每个节点维护一个区间。根节点维护的是整个区间,每个节点维护的是父亲节点的区间二等分之后的其中一个子区间。当有n。原创 2023-06-05 05:05:40 · 4614 阅读 · 0 评论 -
算法数据结构——二叉搜索树(Binary Search Tree)精讲及python实现
二叉搜索树(Binary Search Tree):也叫做二叉查找树、有序二叉树或者排序二叉树。是指一棵空树或者具有下列性质的二叉树:如果任意节点的左子树不为空,则左子树上所有节点的值均小于它的根节点的值。如果任意节点的右子树不为空,则右子树上所有节点的值均大于它的根节点的值。任意节点的左子树、右子树均为二叉搜索树。如图所示,这 $3$ 棵树都是二叉搜索树。二叉树具有一个特性,即:$左子树的节点值 < 根节点值 < 右子树的节点值$。原创 2023-06-05 05:03:35 · 957 阅读 · 0 评论 -
算法数据结构基础——二叉树的还原(基于遍历序列还原二叉树)
二叉树的还原:指的是通过二叉树的遍历序列,还原出对应的二叉树。从二叉树的遍历过程可以看出,给定一棵非空二叉树,它的前序、中序、后续遍历所得到的遍历序列都是唯一的。那么反过来,如果已知节点的某种遍历序列,能否确定这棵二叉树呢?并且确定的二叉树是否是唯一的呢?我们先来回顾一下二叉树的前序遍历、中序遍历、后序遍历规则。非空二叉树的前序遍历规则:访问根节点。以前序遍历的方式遍历根节点的左子树。以前序遍历的方式遍历根节点的右子树。非空二叉树的中序遍历规则:以中序遍历的方式遍历根节点的左子树。原创 2023-06-05 05:00:38 · 2508 阅读 · 0 评论 -
算法数据结构基础——二叉树的遍历(前序、中序、后序、层序)及python实现
二叉树的遍历:指的是从根节点出发,按照某种次序依次访问二叉树中所有节点,使得每个节点被访问一次且仅被访问一次。在二叉树的一些实际问题中,经常需要按照一定顺序对二叉树中每个节点逐个进行访问一次,用以查找具有某一特点的节点或者全部节点,然后对这些满足要求的节点进行处理。这里所说的「访问」就是指对该节点进行某种操作,例如:依次输出节点的数据信息、统计满足某条件的节点总数等等。回顾二叉树的递归定义可以知道,二叉树是由根节点和左子树、右子树构成的。因此,如果能依次遍历这3个部分,就可以遍历整个二叉树。原创 2023-06-05 04:56:18 · 7489 阅读 · 0 评论 -
算法数据结构基础——树(二叉树)
树(Tree):由 $n \ge 0$ 个节点与节点之间的关系组成的有限集合。当 $n = 0$ 时称为空树,当 $n > 0$ 时称为非空树。之所以把这种数据结构称为「树」是因为这种数据结构看起来就像是一棵倒挂的树,也就是说数据结构中的「树」是根朝上,而叶朝下的。如下图所示。「树」具有以下的特点:有且仅有一个节点没有前驱节点,该节点被称为树的「根节点(Root)」。除了根节点以之,每个节点有且仅有一个直接前驱节点。包括根节点在内,每个节点可以有多个后继节点。原创 2023-06-05 04:54:01 · 1396 阅读 · 0 评论 -
算法数据结构——字典树、前缀树、单词查找树(Trie)精讲及python实现
字典树(Trie):又称为前缀树、单词查找树,是一种树形结构。顾名思义,就是一个像字典一样的树。它是字典的一种存储方式。字典中的每个单词在字典树中表现为一条从根节点出发的路径,路径相连的边上的字母连起来就形成对应的字符串。例如下图就是一棵字典树,其中包含有aabcacbaccachbchb这 7 个单词。从图中可以发现,这棵字典树用边来表示字母,从根节点到树上某一节点的路径就代表了一个单词。比如 1 → 2 → 6 → 10 表示的就是单词acc。原创 2023-06-05 04:50:58 · 1752 阅读 · 0 评论 -
算法数据结构——字符串子串查找算法Sunday精讲及python实现
Sunday 算法」是一种在字符串中查找子串的算法,是 Daniel M.Sunday 于1990年提出的字符串模式匹配算法。Sunday 算法思想:对于给定文本串T与模式串p,先对模式串p进行预处理。然后在匹配的过程中,当发现文本串T的某个字符与模式串p不匹配的时候,根据启发策略,能够尽可能的跳过一些无法匹配的情况,将模式串多向后滑动几位。Sunday 算法思想跟 Boyer Moore 算法思想类似。不同的是,Sunday 算法匹配顺序是从左向右,并且在模式串p匹配失败时关注的是文本串T。原创 2023-06-05 04:44:38 · 492 阅读 · 0 评论 -
算法数据结构——字符串查找算法Horspool 精讲及python实现
Horspool 算法:是一种在字符串中查找子串的算法,它是由 Nigel Horspool 教授于 1980 年出版的,是首个对 Boyer Moore 算法进行简化的算法。Horspool 算法思想:对于给定文本串T与模式串p,先对模式串p进行预处理。然后在匹配的过程中,当发现文本串T的某个字符与模式串p不匹配的时候,根据启发策略,能够尽可能的跳过一些无法匹配的情况,将模式串多向后滑动几位。可以看出,Horspool 算法思想和 Boyer Moore 算法思想是一致的。原创 2023-06-05 04:44:05 · 1169 阅读 · 1 评论 -
算法数据结构——字符串搜索算法BM(Boyer Moore)精讲及python实现
Boyer Moore 算法:简称为 BM 算法,是由它的两位发明者 Robert S. Boyer 和 J Strother Moore 的名字来命名的。BM 算法是他们在 1977 年提出的高效字符串搜索算法。在实际应用中,比 KMP 算法要快 3~5 倍。BM 算法思想:对于给定文本串T与模式串p,先对模式串p进行预处理。然后在匹配的过程中,当发现文本串T的某个字符与模式串p不匹配的时候,根据启发策略,能够直接尽可能地跳过一些无法匹配的情况,将模式串多向后滑动几位。原创 2023-06-05 04:41:53 · 2127 阅读 · 1 评论 -
算法数据结构——字符串匹配算法KMP精讲及python实现
KMP 算法:全称叫做「Knuth Morris Pratt 算法」,是由它的三位发明者 Donald Knuth、James H. Morris、 Vaughan Pratt 的名字来命名的。KMP 算法是他们三人在 1977 年联合发表的。KMP 算法思想:对于给定文本串T与模式串p,当发现文本串T的某个字符与模式串p不匹配的时候,可以利用匹配失败后的信息,尽量减少模式串与文本串的匹配次数,避免文本串位置的回退,以达到快速匹配的目的。原创 2023-06-05 04:38:10 · 573 阅读 · 0 评论 -
算法数据结构——字符串匹配算法BF、RK
Brute Force 算法:简称为 BF 算法。中文意思是暴力匹配算法,也可以叫做朴素匹配算法。BF 算法思想:对于给定文本串T与模式串p,从文本串的第一个字符开始与模式串p的第一个字符进行比较,如果相等,则继续逐个比较后续字符,否则从文本串T的第二个字符起重新和模式串p进行比较。依次类推,直到模式串p中每个字符依次与文本串T的一个连续子串相等,则模式匹配成功。否则模式匹配失败。Rabin Karp 算法:简称为 RK 算法。原创 2023-06-04 20:03:36 · 543 阅读 · 0 评论 -
算法数据结构基础——哈希表(Hash Table)
哈希表(Hash Table):也叫做散列表。是根据关键码值(Key Value)直接进行访问的数据结构。哈希表通过「键key」和「映射函数Hash(key)」计算出对应的「值value」,把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做「哈希函数(散列函数)」,存放记录的数组叫做「哈希表(散列表)」。哈希表的关键思想是使用哈希函数,将键key映射到对应表的某个区块中。向哈希表中插入一个关键码值:哈希函数决定该关键字的对应值应该存放到表中的哪个区块,并将对应值存放到该区块中。原创 2023-06-04 19:55:34 · 35657 阅读 · 8 评论 -
算法数据结构——优先队列(Priority Queue)精讲及python应用实例
优先队列(Priority Queue):一种特殊的队列。在优先队列中,元素被赋予优先级,当访问队列元素时,具有最高优先级的元素最先删除。优先队列与普通队列最大的不同点在于出队顺序。普通队列的出队顺序跟入队顺序相关,符合「先进先出(First in, First out)」的规则。优先队列的出队顺序跟入队顺序无关,优先队列是按照元素的优先级来决定出队顺序的。优先级高的元素优先出队,优先级低的元素后出队。优先队列符合「最高级先出(First in, Largest out)」的规则。原创 2023-06-04 19:53:13 · 11494 阅读 · 0 评论 -
算法数据结构基础——队列
队列(Queue):一种线性表数据结构,是一种只允许在表的一端进行插入操作,而在表的另一端进行删除操作的线性表。我们把队列中允许插入的一端称为「队尾(rear)」;把允许删除的另一端称为「队头(front)」。当表中没有任何数据元素时,称之为「空队」。「插入操作」和「删除操作」。队列的插入操作又称为「入队」。队列的删除操作又称为「出队」。简单来说,队列是一种「先进先出(First In First Out)」的线性表,简称为「FIFO 结构」。原创 2023-06-04 19:49:01 · 477 阅读 · 0 评论 -
算法数据结构——关于单调栈(Monotone Stack)的详细讲解及应用案例
单调栈(Monotone Stack):一种特殊的栈。在栈的「先进后出」规则基础上,要求「从栈顶到栈底的元素是单调递增(或者单调递减)」。其中满足从栈顶到栈底的元素是单调递增的栈,叫做「单调递增栈」。满足从栈顶到栈底的元素是单调递减的栈,叫做「单调递减栈」。注意:这里定义的顺序是从「栈顶」到「栈底」。有的文章里是反过来的。本文全文以「栈顶」到「栈底」的顺序为基准来描述单调栈。原创 2023-06-04 19:44:33 · 29051 阅读 · 5 评论 -
算法数据结构基础——堆栈
堆栈(Stack):简称为栈。一种线性表数据结构,是一种只允许在表的一端进行插入和删除操作的线性表。我们把栈中允许插入和删除的一端称为「栈顶(top)」;另一端则称为「栈底(bottom)」。当表中没有任何数据元素时,称之为「空栈」。「插入操作」和「删除操作」。栈的插入操作又称为「入栈」或者「进栈」。栈的删除操作又称为「出栈」或者「退栈」。简单来说,栈是一种「后进先出(Last In First Out)」的线性表,简称为「LIFO 结构」。我们可以从两个方面来解释一下栈的定义:第一个方面是。原创 2023-06-04 19:39:39 · 7278 阅读 · 1 评论