Dive Deep in Algorithm
文章平均质量分 66
Tech In Pieces
这个作者很懒,什么都没留下…
展开
-
经典算法-简短解释(面试向)
排序算法冒泡:双指针,每次遍历只排好一个的顺序选择:分为两个区 有序区和无序区。无序区和有序区随着我们遍历次数的增加而此消彼长。每次我们都只遍历无序区,然后找出其中最大/最小的放在有序区的最后或者最前面。(无序放入有序,扫描无序)插入:也是分成有序区和无序区,,但是这次对于每个无序区的数据,我们在有序区内扫描,找到这个数据的位置,插进去。(无序插入有序,扫描有序)快速:任意选取一个pivot(基准元素),遍历其他的元素,小的放前大的放后。这样,我们每遍历一遍,不管其他元素如何,pivot的位置是肯定原创 2021-06-17 04:30:00 · 237 阅读 · 0 评论 -
算法Tips大总结
Two Pointers:针对双指针滑动窗口的经典写法: 右指针不断往右边移,移动到不能往右边继续移动为止(究竟什么是不能动了 就根据具体的题目来定)当右指针到最右边以后 开始挪动左指针 释放窗口左边界。(经典题目:第 3 题,第 76 题,第 209 题,第 424 题,第 438 题,第 567 题,第 713 题,第 763 题,第 845 题,第 881 题,第 904 题,第 978 题,第 992 题,第 1004 题,第 1040 题,第 1052 题。特别经典的题目:第 239 题,第 4原创 2021-01-03 02:34:52 · 273 阅读 · 0 评论 -
算法类型大总结(并附经典题型)
排序算法:冒泡排序插入排序选择排序希尔 Shell 排序快速排序归并排序堆排序线性排序算法自省排序间接排序计数排序基数排序桶排序外部排序 - k 路归并败者树外部排序 - 最佳归并树递归与分治(Divide and Conquer)二分搜索/查找大整数的乘法?Strassen 矩阵乘法棋盘覆盖合并排序快速排序线性时间选择最接近点对问题循环赛日程表DP:矩阵连乘问题最长公共子序列最大子段和凸多边形最优三角剖分多边形游戏图像压缩电路布线原创 2021-01-02 07:07:56 · 3056 阅读 · 2 评论 -
关于时间和空间复杂度的进一步说明
//下面的代码用Go写的时间复杂度和空间复杂度一. 时间复杂度数据规模1s 内能解决问题的数据规模:O(n2) 算法可以处理 104 级别的数据规模(保守估计,处理 1000 级别的问题肯定没问题)O(n) 算法可以处理 108 级别的数据规模(保守估计,处理 107 级别的问题肯定没问题)O(nlog n) 算法可以处理 107 级别的数据规模(保守估计,处理 106级别的问题肯定没问题)一些具有迷惑性的例子:void hello (int n){ for( int sz =原创 2021-01-02 05:29:27 · 361 阅读 · 0 评论 -
哈希函数之MD5算法
此算法全称为:MD5 Message-Digest Algorithm。他是密码散列函数 可以产生一个128位的散列值(hash value)。但是这种算法在1996年之后被证明存在弱点,可以被破解。2004年被证明MD5无法防止碰撞攻击,因此不适用于安全认证,比如SSL公开密钥认证或者数字签名等用途。2011年,RFC 6151 禁止MD5用作密钥散列消息认证码。现在一般用SHA-2.参考维基百科...原创 2021-01-02 04:17:02 · 436 阅读 · 0 评论 -
哈希函数之SHA家族
我们之前就听说过这个家族,但是并不是很熟悉。今天就来仔细看一下。SHA,全称:Secure Hash Algorithm. 是一个密码散列函数家族,他能把任意长度的信息,投影成长度固定的字符串。虽然并不是完美的哈希函数(也并不存在完美的哈希函数一说)。本算法是由美国国家安全局(NSA)所设计,并由美国国家标准与技术研究院(NIST)发布,是美国的政府标准。其发展历程如下:SHA-0:1993年发布,当时称做安全散列标准(Secure Hash Standard),发布之后很快就被NSA撤回,是SHA原创 2021-01-02 04:08:28 · 1238 阅读 · 1 评论 -
别人的《算法图解》笔记+自己的一些思考
前言:这个笔记我大致浏览了一下 非常简略 但是有一些非常好的观察。也给出了不少需要注意的点。正文:仅当列表是有序的 二分查找才有效,但是要注意顺序是不是重要,如果重要我们才能预排序。而且要注意有时候反过来想:有时候我们需要查找一些东西,而且是顺序并不重要 这个时候我们要想起来用二分查找进行优化,而不是题目提示你用二分查找你才想起来。每个递归函数都有两部分,基线条件(base case) 和 递归条件(recursive case)。递归条件指的是函数调用自己,基线条件指的是函数不再调用自己,从而.原创 2021-01-02 03:58:40 · 135 阅读 · 0 评论 -
路径(Path)相关的问题的思路
如果只需要得出一条成功的路径,或者问是否存在这种路径—如果问的是最短路径,那就是那三个经典算法 用hashmap来记录所有的边 用另外一个hashmap来记录此点和对应的最短路径。如果需要输出所有的可能的路径那就是backtracking, 而backtracking就是DFS+回溯...原创 2020-12-30 02:54:04 · 314 阅读 · 0 评论 -
LeetCode在解决图相关的问题的一些深入的思考
1 DFS和BFS 说到底是遍历所有的节点的算法,而visited这个辅助存储 就是为了防止再走之前走过的节点。但是如果我们有个问题 需要遍历所有的边怎么办?(就像332. Reconstruct Itinerary 我们要遍历所有的边 而且只有一次 返回最小的字典序的节点组合)2 针对自己不想用DFS的问题(主要是想递归实在太蛋疼)而且有的时候 明明是DFS更适合 却一定要用BFS。其实自己仔细想一下 dfs也没啥大问题 只要想清楚我们这个DFS函数的含义就行了,至于里面的参数 无非就是Map,visi原创 2020-12-23 10:28:13 · 60 阅读 · 0 评论 -
算法题目各种常见系列
注意 这些系列就像follow up一样,有的时候虽然题目相似 但是做法完全不同linkedlist系列:各种反转找环判断起点two sum/three sum/four sum系列subset系列(排列组合系列二)stocking系列coin change系列arrange meeting系列矩阵旋转系列数学题系列(各种溢出 边界问题)树的pre/in/post/level order的各种简单变形:zigzag,利用其中两种还原树,复制树等等...原创 2020-12-23 10:25:29 · 138 阅读 · 0 评论 -
模板问题:Knapsack (LeetCode: Coin Change)[背包问题九讲笔记]
1原创 2020-12-19 05:29:03 · 311 阅读 · 0 评论 -
动态规划如何输出路径?
动态规划的大部分题目 都是不需要输出具体的路径的,但是万一要输出路径呢?下面来看一下动态规划如何输出路径,以背包问题为例:一般而言,背包问题是要求一个最优值,如果要求输出这个最优值的方案(路径),可以参照一般动态规划问题输出方案的方法:记录下每个状态的最优值是由状态转移方程的哪一项推出来的,换句话说,记录下它是由哪一个策略推出来的。便可根据这条策略找到上一个状态,从上一个状态接着向前推即可。这也就意味着 我们必须要维护一个状态数组 这个数组和DP数组一样,每个元素必须记录着这个状态是由哪个元素转移过原创 2020-12-19 05:22:37 · 2438 阅读 · 1 评论 -
【读书笔记】Algorithm Design and Analysis
前言:这是我的早期作品 当时所知甚少 刚开始会用python print.因此 这篇文章只适合初学者,当然,也适合进阶者对算法知识的系统性回顾。重要的和常忘的在文中会重点标出来。第五章 分治法5.1,5.2 Merge sort and quick sort都属于分治法的实现。其中,快速排序应用十分广泛,而且有许多改进版本,quick sort能解决的一个重要问题就是荷兰国旗问题,他要求对于R,W,B构成的任意数组变成严格的RWB顺序。5.3 分治法在二叉树上的应用表现在其能在遍历二叉树时有不同原创 2020-12-19 00:00:01 · 479 阅读 · 1 评论 -
自底向上和自顶向下的动态规划,备忘录,回溯法有什么区别?
就是说DP, memo, Backtracking之间有什么区别?回溯法是带剪枝的穷举(就是说虽然是穷举 但是如果能尽可能的提前发现苗头不对 立刻就不往下进行了)原创 2020-12-14 00:42:16 · 1733 阅读 · 0 评论 -
什么是蓄水池抽样(Reservoir Sampling)算法?
首先 我们要知道这种算法到底是干嘛的?它通常用于解决大数据流中的数据的随机抽样问题。进一步简化来说 当内存无法加载全部数据的时候 如何从包含位置大小的数据流中随机选取K个数据,并且要保证每个数据被抽取到的概率相等。首先,针对不同的K 我们需要有不同的策略:当K=1的时候我们需要保证 假设数据流含有N个数 每个数被抽到的概率应该为1/N应该这样做:数据流中第i个数被保留的概率为 1/i 。只要采取这种策略,只需要遍历一遍数据流就可以得到采样值,并且保证所有数被选取的概率均为 1/N 。为什么这种原创 2020-12-09 23:31:49 · 908 阅读 · 0 评论 -
克服递归带来的恐惧感
本人的递归水平一直很烂 有一段时间不写代码 再写的时候 就会不自觉的避开递归的想法 而且平常做的题目 比如树或者图的DFS,或者backtracking DP等等 只要能避开递归就避开 长此以往,每次遇到一个新的题目,自己的思维里面跟本就没有递归思想,或者就算知道这种应该递归做但是心里仍然在打怵,所以接下来就说一下最适合我的递归思路。首先就不要怕 怕个锤子 不就是写错了嘛 又不是说递归一定是对的啥的。然后就是想一想参数列表,这些参数 有些是我们真正的输入,比如整个图的hashmap,有些参数 是我们在递原创 2020-12-05 00:36:42 · 143 阅读 · 0 评论 -
尾递归和非尾递归(线性递归)的区别
尾递归格式:story() {XXXX;story();}线性递归格式:story() {XXX;story();XXX;}尾递归,比线性递归多一个参数,这个参数是上一次调用函数得到的结果;所以,关键点在于,尾递归每次调用都在收集结果,避免了线性递归不收集结果只能依次展开消耗内存的坏处。是否选择尾递归 和我们是不是要return 要return什么其实没有太大的关系。return只是一个终止的条件 你可以提前终止 也可以return 下一个递归 代表还是会继续往下走。...原创 2020-12-05 00:11:45 · 490 阅读 · 0 评论 -
算法题目需要我们排序,该怎么办?
不要再憨憨的只想到:自己手动写排序/用Arrays.sort()/或者给Arrays.sort加个自定义的比较器啥的。虽然说这三种方法也挺不错的,但是也不要那么局限。其他的方法:用PQ/堆,这个也是跟Arrays.sort()一样 都是Java里面自己写好的 只需要调用就行了。其他的想到就再补充吧。...原创 2020-12-03 00:20:55 · 71 阅读 · 0 评论 -
图的最短路径算法汇总
这种题目在图里面也不算非常常见 但是一旦见到 这算法就很明显 所以看到这种题目就应该立刻想到最短路径算法 然后需要立刻定位到自己需要用的那种算法。不然虽然知道最短路径算法 但是不知道要选择哪个 就会十分慌乱 心态立刻就崩了。所以本文就回顾一下有哪些图的最短路径算法,这些算法的应用场景有哪些?我们经常遇见的问题有哪些种类?经常遇见的问题总类:确定起点 求最短路径确定终点 求最短路径(跟确定起点的没有区别)确定起点终点的最短路径全局最短路径(即找到所有两点之间的最短路径 可以想象的到 最后要返回一个二原创 2020-11-30 04:21:18 · 489 阅读 · 0 评论 -
Dijkstra算法和Prim算法有什么区别?
这两个算法十分相似:但是Dijkstra算法用于构建单源点的最短路径树:即从一个图中,找到这样一个树,使得这个树的根节点到任何节点的距离都是能到达这个节点的路径的最短的那条。(就是从图中的任何一点出发 能找到其去往任何节点的最短路径)Prime算法用于构建最小生成树(MST)即书中的所有路径的和最小,即我们要从这个图中找出一棵树(就是包含了所有的节点 但是没有环)使得其包含的边的权重和最小。这个算法只能用于无向图。这种算法适用场景:构建电路板,线的总长度越小越好。...原创 2020-11-30 04:05:39 · 2716 阅读 · 1 评论 -
图的最短路径的Floyd-Warshall算法,为什么要把k放在最外层?
因为这种算法是基于动态规划思想虽然看上去应该是下面这个样子:dis[i][j] = Math.min(dis[i][j], dis[i][k] + dis[k][j]) where k from i to j.但是实际上 应该是下面这个样子这个公式才表示我们到底是选择k还是不选择k,但是不管怎么样 都是从上个状态k-1转移过来的。然后我们可以发现最外一层空间可以省略,因为f(k)只和f(k-1)有关。所以dp阶段实际上是跟这个有关 所以我们必须先解决了k-1才能继续解决k的问题 所以要把放在最外原创 2020-11-30 03:52:28 · 419 阅读 · 0 评论 -
Dijkstra算法的本质是贪心(Greedy),还是动态规划(Dynamic Programming)?
refer: https://www.zhihu.com/question/22311234关于贪心和动态规划的区分 一直没想明白,所以借这个机会加深一下印象贪心是一种特殊的动态规划,因为动态规划的本质是独立的子问题 而贪心的本质是吗欸此找到当前的最优解(就是说我们有几个选择 我们不知道选择了一个之后会经历什么 我们只是选择当前最佳的选择)。贪心和动态规划不是互斥的。贪心更快,但是约束更强 适用范围更小。为什么知道这些那么重要?因为现在已经见过许许多多的问题了 很多问题都是最优化问题 比如求最大最原创 2020-11-30 03:19:22 · 2884 阅读 · 0 评论