
【进阶学习】之算法篇
文章平均质量分 70
常用算法的学习笔记,以及一些相应OJ题目的代码实战
PL_涵
路漫漫其修远兮,吾将上下而求索。在校大学生。更新自己学习知识的过程与心得。由于本人能力较低,如有不当之处,还请多多包容:)
展开
-
组合(同一集合)--经典回溯问题
回溯的关键不在于递归,而是在于“回”上,也就是回去之后要撤销掉之前的操作,具体来说,就是在return回上一层递归之后,要将之前递归的操作消除,也就是要让变量的状态回到第一次递归到该层时的初始状态,因为回溯本质上仍然是枚举。回溯可以说是递归的横向拓展,它主要是递归(纵向)+局部暴力枚举(横向),所以我们可以从递归和枚举两个方面来拆解回溯问题。在回溯算法中,我们可能经常看到“剪枝”这个词,我们知道递归算法的时间复杂度也是比较高的,尤其是在递归较深的时候,所以。实际上,对于上面的for循环嵌套,原创 2023-03-15 22:09:59 · 155 阅读 · 0 评论 -
排序算法--简单选择排序
本篇代码的思路与选择排序的原理一致,不同的是,该方法是首先以第一个元素为基准,将其与它后面的元素一一比较,只要比它小(大),就直接交换两个元素的位置,再以新的元素为基准,新元素的位置仍然是在未排序列的开头,将其继续向后一一比较,直到找到未排序列中最小(大)的元素,就将其存放在序列的开头。反复迭代上述过程,直到所有元素排序完毕。可以发现在反复迭代的过程中,每次未排序列中最小(大)的元素都会被存放到已排序列的末尾,同时,大的元素也在向未排序列末尾移动,这样也就进一步降低了时间复杂度。原创 2022-11-22 22:58:58 · 513 阅读 · 0 评论 -
广度优先搜索(BFS)
BFS(Breadth First Search,广度优先搜索,又名宽度优先搜索),与深度优先算法DFS往一个方向“死磕到底,不撞南墙不回头”的思维方式不同,广度优先搜索算法关注的重点在于对每一层结点进行下一层的访问。BFS算法和核心思路就是:从某个点一直把其邻接点走完,然后任选一个邻接点把与之邻接的未被遍历的点走完,如此反复走完所有结点。类似于树的层序遍历。所以,BFS的核心就是要把当前在哪作为一个状态存储,并将这个状态交给队列进行入队操作算法步骤(用队列实现)a) 访问指定起始点。原创 2022-11-13 17:34:48 · 5385 阅读 · 0 评论 -
哈希表--实现快速查询
哈希表(英文名字为Hash table,我们也可能会在一些算法书籍上看到散列表,其实就是哈希表,但是会有翻译的不同,所以我们知道hash table是什么就可以了)。哈希表是根据关键码的值而直接进行访问的数据结构。书本上的解释看起来可能没有什么头绪,其实直白来讲其实数组就是一张哈希表。原创 2022-11-11 17:56:54 · 1390 阅读 · 0 评论 -
算法效率分析之时间复杂度O
请回忆一下自己刚开始刷题的时候,我自己刚开始刷题的时候,经常会使用暴力法来求解一些问题(所谓暴力法,就是直接将问题的所有可能情况列举出来,然后留下符合题目要求的情况)虽然直接暴力出来的感觉很棒:)但是当题目的数据范围较大的时候,就会引出两个问题:1)所有的情况无法全部列举出来,或者说是比较难列举出来所有情况;2)即使考虑到了所有情况,但是遍历所有情况的时间已经超出题目限制了。所以,虽然能否解出问题是最重要的,但我们也需要考虑算法的时间、空间等其他效益是否合理。那么,我们该如何估计程序运行时间呢,原创 2022-11-10 21:37:16 · 620 阅读 · 0 评论 -
贪心——一种算法思想
再比如,对于背包问题,如果有一堆物品,你有一个背包体积为N,现在问我们要如何把背包尽可能装满,并且使得最终背包内所有物品的总价值最大。所以这也是为什么我们AC了贪心的题目,但可能也不知道自己用了贪心算法,因为贪心有时候就是一些常识的知识,所以会认为本来就是这么做的。其实这样算分的较细了,而我们真正刷题的时候,很难分出这么详细的解题步骤,因为有时候可能贪心的题目往往还和其他方面的知识混在一起。这题的思路很清楚,我们如果每次都拿最大金额的钞票,那么,最终肯定是拿走了最大数额的钱。2. 找出适合的贪心策略。原创 2022-11-08 10:51:42 · 153 阅读 · 0 评论 -
动态规划之背包问题篇
动态规划(Dynamic--Planning),简称DP。一、求解背包问题的算法归纳——以背包问题为例1)如果装不下当前物品,那么前n个物品的最佳组合和前n-1个物品的最佳组合是一样的。2)如果装得下当前物品。假设1 :装当前物品,在给当前物品预留了相应空间的情况下,前n-1 个物品的最佳组合加上当前物品的价值就是总价值。假设2:不装当前物品,那么前n个物品的最佳组合和前n-1个物品的最佳组合是-样的。选取假设1和假设2中较大的价值,为当前最佳组合的价值。原创 2022-11-05 16:43:09 · 542 阅读 · 0 评论 -
深度优先搜索(DFS)
剪枝,顾名思义,就是通过现有的数据判断接下来的数据无法再满足解,直接将当前结点以后的所有数据舍弃,遍历不再访问,按照程序设计要求,通过精心设计的剪枝可以使得DFS搜索的效果得到很大提升。对于一颗深度为 n 的二叉树,在没有任何优化的情况下适用DFS去搜索访问数据,其算法的时间复杂度也高达O(2^n),在数据较大的情况下DFS是无法满足程序的时间要求的。当节点v的所在边都己被探寻过或者在搜寻时结点不满足条件,搜索将回溯到发现节点v的那条边的起始节点,整个进程反复进行直到所有节点都被访问为止。原创 2022-11-03 13:21:15 · 340 阅读 · 0 评论