![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
极客-算法
约定写代码
虽然8年前开始学习更好,但今天开始学习,总要好过明天再开始。
展开
-
图:两点之间的最短距离
文章出处:极客时间《数据结构和算法之美》-作者:王争。该系列文章是本人的学习笔记。1 问题阐述像 Google 地图、百度地图、高德地图这样的地图软件,如果想从家开车到公司,你只需要输入起始、结束地址,地图就会给你规划一条最优出行路线。这里的最优,有很多种定义,比如最短路线、最少用时路线、最少红绿灯路线等等。我们先解决最简单的,最短路线。2 算法解析解决软件开发中的实际问题,最重要的一点就是建模,也就是将复杂的场景抽象成具体的数据结构。我们把每个岔路口看作一个顶点,岔路口与岔路口之间的路看作一条边,原创 2020-11-14 14:57:44 · 3895 阅读 · 0 评论 -
数据结构与算法总结(完结)
极客时间算法学习之后开始跟着花花酱刷题。大概从4月份开始的。从今天开始(2020-8-24)开始做总结,复习一下已经刷过的题目。到目前为止leetcode刷题323道。1刷题原则根据花花酱建议,梳理出以下结论。要刷多少题1 每个类型 10-20,总共200-300题如何刷题1 同类型题目一起刷2 看代码很重要,看至少3-5种不同实现3 第一遍:5分钟想不出来就看答案;第二遍:尝试不看答案完整实现,一道题目不超过60min;第三遍:尝试快速实现,15-20min实现不了就看答案4 完整的手写原创 2020-08-24 09:13:12 · 1120 阅读 · 1 评论 -
拓扑排序两种实现方式
文章出处:极客时间《数据结构和算法之美》-作者:王争。该系列文章是本人的学习笔记。拓扑排序能解决的问题在一个项目中会有很多源代码文件。编译器在编译代码的时候需要按照依赖关系,依次编译每个源文件。例如A.java依赖B.java,那就需要先编译B.java,再编译A.java。要想完整编译整个项目就需要确定一个全局的编译顺序。确定这样一个全局的编译顺序就用到拓扑排序。拓扑排序就是解决有向无环图...原创 2020-04-10 09:55:16 · 594 阅读 · 0 评论 -
A*算法
Dijkstra不能解决的问题在Dijkstra类似BFS,从起始节点找到距离最短的节点,一层一层向外扩展,直到找到目标节点。在有些时候这种策略看起来比较蠢。例如在上图中要找到顶点0到顶点10的最短路径。优先选择距离最短的节点1,2,3。而这些节点显然是距离目标节点越来越远的。那么我们不再只是考虑dist这一个因素,再考虑节点与目标节点的欧几里得距离。这种策略称为启发式搜索。那么A搜索与D...原创 2020-04-10 00:23:50 · 237 阅读 · 0 评论 -
Dijkstrala算法
Dijkstrala算法查找图中从一个节点到另一个节点的最短路径,输出结果是最短路径以及长度。算法执行的前提条件是权重不能是负数。起始顶点记为sid,目的节点记为tid。数组predecessor记录了最短路径上一个节点的前驱节点。例如predecessor[3]=5,就是从节点5到节点3的路径最短。节点Vertext,保存节点id、当前节点距离sid的最短路径值。优先队列queue按照节...原创 2020-04-06 16:12:45 · 350 阅读 · 0 评论 -
算法四——哈希
哈希算法的定义文章来自极客时间。参考网页定义:将任意长度的二进制值串映射为固定长度的二进制值串。映射之后的二进制值串称为哈希值。符合几点要求: 1 从哈希值不能推导出原文。 2 原文有一个bit的值发生变化,哈希值不相同。 3 散列冲突的概率要小,对于不同的原文产生相同哈希值的概率要小。 4 高效,对长文本生成哈希值也要非常快。哈希算法的常见应用1 安全加密最常用于加密的算法...原创 2019-06-25 22:43:28 · 1882 阅读 · 0 评论 -
极客时间算法练习题总结
文章出处:极客时间《数据结构和算法之美》-作者:王争。该系列文章是本人的学习笔记。在极客时间《数据结构和算法之美》最后,王争老师加餐了7天训练内容,对每一部分需要掌握的数据结构与算法做了总结。现在我把这些题目放在一起,并且和自己写的代码做了超链接。数组实现一个支持动态扩容的数组实现一个大小固定的有序数组,支持动态增删改操作实现两个有序数组合并为一个有序数组...原创 2019-11-14 22:19:53 · 743 阅读 · 0 评论 -
动态规划——矩阵中的最短路径长度
文章出处:极客时间《数据结构和算法之美》-作者:王争。该系列文章是本人的学习笔记。题目假设我们有一个 n 乘以 n 的矩阵 w[n][n]。矩阵存储的都是正整数。棋子起始位置在左上角,终止位置在右下角。我们将棋子从左上角移动到右下角。每次只能向右或者向下移动一位。从左上角到右下角,会有很多不同的路径可以走。我们把每条路径经过的数字加起来看作路径的长度。那从左上角移动到右下角的最短路径长度是多少...原创 2019-08-12 12:51:59 · 2605 阅读 · 0 评论 -
动态规划——0-1背包问题
文章出处:极客时间《数据结构和算法之美》-作者:王争。该系列文章是本人的学习笔记。1 0-1背包问题背包能够承受的总重量一定w,每个物品的总量不同int[] weight表示。怎么放才能让背包中物品的总重量最大。每次决定一种物品,要不要放入到背包中。当物品放完了或者总重量等于w,就停止放入,选择最大的总量保存下来。2 用回溯法实现 public class Package { ...原创 2019-08-11 18:25:51 · 316 阅读 · 0 评论 -
算法八——动态规划
每次决定一种物品,每一层能够达到的状态 state[][]第0个物品的重量是2,要么装入背包,要么不装入背包,决策之后会对应背包中的两种状态,背包中的总总量是0或者2.我们用state[0][0]=true,state[0][2]=true来表示这两种状态。第1个物品的重量是2,要么装入背包,要么不装入背包,决策之后对应的背包状态:0+0=00+2=22+2=4这是基于上一步背包的状...原创 2019-08-11 17:02:18 · 129 阅读 · 0 评论 -
动态规划——背包问题升级
背包能够承受的总重量一定w,每个物品的总量不同int[] weight表示,每个物品的价值不同用int[] values表示。怎么放才能让背包中物品不超过最大重量,而且价值最大。每次决定一种物品,要不要放入到背包中。当物品放完了或者总重量等于w,就停止放入,选择最大的总量保存下来。...原创 2019-08-15 12:56:08 · 345 阅读 · 0 评论 -
动态规划——最长递增子序列
我们有一个数字序列包含 n 个不同的数字,如何求出这个序列中的最长递增子序列长度?比如 2, 9, 3, 6, 5, 1, 7 这样一组数字序列,它的最长递增子序列就是 2, 3, 5, 7,所以最长递增子序列的长度是 4。...原创 2019-08-16 08:40:36 · 673 阅读 · 0 评论 -
工程中选择数据结构和算法的依据
1. 时间、空间复杂度不能和性能划等号时间、空间复杂度不是时间执行和内存消耗的精确值。它们只是表示了随着数据量的增长,时间、空间的增长趋势。代码的执行时间有时不跟时间复杂度成正比。我们常说算法是O(nlogn),O(n2n^2n2)这些都是基于大数据量(例如>50>50>50),在小数据量的时候可能O(n2n^2n2)比O(nlogn)更快。对于不同问题,不同算法之间不能做复杂度比较。复杂度...原创 2019-08-28 08:45:18 · 745 阅读 · 0 评论 -
动态规划——变形的杨辉三角形
我们现在对杨辉三角进行一些改造。每个位置的数字可以随意填写,经过某个数字只能到达下面一层相邻的两个数字。假设你站在第一层,往下移动,我们把移动到最底层所经过的所有数字之和,定义为路径的长度。请你编程求出从最高层移动到最底层的最短路径长度。...原创 2019-08-19 08:43:30 · 281 阅读 · 0 评论 -
算法七——分治算法
MapReduce本质就是一个分值算法。# 什么是分治算法分治算法的核心是:分而治之。也就是将原问题分解为n个规模较小,并且结构与原问题相似的子问题,递归地解决这些子问题,并且合并子问题的结果得到原问题的解。与递归的区别:递归是一种编程技巧,分治是一种算法思想。使用分治法的步骤:1 分解:将原问题分解为一系列子问题;2 解决:递归地解决各个子问题,当问题足够小,可以直接求解;3 合并:将子问题的结果合并为原问题的解原创 2019-08-22 08:24:39 · 656 阅读 · 0 评论 -
动态规划——双11既可以薅羊毛还能花钱最少
淘宝的“双十一”购物节有各种促销活动,比如“满 200 元减 50 元”。假设你的购物车中有 n 个(n>100)想买的商品,希望从里面选几个,在凑够满减条件的前提下,让选出来的商品价格总和最大程度地接近满减条件(200 元),这样就可以极大限度地“薅羊毛”。...原创 2019-08-17 11:19:41 · 588 阅读 · 0 评论 -
动态规划几种状态剪裁比较
我们前面看过了0-1背包问题,矩阵最短路径长度问题和莱文斯坦最短 编辑距离问题。在三个问题的状态树中。0-1背包问题:用(i,cw)表示状态。i 表示要将要处理第i个物品,cw表示当前总重量。因为(i,cw)有重复的,所以使用动态规划。矩阵最短路径长度:用(i,j,currentPathSum)表示状态。表示当前将要处理第i行第j列的数据,在处理之前已经走过的路径长度是currentPath...原创 2019-08-17 11:51:03 · 216 阅读 · 0 评论 -
数据结构十——队列
# 1 队列队列:可以想象成排队买票,先来的人先买,后到的人站在队尾。先进者先出,这就是队列。队列的操作:入队(enqueue)、出队(dequeue)。入队:在队列尾部添加一个元素。出队:在队列头部移除一个元素。原创 2019-08-27 08:45:25 · 315 阅读 · 0 评论 -
算法十——深度优先搜索和广度优先搜索
# 搜索算法算法是作用于数据结构之上的。深度优先搜索、广度优先搜索是作用于图这种数据结构之上的。图上的搜索算法可以理解为从一个顶点到另外一个顶点。常用的搜索算法有:暴力的深度优先搜索、广度优先搜索,还有A*、IDA*等启发式搜索。原创 2019-08-27 08:54:47 · 344 阅读 · 0 评论 -
数据结构四——散列表(上)
1散列表的由来2散列函数2.1散列函数的三点要求3散列冲突3.1开放寻址法线性探测平方探测再哈希3.2 链表法4散列函数与内存4.1动态装载因子4.2 避免低效扩容5 如何选择冲突解决方法6工业级散列表举例分析6.1 Java的HashMap6.2 工业级散列表应该具有的特征6.3 工业级散列表设计思路...原创 2019-06-21 07:12:17 · 354 阅读 · 0 评论 -
数据结构四——散列表(下)
7 散列表+链表的应用7.1 LRU 缓存淘汰算法7.2 Redis有序集合7.3 Java LinkedHashMap7.4 散列表+链表结构特点原创 2019-06-21 02:30:12 · 188 阅读 · 0 评论 -
关于Java中的HashMap
1 容量总是2次幂/** * Returns a power of two size for the given target capacity. */ static final int tableSizeFor(int cap) { int n = cap - 1; n |= n >>> 1; n |...原创 2019-09-24 08:26:39 · 95 阅读 · 0 评论 -
算法二——二分查找
思考题目1 用最省内存的方式查找数据。2 快速定位ip所在省市原创 2019-05-31 07:18:31 · 951 阅读 · 0 评论 -
数据结构九——栈
# 1栈的定义## 1.1 栈的定义栈:后进者先出,先进着后出。就像一碟盘子,如果拿走一个盘子,拿走的一定是最后放上去的那个。栈是一种操作受限的线性表,只允许在一端插入和删除。本质上来说就是一个操作不方便的数组或者链表。原创 2019-08-24 01:20:35 · 246 阅读 · 0 评论 -
动态规划——最长公共子序列长度
最长公共子串长度是编辑距离的另外一种表示方法。只允许添加、删除字符两种惭怍。它表征的是两字符串之间的相似度。解决思路是:如果a[i]=b[j],则 公共子串长度加1,继续考察a[i+1]和b[j+1]。如果a[i]!=b[j],则删除a[i]或者在b[j]前面添加字符a[i],继续 考察a[i+1]和b[j];或者 删除b[j]或者在a[i]前面添加字符b[j],继续考察a[i]和b[j+...原创 2019-08-15 00:21:05 · 496 阅读 · 0 评论 -
数据结构六——堆
1 堆定义1.1 定义和结构1.2 操作和存储结构1.2.1 插入元素1.2.2 删除堆顶元素2 堆排序2.1建堆2.2 排序2.3 时间复杂度2.4 为什么使用快排而不是堆排序3 思考堆除了排序还有什么用处?...原创 2019-07-03 08:21:11 · 285 阅读 · 0 评论 -
数据结构五——二叉树
内容、图片来自极客时间专栏《数据结构与算法之美》。1 树1.1 概念概念:树、根、父节点、子节点、叶子节点。几个度:高度、深度、层。与实际生活中的这几个概念类比。高度:从下往上数(从叶子往根),从0开始。深度:从上往下看(从根往叶子),从0开始。层数:深度+11.2 二叉树定义:每个节点最多有两个子节点。 满二叉树:除了叶子节点没有子节点,其余每个节点都有2个子节点。 完...原创 2019-06-26 23:05:01 · 330 阅读 · 0 评论 -
用递归树求解递归算法时间复杂度
递归代码复杂度分析起来比较麻烦。一般来说有两种分析方法:递推公式和递归树。1 递推公式法归并排序的递推公式是:merge_sort(p…r) = merge(merge_sort(p…q), merge_sort(q+1…r))终止条件:p >= r 不用再继续分解我们假设对n个元素排序的时间是T(n),那分解成两个子数组排序的时间是T(n2)T(\dfrac{n}{2})T(...原创 2019-07-01 23:27:38 · 17802 阅读 · 4 评论 -
算法三——递归
递归算法介绍原创 2019-06-25 21:54:59 · 233 阅读 · 0 评论 -
数据结构三——跳表
跳表的由来说明:图片来自极客时间由来 二分查找的数据结构是数组,利用数组随机访问的特定查找的时间复杂度是O(logn)。如果数据结构是链表,可以达到这样的速度吗?答案是可以的。只是要改造。改造之后的结构就是跳表,是一种动态数据结构,可以支持快速的插入、删除、查找、按范围查找。功能类似于红黑树。Redis中的有序集合使用的就是跳表。跳表的结构 对于单链表来说,存储的数据是有序的,想要...原创 2019-06-13 08:07:58 · 422 阅读 · 0 评论 -
算法一——排序
分析排序算法的角度算法的执行效率算法的执行效率一般从时间复杂度以及比较、交换次数来考虑。时间复杂度时间复杂度需要考虑最好情况、最坏情况、平均情况时间复杂度。同时我们需要考虑复杂度的洗漱、常数和低阶。这是因为时间复杂度反应的是数据闺蜜n很大时候的一个增长趋势,所以会忽略系数、常数、低阶。但是实际软件开发中,n可能是10、100、1000。这个时候就不能忽略系数、常数、低阶。比较、交换次数...原创 2019-05-22 22:44:04 · 233 阅读 · 0 评论 -
数据结构二——链表
底层存储数组:一块连续的内存空间。链表:用指针串起来的一组零散的内存空间。链表分类:单链表、双向链表、循环链表内存块是连接的节点。每个节点存储数据和指向下一个节点的指针。第一个节点叫做头结点,最后一个节点叫做尾节点。尾节点的next=null。操作特点1 插入、删除很快,O(1)。2 想要随机访问只能从头节点开始遍历,数到第k个节点。平均时间复杂度O(n)。想象队列就是一个排队的...原创 2019-05-16 23:00:40 · 221 阅读 · 0 评论 -
数据结构一—— 数组
如何实现随机访问数组是一种线性表数据结构。它用一组连续的内存空间,来存储一组具有相同类型的数据。线性表线性表的数据最多只有前和后两个方向。数组、栈、队列、链表都是线性表。非线性表:树、图、堆。连续的内存空间a[i]_address=base_address+i∗data_type_sizea[i]\_address=base\_address+i*data\_type\_sizea[i...原创 2019-05-16 07:34:21 · 284 阅读 · 0 评论 -
复杂度分析
事后统计法测试结果依赖环境;2 与测试的数据集大小有关大O复杂度表示法所有代码的执行时间T(n)与每行代码的执行次数n成正比. $T(n)=O(f(n))$时间复杂度分析1 只关注循环次数最多的一段代码。2 加法法则:总复杂度等级两级最大的那代码的复杂度。3 乘法法则:嵌套代码的复杂度=嵌套内外代码复杂度的乘积。几种常见的复杂度1 O(1)O(1)表示是常量级别,并...原创 2019-05-08 00:00:13 · 118 阅读 · 0 评论 -
数据结构六——堆的应用
文章内容、图片均来自极客时间。堆比较适合动态数据的场景。1 应用一:优先级队列一个优先级队列就是一个堆。1.1 合并小文件假设我们有100个小文件。每个文件中的字符串按照从小到大排序好了。现在需要把这100个小文件合并为1个大文件,并且还要按照字符串从小到大排序。 这和归并排序算法的合并操作有点类似。我们从每个文件读取一条数据,形成一个长度为100的数组。然后排序数组,将最小的文本写...原创 2019-07-09 12:53:32 · 182 阅读 · 0 评论 -
数据结构七——图
1 基本概念顶点、边微信:A和B是好朋友,B也和A是好朋友,A和B之间有条边。入度:每个顶点链接的边的个数=每个人好朋友的个数。微博:A关注B,B不用关注A。从A到B有条边,边是有方向的。这样的图是有向图。入度:有多条边指向这个节点。出度:从这个顶点出发,有几条边。QQ亲密度:两个人经常聊天,那亲密度高。这就是带权重的边。2 图的存储方式2.1 邻接矩阵用二维数组存储图。优点:表...原创 2019-07-10 00:25:37 · 160 阅读 · 0 评论 -
算法五——字符串匹配(上)
文章内容、图片均来自极客时间。1 概念和用途字符串匹配:查找一个字符串A在字符串B中是否出现,这个过程就是字符串匹配。A称为模式串,B称为主串。主串的长度记为n,模式串长度记为m。n>mn>mn>m。在java中有String的indexOf用就是字符串匹配。字符串匹配有基础的BF算法、高效的KMP算法。2 BF算法BF=Brute Force 暴力搜...原创 2019-07-14 06:11:42 · 337 阅读 · 0 评论 -
动态规划总结
文章出处:极客时间《数据结构和算法之美》-作者:王争。该系列文章是本人的学习笔记。动态规划的文章已经写了好几篇了。现在看下在实际开发中如何应用动态规划。也就是说前面几道题目可以解决哪些问题。双11凑单问题,其实就是0-1背包问题。莱文斯坦编辑距离和最长公共子串长度,可以用于解决输入搜索词的自动纠错功能。四种算法的区别和联系。分治法与其他算法完全隔开,思路不同。分治法把一个问题分为多个子问题...原创 2019-08-20 08:12:14 · 158 阅读 · 0 评论 -
动态规划——莱文斯坦距离
文章出处:极客时间《数据结构和算法之美》-作者:王争。该系列文章是本人的学习笔记。莱文斯坦距离在搜索引擎中会有搜索词纠错的功能。这个功能背后的原理是编辑距离。编辑距离编辑距离是量化两个词之间的相似度。 编辑距离是指将一个字符串变为另外一个字符串,需要的最少编辑操作次数。编辑操作包含新增一个字符、修改一个字符、删除一个字符。编辑次数越少,编辑距离越小,两个字符串相似度越大。如果两个字符串完...原创 2019-08-14 08:06:15 · 2397 阅读 · 3 评论 -
动态规划6个题目总结比较
这里是一个表格。目标状态与目标值是什么?多阶段决策问题,按照什么分阶段?按照目标状态分阶段。 考察完所有物品,最大重量。那就按照物品分阶段。 到达(n-1,n-1)时的最短路径长度,那就按照所在位置分阶段。 考察完数组最后一个元素后的最长递增子序列长度,那就按数组中每一个元素分阶段。 考察完所有物品后总价格最低,那就按照物品分阶段。 支付w元时的最少硬币数量,那就按照支付...原创 2019-08-18 23:19:25 · 447 阅读 · 0 评论