算法与数据结构面试宝典
文章平均质量分 91
白话机器学习
10年IT从业经验,人工智能高级算法工程师、CSDN博客专家、阿里云专家、《2023博客之星马龄赛道11-15年》第一名、《2023博客之星,城市赛道》长春TOP1,CSDN付费资源项目实践专家
展开
-
彻底弄懂SQL的执行顺序
分组结束之后,我们再执行select语句,因为聚合函数是依赖于分组的,聚合函数会单独新增一个查询出来的字段,这里用紫色表示,这里我们两个id重复了,我们就保留一个id,重复字段名需要指向来自哪张表,否则会出现唯一性问题。当我们编写一个SQL查询时,尽管查询语句的书写顺序与实际的执行顺序不同,但了解其执行顺序有助于更好地理解查询是如何工作的,以及如何优化查询。然后把再根据我们要的数据进行select,可以是普通字段查询也可以是获取聚合函数的查询结果,如果是集合函数,select的查询结果会新增一条字段。原创 2024-01-01 20:15:22 · 824 阅读 · 0 评论 -
算法与数据结构面试宝典——二叉树遍历
从物理结构的角度来看,树是一种基于链表的数据结构,因此其遍历方式是通过指针逐个访问节点。然而,树是一种非线性数据结构,这使得遍历树比遍历链表更加复杂,需要借助搜索算法来实现。二叉树常见的遍历方式包括层序遍历、前序遍历、中序遍历和后序遍历等。原创 2023-09-24 10:30:59 · 120 阅读 · 1 评论 -
算法与数据结构面试宝典——二叉搜索树
如下图所示,「二叉搜索树 binary search tree」满足以下条件。1.原创 2023-09-24 09:52:14 · 44 阅读 · 0 评论 -
算法与数据结构面试宝典——二叉树
二叉树 binary tree」是一种非线性数据结构,代表着祖先与后代之间的派生关系,体现着“一分为二”的分治逻辑。与链表类似,二叉树的基本单元是节点,每个节点包含:值、左子节点引用、右子节点引用。原创 2023-09-24 09:46:30 · 44 阅读 · 0 评论 -
算法与数据结构面试宝典——栈详解
栈 stack」是一种遵循先入后出的逻辑的线性数据结构。我们可以将栈类比为桌面上的一摞盘子,如果需要拿出底部的盘子,则需要先将上面的盘子依次取出。我们将盘子替换为各种类型的元素(如整数、字符、对象等),就得到了栈数据结构。如下图所示,我们把堆叠元素的顶部称为“栈顶”,底部称为“栈底”。将把元素添加到栈顶的操作叫做“入栈”,删除栈顶元素的操作叫做“出栈”。原创 2023-09-24 09:41:06 · 44 阅读 · 0 评论 -
算法与数据结构面试宝典——双向队列
在队列中,我们仅能在头部删除或在尾部添加元素。如下图所示,「双向队列 deque」提供了更高的灵活性,允许在头部和尾部执行元素的添加或删除操作。原创 2023-09-24 09:36:54 · 519 阅读 · 0 评论 -
算法与数据结构面试宝典——队列
队列 queue」是一种遵循先入先出规则的线性数据结构。顾名思义,队列模拟了排队现象,即新来的人不断加入队列的尾部,而位于队列头部的人逐个离开。如下图所示,我们将队列的头部称为“队首”,尾部称为“队尾”,将把元素加入队尾的操作称为“入队”,删除队首元素的操作称为“出队”。原创 2023-09-24 09:29:48 · 49 阅读 · 0 评论 -
算法与数据结构面试宝典——选择排序详解
选择排序 selection sort」的工作原理非常直接:开启一个循环,每轮从未排序区间选择最小的元素,将其放到已排序区间的末尾。设数组的长度为n,选择排序的算法流程如下图所示。0n−10n−101n−11n−1n−1=== “”=== “”=== “”=== “”=== “”=== “”=== “”=== “”=== “”=== “”=== “”在代码中,我们用k。原创 2023-09-23 09:49:14 · 59 阅读 · 2 评论 -
算法与数据结构面试宝典——基数排序详解
上一节我们介绍了计数排序,它适用于数据量n较大但数据范围m较小的情况。假设我们需要对n106个学号进行排序,而学号是一个8位数字,这意味着数据范围m108非常大,使用计数排序需要分配大量内存空间,而基数排序可以避免这种情况。「基数排序 radix sort」的核心思想与计数排序一致,也通过统计个数来实现排序。在此基础上,基数排序利用数字各位之间的递进关系,依次对每一位进行排序,从而得到最终的排序结果。原创 2023-09-23 09:43:55 · 49 阅读 · 0 评论 -
算法与数据结构面试宝典——快速排序详解
快速排序 quick sort」是一种基于分治策略的排序算法,运行高效,应用广泛。快速排序的核心操作是“哨兵划分”,其目标是:选择数组中的某个元素作为“基准数”,将所有小于基准数的元素移到其左侧,而大于基准数的元素移到其右侧。具体来说,哨兵划分的流程如下图所示。原创 2023-09-23 09:41:01 · 40 阅读 · 0 评论 -
算法与数据结构面试宝典——归并排序
归并排序 merge sort」是一种基于分治策略的排序算法,包含下图所示的“划分”和“合并”阶段。原创 2023-09-23 09:35:16 · 37 阅读 · 0 评论 -
算法与数据结构面试宝典——插入排序
插入排序 insertion sort」是一种简单的排序算法,它的工作原理与手动整理一副牌的过程非常相似。具体来说,我们在未排序区间选择一个基准元素,将该元素与其左侧已排序区间的元素逐一比较大小,并将该元素插入到正确的位置。下图展示了数组插入元素的操作流程。设基准元素为base,我们需要将从目标索引到base之间的所有元素向右移动一位,然后再将base赋值给目标索引。原创 2023-09-23 09:30:38 · 33 阅读 · 0 评论 -
算法与数据结构面试宝典——堆排序详解
堆排序 heap sort」是一种基于堆数据结构实现的高效排序算法。我们可以利用已经学过的“建堆操作”和“元素出堆操作”实现堆排序。以上方法虽然可行,但需要借助一个额外数组来保存弹出的元素,比较浪费空间。在实际中,我们通常使用一种更加优雅的实现方式。原创 2023-09-23 09:24:28 · 45 阅读 · 0 评论 -
算法与数据结构面试宝典——计数排序详解
这个信息非常关键,因为它告诉我们各个元素应该出现在结果数组的哪个位置。接下来,我们倒序遍历原数组。原创 2023-09-23 09:18:48 · 38 阅读 · 0 评论 -
算法与数据结构面试宝典——桶排序
前述的几种排序算法都属于“基于比较的排序算法”,它们通过比较元素间的大小来实现排序。此类排序算法的时间复杂度无法超越Onlogn。接下来,我们将探讨几种“非比较排序算法”,它们的时间复杂度可以达到线性阶。「桶排序 bucket sort」是分治策略的一个典型应用。它通过设置一些具有大小顺序的桶,每个桶对应一个数据范围,将数据平均分配到各个桶中;然后,在每个桶内部分别执行排序;最终按照桶的顺序将所有数据合并。原创 2023-09-22 23:08:53 · 48 阅读 · 0 评论 -
算法与数据结构面试宝典——冒泡排序算法
冒泡排序 bubble sort」通过连续地比较与交换相邻元素实现排序。这个过程就像气泡从底部升到顶部一样,因此得名冒泡排序。如下图所示,冒泡过程可以利用元素交换操作来模拟:从数组最左端开始向右遍历,依次比较相邻元素大小,如果“左元素 > 右元素”就交换它俩。遍历完成后,最大的元素会被移动到数组的最右端。原创 2023-09-22 23:02:24 · 51 阅读 · 0 评论 -
算法与数据结构面试宝典——搜索算法总结
搜索算法 searching algorithm」用于在数据结构(例如数组、链表、树或图)中搜索一个或一组满足特定条件的元素。搜索算法可根据实现思路分为以下两类。不难发现,这些知识点都已在前面的章节中介绍过,因此搜索算法对于我们来说并不陌生。在本节中,我们将从更加系统的视角切入,重新审视搜索算法。原创 2023-09-22 22:59:53 · 44 阅读 · 0 评论 -
算法与数据结构面试宝典——哈希优化策略
在算法题中,。我们借助一个算法题来加深理解。!!!question给定一个整数数组nums和一个目标元素target,请在数组中搜索“和”为target的两个元素,并返回它们的数组索引。返回任意一个解即可。原创 2023-09-22 22:58:36 · 44 阅读 · 0 评论 -
算法与数据结构面试宝典——二分查找插入点
二分查找不仅可用于搜索目标元素,还具有许多变种问题,比如搜索目标元素的插入位置。原创 2023-09-22 22:56:39 · 81 阅读 · 0 评论 -
算法与数据结构面试宝典——二分查找边界
!!question给定一个长度为n的有序数组nums,数组可能包含重复元素。请返回数组中最左一个元素target的索引。若数组中不包含该元素,则返回−1。回忆二分查找插入点的方法,搜索完成后i指向最左一个targettarget。考虑通过查找插入点的函数实现查找左边界。请注意,数组中可能不包含target,这种情况可能导致以下两种结果。inums[i]target当遇到以上两种情况时,直接返回−1即可。原创 2023-09-22 22:52:44 · 37 阅读 · 0 评论 -
算法与数据结构面试宝典——二分查找算法详解
二分查找 binary search」是一种基于分治策略的高效搜索算法。它利用数据的有序性,每轮减少一半搜索范围,直至找到目标元素或搜索区间为空为止。!!!question给定一个长度为n的数组nums,元素按从小到大的顺序排列,数组不包含重复元素。请查找并返回元素target在该数组中的索引。若数组不包含该元素,则返回−1。如下图所示,我们先初始化指针i0和jn−1,分别指向数组首元素和尾元素,代表搜索区间0n−1。请注意,中括号表示闭区间,其包含边界值本身。原创 2023-09-22 22:51:12 · 81 阅读 · 0 评论 -
算法与数据结构面试宝典——堆应用,Top-K 问题
!!question给定一个长度为n无序数组nums,请返回数组中前k大的元素。对于该问题,我们先介绍两种思路比较直接的解法,再介绍效率更高的堆解法。原创 2023-09-22 22:47:27 · 38 阅读 · 0 评论 -
算法与数据结构面试宝典——堆的创建
在某些情况下,我们希望使用一个列表的所有元素来构建一个堆,这个过程被称为“建堆操作”。原创 2023-09-22 22:44:11 · 53 阅读 · 0 评论 -
算法与数据结构面试宝典——堆及其常用操作详解
堆 heap」是一种满足特定条件的完全二叉树,主要可分为下图所示的两种类型。≥≤堆作为完全二叉树的一个特例,具有以下特性。原创 2023-09-22 22:42:54 · 58 阅读 · 0 评论 -
算法与数据结构面试——哈希表详解
哈希表 hash table」,又称「散列表」,其通过建立键key与值value之间的映射,实现高效的元素查询。具体而言,我们向哈希表输入一个键key,则可以在O1时间内获取对应的值value。如下图所示,给定n个学生,每个学生都有“姓名”和“学号”两项数据。假如我们希望实现“输入一个学号,返回对应的姓名”的查询功能,则可以采用下图所示的哈希表来实现。除哈希表外,数组和链表也可以实现查询功能,它们的效率对比如下表所示。O1OnOn表 元素查询效率对比OnOnO1O。原创 2023-09-22 16:41:04 · 62 阅读 · 0 评论 -
算法与数据结构面试——哈希冲突解决方法
因此理论上哈希冲突是不可避免的。比如,输入空间为全体整数,输出空间为数组容量大小,则必然有多个整数映射至同一数组索引。哈希冲突会导致查询结果错误,严重影响哈希表的可用性。为解决该问题,我们可以每当遇到哈希冲突时就进行哈希表扩容,直至冲突消失为止。此方法简单粗暴且有效,但效率太低,因为哈希表扩容需要进行大量的数据搬运与哈希值计算。为了提升效率,我们可以采用以下策略。哈希表的结构改良方法主要包括“链式地址”和“开放寻址”。原创 2023-09-22 16:37:45 · 51 阅读 · 0 评论 -
算法与数据结构面试宝典——哈希算法万字全面解析
当产生哈希冲突时,无论是开放寻址还是链地址法,。如果哈希冲突过于频繁,哈希表的性能则会急剧劣化。如下图所示,对于链地址哈希表,理想情况下键值对平均分布在各个桶中,达到最佳查询效率;最差情况下所有键值对都被存储到同一个桶中,时间复杂度退化至On。。观察以上公式,当哈希表容量capacity固定时,hash(),进而决定了键值对在哈希表中的分布情况。这意味着,为了减小哈希冲突的发生概率,我们应当将注意力集中在哈希算法hash()的设计上。原创 2023-09-22 16:29:00 · 761 阅读 · 1 评论 -
算法与数据结构面试宝典——贪心算法,最大切分乘积问题
给定一个正整数n,将其切分为至少两个正整数的和,求切分后所有整数的乘积最大是多少。假设我们将n切分为m个整数因子,其中第i个因子记为ni,即ni1∑mni本题目标是求得所有整数因子的最大乘积,即maxi1∏mni我们需要思考的是:切分数量m应该多大,每个ni应该是多少?原创 2023-09-22 16:18:47 · 148 阅读 · 2 评论 -
算法与数据结构面试宝典——贪心算法应用,最大容量问题
输入一个数组ht,数组中的每个元素代表一个垂直隔板的高度。数组中的任意两个隔板,以及它们之间的空间可以组成一个容器。容器的容量等于高度和宽度的乘积(即面积),其中高度由较短的隔板决定,宽度是两个隔板的数组索引之差。请在数组中选择两个隔板,使得组成的容器的容量最大,返回最大容量。容器由任意两个隔板围成,ij。根据题意,容量等于高度乘以宽度,其中高度由短板决定,宽度是两隔板的索引之差。设容量为capijcapijminhtihtj])×j−i。原创 2023-09-19 21:31:55 · 97 阅读 · 5 评论 -
算法与数据结构面试宝典——贪心算法
贪心算法 greedy algorithm」是一种常见的解决优化问题的算法,其基本思想是在问题的每个决策阶段,都选择当前看起来最优的选择,即贪心地做出局部最优的决策,以期望获得全局最优解。贪心算法简洁且高效,在许多实际问题中都有着广泛的应用。贪心算法和动态规划都常用于解决优化问题。它们之间存在一些相似之处,比如都依赖最优子结构性质,但工作原理是不同的。我们先通过例题“零钱兑换”了解贪心算法的工作原理。这道题已经在动态规划章节中介绍过,相信你对它并不陌生。给定n种硬币,第i种硬币的面值为coin。原创 2023-09-19 21:26:28 · 56 阅读 · 0 评论 -
算法与数据结构面试宝典——分数背包问题
给定n个物品,第i个物品的重量为wgti−1、价值为vali−1,和一个容量为cap的背包。每个物品只能选择一次,,问在不超过背包容量下背包中物品的最大价值。分数背包和 0-1 背包整体上非常相似,状态包含当前物品i和容量c,目标是求不超过背包容量下的最大价值。不同点在于,本题允许只选择物品的一部分。如下图所示,。原创 2023-09-19 21:24:20 · 552 阅读 · 0 评论 -
算法与数据结构面试宝典——图的遍历
树代表的是“一对多”的关系,而图则具有更高的自由度,可以表示任意的“多对多”关系。因此,我们可以把树看作是图的一种特例。显然,。图和树都都需要应用搜索算法来实现遍历操作。图的遍历方式可分为两种:「广度优先遍历 breadth-first traversal」和「深度优先遍历 depth-first traversal」。它们也常被称为「广度优先搜索 breadth-first search」和「深度优先搜索 depth-first search」,简称 BFS 和 DFS。原创 2023-09-19 17:35:35 · 90 阅读 · 0 评论 -
算法与数据结构面试宝典——图的基础操作详解
图的基础操作可分为对“边”的操作和对“顶点”的操作。在“邻接矩阵”和“邻接表”两种表示方法下,实现方式有所不同。原创 2023-09-19 17:19:09 · 50 阅读 · 0 评论 -
算法与数据结构面试宝典——图详解
图 graph」是一种非线性数据结构,由「顶点 vertex」和「边 edge」组成。我们可以将图G抽象地表示为一组顶点V和一组边E的集合。以下示例展示了一个包含 5 个顶点和 7 条边的图。VEG12345{(12131523242545)}VE如果将顶点看作节点,将边看作连接各个节点的引用(指针),我们就可以将图看作是一种从链表拓展而来的数据结构。如下图所示,,从而更为复杂。原创 2023-09-19 17:15:11 · 53 阅读 · 0 评论 -
算法与数据结构面试宝典——完全背包问题
在本节中,我们先求解另一个常见的背包问题:完全背包,再了解它的一种特例:零钱兑换。原创 2023-09-16 21:09:51 · 100 阅读 · 3 评论 -
算法与数据结构面试宝典——01背包问题
背包问题是一个非常好的动态规划入门题目,是动态规划中最常见的问题形式。其具有很多变种,例如 0-1 背包问题、完全背包问题、多重背包问题等。在本节中,我们先来求解最常见的 0-1 背包问题。!!!question观察下图,由于物品编号i从1开始计数,数组索引从0开始计数,因此物品i对应重量wgti−1和价值vali−1。我们可以将 0-1 背包问题看作是一个由n轮决策组成的过程,每个物体都有不放入和放入两种决策,因此该问题是满足决策树模型的。原创 2023-09-16 20:51:45 · 128 阅读 · 0 评论 -
算法与数据结构面试宝典——初探动态规划
动态规划 dynamic programming」是一个重要的算法范式,它将一个问题分解为一系列更小的子问题,并通过存储子问题的解来避免重复计算,从而大幅提升时间效率。在本节中,我们从一个经典例题入手,先给出它的暴力回溯解法,观察其中包含的重叠子问题,再逐步导出更高效的动态规划解法。!!!question “爬楼梯”如下图所示,对于一个3阶楼梯,共有3种方案可以爬到楼顶。本题的目标是求解方案数量,。具体来说,将爬楼梯想象为一个多轮选择的过程:从地面出发,每轮选择上1阶或2。原创 2023-09-16 20:40:42 · 89 阅读 · 0 评论 -
算法与数据结构面试宝典——编辑距离问题
编辑距离,也被称为 Levenshtein 距离,指两个字符串之间互相转换的最小修改次数,通常用于在信息检索和自然语言处理中度量两个序列的相似度。!!!question如下图所示,将kitten转换为sitting需要编辑 3 步,包括 2 次替换操作与 1 次添加操作;将hello转换为algo需要 3 步,包括 2 次替换操作和 1 次删除操作。。字符串对应树节点,一轮决策(一次编辑操作)对应树的一条边。如下图所示,在不限制操作的情况下,每个节点都可以派生出许多条边,每条边对应一种操作,这意味着从。原创 2023-09-16 20:34:49 · 244 阅读 · 0 评论 -
算法与数据结构面试宝典——动态规划解题思路
上两节介绍了动态规划问题的主要特征,接下来我们一起探究两个更加实用的问题。原创 2023-09-16 20:30:32 · 74 阅读 · 0 评论 -
算法与数据结构面试宝典——经典汉诺塔问题详解
在归并排序和构建二叉树中,我们都是将原问题分解为两个规模为原问题一半的子问题。然而对于汉诺塔问题,我们采用不同的分解策略。!!!例如f3代表将3个圆盘从A移动至C的汉诺塔问题。原创 2023-09-15 21:27:36 · 174 阅读 · 0 评论