算法入门
文章平均质量分 84
黑子.
以创业的心态去打工。
展开
-
算法笔记-向量空间
我们平常都会听音乐。以网易云音乐为例,根据我们喜欢的音乐的风格,给我们每日推送音乐。相当多的时候,它推送的音乐正好是我们喜欢听的音乐。下面我们就总结这样一个只能推荐系统,是如何实现的。算法分析要解决这个问题,满足以下两点就可:1:找到跟你口味偏好相似的人,将他们喜欢的音乐推送给你。2:找到你喜欢的音乐相似的类型,把这些音乐推送给你。下面就根据上面两个思路实现算法。基于相似用户的推荐...原创 2019-01-15 21:11:46 · 266 阅读 · 0 评论 -
算法笔记-字符串匹配算法
在实际开发过程中,总会遇到字符串匹配或者是包含的问题。而通用的编程语言中,基本上都有实现字符串匹配的方法。例如:Java 中的 indexof() 方法,底层的实现就是用的字符串匹配的算法。本文总结两种比较简单,容易理解的两种字符串比较算法:BF 算法和 RK 算法。BF 算法BF 算法,中文叫做暴力匹配算法,又叫朴素算法。在 BF 算法中我们首先需要了解两个概念:主串和模式串。举个例子,如...原创 2019-01-04 23:08:06 · 216 阅读 · 0 评论 -
算法笔记-图的搜索
社交网络中,有一个六度分割理论,就是你跟世界任何一个人间隔的关系不会超过六度,也就是通过六步就能将你跟另一个陌生人连接起来。对应到社交好友中,你的好友就是你的一度连接,你的好友的好友就是你的二度连接,你的好友的好友的好友就是你的三度连接。对应用图存储的社交关系,找到你的一度二度三度好友就是在图中找到搜索相关的顶点。这就运用到图的搜索算法:深度优先和广度优先搜索。图结构的代码实现public...原创 2019-01-02 21:26:16 · 204 阅读 · 0 评论 -
算法笔记-图的表示
微博,微信,QQ当中,好友之间的关系就需要用图这种数据结构来存储。有关图的算法也比较多:图的搜索,最短路径,最小生成树,二分图等等。这篇文章开始总结图的知识点。什么是图图中的元素叫做顶点,元素与元素之间的连线,叫做边。用图的结构来表示微信用户之间的关系,微信用户就是图中的顶点,互为好友的用户,就用边来表示。微信用户有多少个好友,对应图中顶点的度。跟顶点相连接的边的个数,叫做顶点的度。用图...原创 2018-12-29 23:27:55 · 207 阅读 · 0 评论 -
算法笔记-二叉树2
二叉查找树:树中的任意一个节点,它的左子树节点的值都小于该节点的值,它的右子树节点的值都大于该节点的值。图例如下:二叉查找树-查找获取根节点,如果根节点为空,如果根节点的值等于该值,则返回根节点。如果该值小于根节点,则在根节点的左子树中递归查找。如果该值大于根节点,则在根节点的右子树中递归查找。代码如下://树节点class TreeNode{ int data; TreeNod...原创 2018-12-25 21:40:27 · 131 阅读 · 0 评论 -
算法笔记-Trie树
当我们在搜索引擎中输入关键字后,总会展开一个下拉列表,显示关键词相关的词汇以及内容。那么,这个搜索提示是如何实现的呢?今天总结的 Tire 树就可以实现这个功能。Tire 树是什么Tire 树也叫字典树。它是一个树形结构,专门用来处理字符串匹配的数据结构,用来解决在一组字符串集合中快速查找某个字符串的问题。上图示用六个字符串构造一个 Tire 树。这六个字符串分别是:how,hi,her,...原创 2019-01-03 21:43:18 · 237 阅读 · 0 评论 -
算法-跳表
为什么 Redis 要用跳表来实现什么是跳表二分查找中,底层数据结构是数组。如果底层数据结构换成链表,使其支持二分查找,那么就城这种数据结构为跳表。跳表是一种各方面性能都比较优秀的动态数据结构。它支持快速的查找,插入以及删除操作,实现起来也不复杂,甚至可以替代红黑树。理解跳表原始链表{1,3,4,5,7,8,9,10,13,16,17,18}一级索引{1,4,7,9,13,17}二级...原创 2018-12-18 20:54:41 · 698 阅读 · 0 评论 -
算法笔记-二叉树1
什么样的二叉树适合用数组来存储前面的一系列文章主要总结的是线性数据结构,从今天开始,总结非线性数据结构的知识点。比如:树。树先看图:通过上面的图,可以很直观的理解以下概念:根节点,子节点,兄弟节点,叶子节点。没有父节点的节点叫做根节点,比如节点 23。拥有相同的父节点的节点,称之为兄弟节点,比如节点 13 和节点 54。没有子节点的节点叫做叶子节点,比如节点 10,节点 28 等。层...原创 2018-12-24 22:01:42 · 160 阅读 · 0 评论 -
算法笔记-堆的应用
堆应用:优先级队列优先级队列,首先是一个队列,但是并非遵守先进先出的原则,而是根据队列总元素的优先级高低出列。优先级队列应用的场景非常多,后续总结的数据结构和算法都要依赖于它。比如:赫夫曼编码,图的最短路径,最小生成树等等。举例一:合并有序小文件。假如有 100 个文件,每个文件 100M,文件中存储的都是有序字符串,现在要将这些文件合并成一个有序的大文件。第一种方法,从 100 个文件...原创 2018-12-28 21:49:02 · 507 阅读 · 0 评论 -
算法笔记-贪心算法
贪心算法其实更准确的表述应该是一种算法思想。它的应用非常广泛,比如:霍夫曼编码,Prim,Kruskal 最小生成树以及 Dijkstra 单源最短路径算法。如果证明贪心算法的可行性需要复杂的数学推导,但是通过简单的举例演示更容易让我们理解这种算法思想,有助于我们在实际中运用。理解“贪心算法”如果有一个 100 kg的袋子,只允许装 5 种豆子,如何合理的在装满袋子的前提下,让袋子的总价值最大...原创 2019-01-05 22:24:48 · 639 阅读 · 0 评论 -
算法笔记-红黑树1
上一篇总结中二叉查找树支持快速查找,删除以及插入操作,时间复杂度与树的高度成正比,理想情况下是 O(logn)。但是在频繁插入删除的情况下,树的高度可能就大于 log2|n。极端情况下,树可以退化成链表这种结构,那么相应的操作效率也就下降了。针对这种情况,为了保持二叉查找树的执行效率高效,出现了平衡二叉查找树,其中最广为人知的就是红黑树。什么是平衡二叉查找树二叉树中任意节点的左右子树的高度...原创 2018-12-26 22:52:34 · 172 阅读 · 0 评论 -
算法笔记-最短路径
关于图这种数据结构总结的时候,总结了深度优先搜索和广度优先搜索,这两种算法主要是针对无权图的搜索算法。今天总结针对有权图的搜索算法,最短路径。常用的地图导航软件,规划行程的时候,会给出最短路径,最少用时,最少红绿灯等不同路径,这种的问题都可以最短路径算法解决。最短路径实现算法之初,先确定数据结构。针对地图规划,我们用有权图来表示。地图中的分叉路口映射为图中的顶点,路口与下一个路口之间的距离...原创 2019-01-10 23:23:36 · 468 阅读 · 0 评论 -
算法笔记-拓扑排序
在开发过程中,编译器编译整个项目的时候,会按照源文件的依赖顺序,依次编译。比如 A 文件的执行依赖 B 文件,那就先编译 B 文件然后才能编译 A 文件。那么编译器是如何通过文件之间的依赖关系,确定一个全局的编译顺序呢?这就用到了拓扑排序。下面在举一个例子,理解什么是拓扑排序。日常我们穿衣服的时候,衣服与衣服之间也有这种依赖关系。比如,一定要先穿内裤才可以再穿秋裤,一定要先穿短袖才可以再穿外套...原创 2019-01-09 23:41:13 · 312 阅读 · 0 评论 -
算法笔记-动态规划理论
什么样的问题适合动态规划解决一个模型:动态规划解决的问题的模型是“多阶段决策最优解模型”。动态规划一般用来解决最优问题。这个解决过程,需要经历多个决策阶段。每个决策阶段都对应一组状态,从每个决策阶段都选出一种合适的状态,组成一个决策序列,这个序列就是我们期望的最优解。三个特征:1:最优子结构。最优子结构指的是最优解包含子问题的最优解。也就是说,通过子问题的最优解,可以推导出问题的最优解。...原创 2019-01-08 21:40:26 · 215 阅读 · 0 评论 -
算法笔记-动态规划1
动态规划适合求解最优问题,比如最大值最小值等。它可以显著的降低时间复杂度,提高代码的执行效率。0-1 背包问题在上篇总结中,用回溯算法解决了 0-1背包问题。但是,在求解的过程中,我们应该能想象的出,有些步骤是一直在重复执行。如果背包的总载重为 9 ,物品个数为 5 ,质量分别为 [2,2,4,6,3]。那么将这些数据带入回溯算法的代码中,执行阶段用递归树来表示:在上图中递归树中每个节点的...原创 2019-01-07 22:32:08 · 160 阅读 · 0 评论 -
算法笔记-字符串搜索2
BM算法的核心思想在上一篇的总结中,如果模式串和当前子串不匹配,则模式串和下一个子串进行比较,比较的时候会从第一个字母开始一个一个对比。在上述的描述中,我们可以把模式串与子串的对比看作是模式串在主串上的滑动。如果当前对比不匹配,模式串就向后滑动一位,与新的子串进行对比。这样的过程,每次模式串都是移动一位。但是再实际情况中,可能主串中的字符有 c,但是模式串中并不包含该字符。那么,模式串其实可...原创 2019-01-02 22:36:37 · 157 阅读 · 0 评论 -
算法笔记-朴素贝叶斯算法
现在的手机早已经实现垃圾短信过滤和骚扰电话拦截功能,今天总结一下到底是用什么样的数据结构和算法实现这样的功能。基于黑名单的过滤器我们可以在手机上维护一个骚扰电话号码和垃圾短信发送号码的黑名单。每次收到短信或者接到来电的时候,都去黑名单进行电话号码匹配,以便识别骚扰电话和垃圾短信。那么,用什么样的数据结构存储黑名单的电话号码呢。如果数据量少的话,可以用散列表,二叉树,跳表等动态数据结构存储数据...原创 2019-01-12 23:39:24 · 271 阅读 · 0 评论 -
算法笔记-位图
网络爬虫的原理:通过解析已经爬取页面中的网页链接,然后再爬取这些链接对应的网页。但是,一个页面的链接有可能被包含在多个页面之中,这就会导致爬虫爬取过程中,重复爬取相同的页面,这就需要我们过滤一下已经爬取过的页面。最直接得方法,每次爬取新的链接的时候,都在以爬取链接的集合中查找,确认是否已经爬取过。思路简单,接下来总结用什么数据结构存储已爬取的链接。算法分析问题处理对象是网页链接,包含两个操...原创 2019-01-11 21:27:55 · 309 阅读 · 2 评论 -
算法笔记-回溯算法
在深度优先算法的总结中,就用到了回溯算法求解。回溯算法本身除了指导沃算法设计以外,在实际软件开发场景中应用也十分广泛。例如正则表达式的匹配,编译原理中的语法分析等等。如何理解回溯算法如同走迷宫一样,我们会不断地遇到分叉路口,此时可以随机选择一条路走下去。如果,后续发现这条路走不通,那么我们就返回到分叉路口的选择处,重新选择一条新的路继续走下去,直到走出迷宫。回溯的处理思想,类似于枚举搜索。我...原创 2019-01-06 23:07:35 · 590 阅读 · 0 评论 -
算法笔记-分治算法
MapReduce 是 Google 大数据处理的三大马车之一,它在倒排索引,PageRank 计算,网页分析等搜索引擎相关技术中都有大量的应用。而 MapReduce 主要的思想就是分治思想。如何理解分治算法分治算法的核心思想就是分而治之。将原问题分解成 n 个规模较小,但是结构与原问题相似的子问题,递归解决这些问题,最后合并结果,就完成了问题的解答。分治算法中用到了递归的方法求解,二者却...原创 2019-01-06 17:21:57 · 285 阅读 · 0 评论 -
算法笔记-哈希算法2
哈希算法在分布式系统中有哪些引用哈希算法应用之负载均衡负载均衡的算法有很多,诸如:轮询,随机,加权轮询等等。哈希算法可以帮助我们实现一个会话粘滞的负载均衡算法。会话粘滞:让同一个客户端每次请求访问的时候,固定的访问某台服务器。简单直接的方法:维护一张客户端与服务端映射关系的表。每次客户端发起请求的时候,从映射表中查找到映射关系,再路由到对应的服务端。但是这种方法存在下面几种弊端:1,如果客户...原创 2018-12-23 22:28:20 · 185 阅读 · 0 评论 -
算法笔记-递归
如何用三行代码找到最终推荐人本文创作灵感来源于 极客时间 王争老师的《数据结构与算法之美》课程,通过课后反思以及借鉴各位学友的发言总结,现整理出自己的知识架构,以便日后温故知新,查漏补缺。是什么什么是递归递归是一种非常高效、简洁的编码技巧,一种应用非常广泛的算法。通过调用自身从而解决问题,调用称之为递,返回称之为归。为什么为什么使用递归递归其实是一种解决问题思想的具现化。即将某...原创 2018-12-11 21:52:29 · 222 阅读 · 0 评论 -
算法笔记-数组
数据结构之数组本文创作灵感来源于 极客时间 王争老师的《数据结构与算法之美》课程,通过课后反思以及借鉴各位学友的发言总结,现整理出自己的知识架构,以便日后温故知新,查漏补缺。是什么什么是数组数组是一种线性表数据结构,在内存空间中占据连续的空间,并且存储着相同类型的数据。为什么为什么要出现数组这种数据结构把相同类型的一系列数据统一编制到某一个组别中,这样就可以通过数组名+索引号简...原创 2018-12-06 23:11:37 · 160 阅读 · 0 评论 -
算法-排序2
归并排序,快速排序本文创作灵感来源于 极客时间 王争老师的《数据结构与算法之美》课程,通过课后反思以及借鉴各位学友的发言总结,现整理出自己的知识架构,以便日后温故知新,查漏补缺。归并排序归并排序的算法思路:将待排序的数组一分为二,然后分别对两段数组排序,然后合并两段有序数组。归并排序的核心思想就是分治思想,分而治之。先将大问题一步一步分解成小问题,然后对小问题求解,所有的小问题解决...原创 2018-12-13 22:35:37 · 106 阅读 · 0 评论 -
算法笔记-复杂度分析1
算法复杂度分析本文创作灵感来源于 极客时间 王争老师的《数据结构与算法之美》课程,通过课后反思以及借鉴各位学友的发言总结,现整理出自己的知识架构,以便日后温故知新,查漏补缺。是什么什么是算法复杂度分析?通过时间和空间两个维度来评估算法和数据结构的性能。用时间复杂度 (时间渐进复杂度) 和空间复杂度 (空间渐进复杂度)两个概念来描述性能问题,统称复杂度。算法复杂度描述的是算法执行时间以...原创 2018-12-03 23:31:10 · 211 阅读 · 0 评论 -
算法-排序1
冒泡排序,选择排序,插入排序本文创作灵感来源于 极客时间 王争老师的《数据结构与算法之美》课程,通过课后反思以及借鉴各位学友的发言总结,现整理出自己的知识架构,以便日后温故知新,查漏补缺。如何分析一个排序算法排序算法的执行效率最好情况,最坏情况,平均时间复杂度。待排序数据的有序度对于排序算法的执行效率有着明显的影响,所以需要区分这三个时间复杂度。比较时间复杂度的系数,常数,低阶。在分析...原创 2018-12-12 21:38:40 · 242 阅读 · 0 评论 -
算法笔记-链表2
如何轻松写出正确的链表代码本文创作灵感来源于 极客时间 王争老师的《数据结构与算法之美》课程,通过课后反思以及借鉴各位学友的发言总结,现整理出自己的知识架构,以便日后温故知新,查漏补缺。理解了链表的基础知识,但是距离写出正确的链表代码还是有一段差距的,这个差距就需要我们反复练习,总结,归纳,再练习。王争老师提供了以下几点技巧,帮助我们迅速提高自己写出正确链表代码的动手能力。理解指针或者引用的...原创 2018-12-08 20:33:23 · 168 阅读 · 0 评论 -
算法笔记-链表1
数据结构之链表本文创作灵感来源于 极客时间 王争老师的《数据结构与算法之美》课程,通过课后反思以及借鉴各位学友的发言总结,现整理出自己的知识架构,以便日后温故知新,查漏补缺。是什么什么是链表数据结构上:链表也是一种线性表数据结构。内存结构上:链表不需要连续的内存空间,通过指针将零散的内存块串联起来,构成链表的存储空间。链表中每一块内存区域又叫节点,节点中保存有基础数据,以及指向下一个...原创 2018-12-07 23:18:58 · 231 阅读 · 0 评论 -
算法笔记-复杂度分析2
时间复杂度四个概念本文创作灵感来源于 极客时间 王争老师的《数据结构与算法之美》课程,通过课后反思以及借鉴各位学友的发言总结,现整理出自己的知识架构,以便日后温故知新,查漏补缺。是什么什么是时间复杂度四个概念最好情况时间复杂度:在最理想的情况上,执行这段代码的时间复杂度。最坏情况时间复杂度:在最糟糕的情况上,执行这段代码的时间复杂度。平均情况时间复杂度:用代码在所有情况下执行的次数的...原创 2018-12-04 22:56:56 · 159 阅读 · 0 评论 -
简说插入排序
插入排序该篇文章为本人阅读《算法》一书所做笔记以及知识总结,以供未来查阅定义 插入排序是一种简单的插入排序法,其基本思想是:把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列。—— [ 百度百科 ]解释说明在插入排序中,每次确定一个元素的插入位置,在确定过程中,我们会将该元素依次与前一个元素作...原创 2018-04-23 08:46:41 · 136 阅读 · 0 评论 -
算法笔记-散列表1
Word文档中的单词拼写检查功能是如何实现的什么是散列表散列表用的是数组支持按照下标随机访问数据的时候,时间复杂度为 O(1)的特性。我们通过散列函数将元素的键值映射为下标,然后将元素存储在数组中对应下标的位置。查找元素的时候,通过散列函数将键值转化为数组下标,然后从数组中取出对应下标位置上的元素。什么是散列思想某校举办运动会,共有 100 名运动员,编号从 0 到 99。如果我们将运动员...原创 2018-12-19 20:26:18 · 136 阅读 · 0 评论 -
算法笔记-栈
通过栈实现浏览器的后退前进功能本文创作灵感来源于 极客时间 王争老师的《数据结构与算法之美》课程,通过课后反思以及借鉴各位学友的发言总结,现整理出自己的知识架构,以便日后温故知新,查漏补缺。是什么什么是栈栈也是一种线性数据结构,由于实现的方式不同分为:顺序栈和链表栈。栈是一种操作受限的线性数据结构,只允许在一端进行插入和删除操作,也就是先进后出,后进先出。为什么为什么有栈这种数据...原创 2018-12-09 16:11:04 · 144 阅读 · 0 评论 -
算法-排序3
桶排序,计数排序,基数排序本文创作灵感来源于 极客时间 王争老师的《数据结构与算法之美》课程,通过课后反思以及借鉴各位学友的发言总结,现整理出自己的知识架构,以便日后温故知新,查漏补缺。上述三种排序算法的时间复杂度为 O(n),所以称之为线性排序。之所以能做到线性排序,是因为上述排序实现的思想不是基于比较的排序。这三种排序对数据的要求比较苛刻,所以重要的是理解这三种排序应用的场景。桶排序...原创 2018-12-14 21:52:43 · 121 阅读 · 0 评论 -
算法-二分查找2
如何快速定位IP对应的省份二分查找的四种变形:查找第一个值等于给定值得元素,查找最后一个值等于给定值得元素,查找第一个大于等于给定值得元素,查找最后一个小于等于给定值得元素。同时,今天的这四种情况,给定数据集合同样是有序的,但是却有重复元素。变体一:查找第一个值等于给定值得元素先看代码: public static int searchOne(int[] list,int num){ ...原创 2018-12-17 22:17:51 · 201 阅读 · 0 评论 -
算法笔记-哈希算法1
什么是哈希算法将任意长度的二进制值串映射为固定长度的二进制值串,这个映射规则就是哈希算法,映射得到的值就叫哈希值。设计一个优秀的哈希算法,需要注意以下几点:1:从哈希值不能反向推导出原始数据,所以哈希算法也叫单项哈希算法。2:对输入数据非常敏感,哪怕原始数据修改了 1 个 Bit,最后得到得哈希值也不一样。3:散列冲突的概率要小,对于不同的原始数据,得到的哈希值相同的概率要小。4:哈希...原创 2018-12-22 18:07:01 · 596 阅读 · 0 评论 -
算法笔记-堆排序
为什么说堆排序没有快速排序快堆排序是一种原地的,时间复杂度为 O(nlogn) 的排序算法。快速排序的时间复杂度也是 O(nlogn),甚至堆排序比快速排序的时间复杂度还要稳定,但是快速排序的性能要比堆排序好。什么是堆堆是一个完全二叉树。堆上任一节点的值都大于等于它的左右子树的值,或者小于等于它的左右子树的值。对于每个节点大于等于子树的堆,叫做大顶堆。对于每个节点小于等于子树的堆,叫做...原创 2018-12-27 22:00:50 · 162 阅读 · 0 评论 -
算法笔记-散列表3
为什么散列表和链表会经常一起使用LRU缓存淘汰算法总结链表那篇文章中,曾经实现过LRU缓存淘汰算法,但是当时的删除插入操作时间复杂是 O(n)。如果用散列表加链表的方式实现LRU缓存淘汰算法,时间复杂度就变成O(1)。数据的存贮我们用散列表实现,散列冲突用链表法解决。如果有相同散列值的元素,我们就将其插入到该散列值对应位置链表的尾部,链表上的节点都有一个 hnext 指针,指向该链表的后后...原创 2018-12-21 21:50:21 · 181 阅读 · 0 评论 -
算法笔记-队列
队列在线程池等有限资源池中的应用本文创作灵感来源于 极客时间 王争老师的《数据结构与算法之美》课程,通过课后反思以及借鉴各位学友的发言总结,现整理出自己的知识架构,以便日后温故知新,查漏补缺。是什么什么是队列队列也是一种操作受限的线性数据结构,只提供入列和出列两种操作,遵循先进先出原则:先入列的元素优先出列队列中又区分了普通队列,循环队列,阻塞队列以及并发队列。不同的类型有着不同的实际...原创 2018-12-10 22:34:58 · 150 阅读 · 0 评论 -
算法-二分查找1
如何最省内存实现快速查找二分查找也叫折半查找,是一种针对有序集合的查找算法。二分查找的思想:在长度为 n 的数组最中查找值等于 m 的元素位置,先用数组中间位置 mid 上的元素与其相比。等于 m 则返回 mid 的值,如果小于 m 则在数组 0 至 mid-1 区间上按照此方法继续比较查找,如果大于 m 则在数组 mid + 1 至 n 区间上按照此方法据需比较查找。通过上述描述,我们能发...原创 2018-12-16 21:06:59 · 489 阅读 · 0 评论 -
算法-排序4(总结)
如何显示一个通用的,高性能的排序算法。总结一下前面学过的几种排序算法算法时间复杂度是稳定排序 ?是原地排序?冒泡排序O(n^2)✔✔插入排序O(n^2)✔✔选择排序O(n^2)✖✔快速排序O(n*logn)✖✔归并排序O(n*logn)✔✖计数排序O(n+k) k是数据范围✔✖桶排序O(n)✔...原创 2018-12-15 19:41:36 · 206 阅读 · 2 评论