算法
Michael阿明
两个孩子的父亲,8年机械工程师,已转行互联网做算法,一起继续加油!高举智慧,她就使你高升;怀抱智慧,她就使你尊荣。-- 箴言(4:8)
展开
-
《数据结构与算法之美》学习汇总
此篇文章是对自己学习这门课程的一个总结和课后的一些练习,做一个汇总,希望对大家有帮助。本人是半路程序员,2018年2月开始学习C++的,下面的代码基本都是C++11版本的,代码有错误的地方请不吝留言赐教。附有部分练习LeetCode、POJ的题目。原创 2019-04-22 21:13:00 · 24048 阅读 · 218 评论 -
10种C++排序算法
10种C++版本排序算法原创 2018-07-12 19:09:33 · 2986 阅读 · 42 评论 -
快速排序quicksort算法优化
1.基本想想快速排序使用分治的思想通过一趟排序将待排序列分割成两部分,其中一部分所有元素均比基准大,另一部分均比基准小分别对这两部分元素继续进行排序,以达到整个序列有序2.快排的步骤1.选择基准 在待排序列中,按照某种方式挑出一个元素,作为 “基准”(pivot)2.分割操作 在基准左边的元素都比该基准小,在基准右边的元素都比基准大 3.递归 递归地对两个序列进...原创 2018-07-21 23:57:09 · 1231 阅读 · 4 评论 -
快速排序quicksort算法细节优化(一次申请内存/无额外内存排序)
对链接中快速排序进行代码优化https://blog.csdn.net/qq_21201267/article/details/80993672#t61.只申请一次内存,避免多次递归调用时反复的申请和释放内存,提高程序运行效率/* * 6-1-opti1.快速排序(best version)(三数取中基准+希尔排序+基准群)(opti1,只申请一次内存) * 对数组找出一个中间大小...原创 2018-08-09 01:56:00 · 1646 阅读 · 0 评论 -
算法--递归--走台阶问题(2种递归+递归改循环)
递归:一个问题可以分解成若干子问题,且求解思路一样,当到一定的情况下有终止条件,这样的问题可以用递归方法求解注意事项:递归调用深度太大,栈空间会耗尽溢出注意避免调用中某些值的重复计算(见以下代码3)递归,频繁调用函数,时间成本高(见以下代码1)递归代码可以改成循环代码 (见以下代码2)问题给你 n 个台阶,你的最大步幅是2步,可以一次走1步,也可以一次走2步,问有多少种走法?...原创 2019-04-06 15:26:19 · 3714 阅读 · 2 评论 -
算法--递归--汉诺塔问题
游戏规则:一次只能挪一片;小的只能在大的上面;把所有的从A柱挪到C柱。递推公式:上部 n - 1 个 A 到 B;最底下 1 个 A 到 C ;上部 n - 1 个 B 到 C;终止条件:n = 1 时,A 到 C;/** * @description: 汉诺塔递归问题 * @author: michael ming * @date: 2019/4/7 20:10 * ...原创 2019-04-07 20:58:02 · 2067 阅读 · 10 评论 -
算法--排序--寻找数组内第K大的元素
此题目,需要用到快速排序里的划分数组操作:快排参考:https://blog.csdn.net/qq_21201267/article/details/81516569#t2先选取一个合适的哨兵(三数取中法)将数组分成三部分【小于哨兵的】【哨兵】【大于等于哨兵的】然后看哨兵的下标+1 == K吗?等于就返回哨兵,不等则在一侧递归调用该划分方法复杂度:平均情况下,遍历一次数组找到哨兵是...原创 2019-04-13 17:43:38 · 837 阅读 · 0 评论 -
算法--排序--大小写字母数字分离(桶排序思想)
题目: 对D,a,F,B,c,A,z这个字符串进行排序,要求将其中所有小写字母都排在大写字母的前面,但小写字母内部和大写字母内部不要求有序。比如经过排序之后为a,c,z,D,F,B,A,这个如何来实现呢?如果字符串中存储的不仅有大小写字母,还有数字。要将小写字母的放到前面,大写字母放在中间,数字放在最后,不用排序算法,又该怎么解决呢?思路:先扫描一遍数组,计算3种类型的元素个数,计算出每个类...原创 2019-04-13 20:41:40 · 2184 阅读 · 0 评论 -
算法--二分查找--求平方根(循环法/递归法)
二分查找:数据需要是顺序表(数组)数据必须有序可以一次排序,多次查找;如果数据频繁插入,删除操作,就必须保证每次操作后有序,或者查找前继续排序,这样成本高,二分查找不合适数据太小,不用二分查找,直接遍历数据太大,也不用,因为数组需要连续的内存,存储数据比较吃力复杂度 lg2n题目: 求一个数的平方根例如:二分法求根号5a:折半: 5/2=2.5b:平方校验:...原创 2019-04-15 23:37:05 · 4865 阅读 · 0 评论 -
算法--二分查找--查找给定条件的值
1.数据有序且无重复,查找给定值/** * @description: 数据有序(小到大)且无重复,查找给定值 * @author: michael ming * @date: 2019/4/16 18:54 * @modified by: */#include <iostream>#define N 10using namespace std;int binar...原创 2019-04-17 00:51:24 · 1422 阅读 · 0 评论 -
算法--Hash算法及其应用场所
文章目录1.Hash算法定义2.应用2.1 安全加密2.2 唯一标识2.3 数据校验2.4 散列函数2.5 负载均衡2.6 数据分片2.7 分布式存储1.Hash算法定义哈希算法:将任意长度的二进制值串映射为固定长度的二进制值串,这个映射的规则就是哈希算法,而通过原始数据映射之后得到的二进制值串就是哈希值。设计一个优秀的哈希算法并不容易,需要满足的几点要求:1· 从哈希值不能反向推导出原...转载 2019-05-07 23:51:33 · 891 阅读 · 0 评论 -
求大于n的最小质数
hash取模运算时选取比最大值还大的质数,就可以有效减少冲突。有定理,一个数如果不能被2到它的平方根的所有数整除,它就是质数。/** * @description: 求大于n的最小质数 * @author: michael ming * @date: 2019/5/9 22:35 * @modified by: */#include <stdio.h>#includ...原创 2019-05-09 23:09:10 · 5144 阅读 · 0 评论 -
图Graph--寻找二度好友(BFS应用)
社交网络可以用图来表示(查阅图的概念)。寻找二度好友,这个问题就非常适合用图的广度优先搜索BFS算法来解决,因为广度优先搜索是层层往外推进的。首先,遍历与起始顶点最近的一层顶点,也就是用户的一度好友然后再遍历与用户距离的边数为2的顶点,也就是二度好友关系只需要稍加改造一下广度优先搜索代码,用一个数组来记录每个顶点与起始顶点的距离,非常容易就可以找出二度好友关系...原创 2019-06-13 00:28:10 · 1937 阅读 · 0 评论 -
图Graph--农夫过河问题(BFS/DFS应用)
农夫过河问题:原创 2019-06-13 22:25:25 · 3073 阅读 · 0 评论 -
图Graph--最小生成树
文章目录1.概念1.概念对图运用不同的遍历方法就可能得到图的不同遍历顺序,每一种遍历顺序对应于一棵生成树对于无向连通图,所有的生成树中必有一棵树的所有边的权的总和最小的,称之为最小生成树(Minimum cost spanning tree)...原创 2019-06-14 19:35:56 · 1210 阅读 · 0 评论 -
字符串匹配算法(BF & RK)
文章目录1. BF(brute force)暴力匹配1. BF(brute force)暴力匹配BF算法的思想,在主串中,检查起始位置分别是0、1、2…n-m且长度为m的n-m+1个子串,看有没有跟模式串匹配的。最坏情况下每次都要对比m个字符,对比次数n-m+1次,复杂度O(m*n)...原创 2019-06-17 23:41:46 · 1167 阅读 · 2 评论 -
字符串匹配算法(BM)
文章目录1. BM(Boyer-Moore)算法1. BM(Boyer-Moore)算法思想:有模式串中不存在的字符,那么肯定不匹配,往后多移动几位,提高效率BM原理:坏字符规则,好后缀规则...原创 2019-06-22 04:12:15 · 32657 阅读 · 42 评论 -
字符串匹配算法(KMP)
文章目录1. KMP由来2. KMP算法基本原理1. KMP由来上一节说的BM算法是最高效、最常用的字符串匹配算法。最知名的却是KMP,它3位作者(D.E.Knuth,J.H.Morris,V.R.Pratt),算法的全称是Knuth Morris Pratt 算法,简称KMP算法。2. KMP算法基本原理类似于BM里的概念:坏字符(不能匹配的),好前缀(已经匹配的那段)K...原创 2019-06-22 21:22:27 · 1140 阅读 · 2 评论 -
字符串匹配算法(Trie树)
文章目录1. Trie树概念2. Trie树操作2.1 存储2.2 插入2.3 查询1. Trie树概念Trie树,也叫字典树,它是一个树形结构。是一种专门处理字符串匹配的数据结构,用来解决在一组字符串集合中快速查找某个字符串。Trie树本质,利用字符串之间的公共前缀,将重复的前缀合并在一起。2. Trie树操作2.1 存储Trie树是一个多叉树;二叉树的数据结构里存放着左右子节...原创 2019-06-25 01:25:37 · 6557 阅读 · 2 评论 -
字符串匹配算法(AC自动机 Aho-Corasick)
文章目录1. 多模式串匹配2. 经典多模式串匹配--AC自动机1. 多模式串匹配前面学的BF、RK、BM、KMP都是单模式串匹配算法(一个模式串,一个主串)多模式串匹配,即在一个主串中查找多个模式串(Trie树是多模式匹配)比如实现多个敏感词过滤;单模式需要一遍遍的,扫描,过滤,扫描,过滤;多模式扫描一遍,过滤完成2. 经典多模式串匹配–AC自动机AC自动机算法(Aho-Cora...原创 2019-06-27 02:05:43 · 1847 阅读 · 0 评论 -
贪心算法(Greedy Algorithm)之霍夫曼编码
文章目录1. 贪心算法2. 应用2.1 找零钱1. 贪心算法我们希望在一定的限制条件下,获得一个最优解每次都在当前的标准下做出当下最优决策(整体不一定最优),做出的决策不可以后悔,即不回溯,最终可以得到较为满意的解贪心算法不追求最优解,节省时间,避免穷尽所有可能2. 应用2.1 找零钱给定金额的找零,用最少张(枚)钱给顾客。(总是优先给大额的)...原创 2019-07-01 00:55:45 · 1326 阅读 · 0 评论 -
贪心应用--汽车加油次数问题
文章目录1. 问题描述2. 解题思路3. 实现代码4. 测试结果1. 问题描述已知汽车的油箱额定里程,到目的地的路途中各加油站距起点的距离,求如何加油,让加油的次数最少。2. 解题思路每次出发前检查下一个加油站有多远,车子能不能跑得到能到,就不加油不能到,就加油如果加了油,还不能到,说明不能到达目的地3. 实现代码/** * @description: 已知路上各加油站的距...原创 2019-07-03 21:18:43 · 931 阅读 · 0 评论 -
分治算法(Divide & Conquer)
文章目录1. 分治算法思想1. 分治算法思想分治算法的核心思想就是,分而治之,将原问题划分成n个规模较小,并且结构与原问题相似的子问题,递归地解决这些子问题,然后再合并其结果,就得到原问题的解。分治算法一般都比较适合用递归来实现。分治算法的递归实现中,每一层递归都会涉及这样三个操作:-1- 分解:将原问题分解成一系列子问题;-2- 解决:递归地求解各个子问题,若子问题足够小,则直接求解...原创 2019-07-04 01:16:05 · 2918 阅读 · 0 评论 -
分治应用--最近点对问题 & POJ 3714
文章目录二维平面上有n个点,如何快速计算出两个距离最近的点对?有两个nn的矩阵A,B,如何快速求解两个矩阵的乘积 C=AB?原创 2019-07-04 01:17:36 · 2148 阅读 · 0 评论 -
分治应用--万里挑一 找假硬币
文章目录1. 问题描述2.解题思路3. 代码实现1. 问题描述n 个硬币中有1枚是假币,真假币唯一的区别是假币重量轻,如何快速找出假币2.解题思路暴力做法,一个一个的称重,O(n)复杂度分治思路将硬币等分成两份,若为奇数,多出一枚,放在天平两边轻的一边包含假币,若相等,则假币是多出的那一枚对轻的一边继续上述操作,直到找出假币3. 代码实现...原创 2019-07-06 20:33:29 · 2396 阅读 · 0 评论 -
回溯算法(Backtracking Algorithm)之八皇后问题
文章目录1. 回溯算法思想2. 算法应用2.1 八皇后问题1. 回溯算法思想前面讲过贪心算法并不能保证得到最优解,那怎么得到最优解呢?回溯思想,有点类似枚举搜索。枚举所有的解,找到满足期望的解。为了有规律地枚举所有可能的解,避免遗漏和重复,把问题求解的过程分为多个阶段。每个阶段,我们都会面对一个岔路口,我们先随意选一条路走,当发现这条路走不通的时候(不符合期望的解),就回退到上一个岔路...原创 2019-07-06 23:39:07 · 2238 阅读 · 1 评论 -
回溯应用-- 0-1背包问题
文章目录1. 问题描述2. 回溯解决思路1. 问题描述0-1背包非常经典,很多场景都可以抽象成这个问题。经典解法是动态规划,回溯简单但没有那么高效。有一个背包,背包总的承载重量是 W kg。现有n个物品,每个物品重量不等,并且不可分割。选择几件物品,装到背包中。在不超过背包所能装载重量的前提下,如何让背包中物品总重量最大?物品是不可分割的,要么装要么不装,所以叫 0-1背包问题。2...原创 2019-07-09 01:21:48 · 1286 阅读 · 0 评论 -
动态规划算法(Dynamic Programming)之0-1背包问题
文章目录1. 问题引入1. 问题引入前面讲了0-1背包的回溯解决方法,它是穷举所有可能,复杂度是指数级别的,如何降低时间复杂度呢?对于一组不同重量、不可分割的物品,我们需要选择一些装入背包,在满足背包最大重量限制的前提下,背包中物品总重量的最大值是多少呢?假设背包的最大承载重量是9。有5个不同的物品,重量分别是2,2,4,6,3。把回溯求解过程,用递归树画出来,就是下面这个样子:...原创 2019-07-16 00:40:10 · 1969 阅读 · 0 评论 -
动态规划应用--双11购物凑单
双11购物节的时候,某宝给你很多张满300减50的优惠券,你想组合各种商品的价格总和>=300,且金额总和越接近300越好,这样可以多薅点羊毛。原创 2019-07-17 00:46:51 · 2080 阅读 · 2 评论 -
动态规划应用--“杨辉三角”最短路径 & LeetCode 120
对“杨辉三角"进行一些改造。每个位置的数字可以随意填写,经过某个数字只能到达下面一层相邻的两个数字。假设你站在第一层,往下移动,我们把移动到最底层所经过的所有数字之和,定义为路径的长度。请你编程求出从最高层移动到最底层的最短路径。...原创 2019-07-17 23:02:29 · 2753 阅读 · 0 评论 -
动态规划理论学习
文章目录1. 理论总结1.1 “一个模型”1.2 “三个特征”1.2.1 最优子结构1.2.2 无后效性1.2.3 重复子问题2. 实例剖析2.1 问题描述1. 理论总结动态规划理论总结为“一个模型、三个特征”。1.1 “一个模型”它指的是动态规划适合解决的问题的模型。我把这个模型定义为“多阶段决策最优解模型"。一般是用动态规划来解决最优问题。解决问题的过程,需要经历多个决策阶段。每...原创 2019-07-19 00:26:52 · 946 阅读 · 3 评论 -
动态规划应用--找零钱
文章目录1. 问题描述2. 问题分析1. 问题描述找零问题,在贪心算法讲过。假设有几种不同币值的硬币v1,v2,.……vn(单位是元)。如果要支付w元,求最少需要多少个硬币。比如,有3种不同的硬币,1元、3元、5元,我们要支付9元,最少需要3个硬币(3个3元的硬币)。2. 问题分析...原创 2019-07-20 15:05:47 · 1088 阅读 · 0 评论 -
动态规划应用--搜索引擎拼写纠错
文章目录1. 字符串相似度1.1 莱文斯坦距离1.2 最长公共子串长度2. 计算编辑距离2.1 莱文斯坦距离2.2 最长公共子串长度在Trie树那节讲过,利用Trie可以进行关键词提示,节省输入时间。在搜索框中你不小心打错了字,它也会智能提醒你是不是要搜XXX1. 字符串相似度如何量化两个字符串的相似度?有一个非常著名方法,编辑距离(Edit Distance)。编辑距离,将一个字符串...原创 2019-07-24 00:46:31 · 1097 阅读 · 0 评论 -
图Graph--拓扑排序(Topological Sorting)
文章目录1. 拓扑排序一个项目往往会包含很多代码源文件。编译器在编译整个项目时,需按照依赖关系,依次编译每个源文件。比如,A.cpp依赖B.cpp,那在编译时,编译器需要先编译B.cpp,才能编译A.cpp。编译器通过分析源文件或者编译配置文件(比如Makefile文件),来获取这种局部的依赖关系。那编译器又该如何通过源文件两两之间的局部依赖关系,确定一个全局的编译顺序呢?1. 拓扑排序...原创 2019-07-28 00:15:00 · 1963 阅读 · 0 评论 -
图Graph--最短路径算法(Shortest Path Algorithm)
文章目录1. 算法解析BFS,DFS 这两种算法主要是针对无权图的搜索算法。针对有权图,图中的每条边都有权重,如何计算两点之间的最短路径(经过的边的权重和最小)呢?像Google地图、百度地图、高德地图这样的地图软件,你只需要输入起始、结束地址,就会给你规划一条最优出行路线。比如最短路线、最少用时、最少红绿灯等等。1. 算法解析我们先解决最简单的,最短路线。把地图抽象成图最合适不...原创 2019-08-01 00:13:41 · 2195 阅读 · 0 评论 -
朴素贝叶斯算法--过滤垃圾短信
文章目录1. 基于黑名单过滤2. 基于规则过滤3. 基于概率统计过滤上一节我们讲到,如何用位图、布隆过滤器,来过滤重复数据。今天,我们再讲一个跟过滤相关的问题,如何过滤垃圾短信?1. 基于黑名单过滤我们可以维护一个骚扰电话号码和垃圾短信发送号码的黑名单。这个黑名单的搜集,有很多途径,比如,我们可以从一些公开的网站上下载,也可以通过类似“360骚扰电话拦截”的功能,通过用户自主标记骚扰电话来收...原创 2019-08-07 08:13:57 · 4638 阅读 · 0 评论 -
向量空间 Vector Space -- 推荐系统
文章目录1. 算法解析2. 基于相似用户做推荐3. 基于相似歌曲做推荐4. 总结音乐App的功能越来越强大,不仅可以自己选歌听,还可以根据你听歌的口味偏好,给你推荐可能会喜爱的音乐,有时候,推荐的还非常适合你的口味。1. 算法解析用两句话总结:找到跟你口味相似的用户,把他们爱听的歌曲推荐给你找出跟你喜爱的歌曲特征相似的歌曲,把这些歌曲推荐给你2. 基于相似用户做推荐把跟你听类似歌...原创 2019-08-07 21:08:43 · 1993 阅读 · 0 评论 -
A*搜索算法--游戏寻路
文章目录1. 算法解析2. 总结仙剑奇侠传这类MMRPG游戏中,有人物角色自动寻路功能。当人物处于游戏地图中某位置时,点击另一个相对较远的位置,人物就会自动地绕过障碍物走过去。这个功能是怎么实现的呢?1. 算法解析这是一个非常典型的搜索问题。起点是当下位置,终点是鼠标点击位置。找一条路径。路径要绕过地图中所有障碍,并且走的路不能太绕。最短路径显然是最聪明的走法,是最优解。但是如果图非常大,...原创 2019-08-09 23:06:01 · 929 阅读 · 0 评论 -
并行算法 Parallel Algorithm -- 提高执行效率
文章目录1. 并行排序2. 并行查找3. 并行字符串匹配4. 并行搜索5. 总结时间复杂度是衡量算法执行效率的一种标准。但是,时间复杂度 != 性能。即便在不降低时间复杂度的情况下,也可以通过一些优化手段,提升代码的执行效率。即便是像10%、20%这样微小的性能提升,也是非常可观的。算法的目的就是为了提高代码执行效率。当算法无法再继续优化的情况下,该如何来进一步提高执行效率呢?一种非常简单又...原创 2019-08-10 00:39:44 · 2790 阅读 · 0 评论 -
搜索引擎背后的数据结构和算法
文章目录像百度、Google这样的搜索引擎,在我们平时的工作、生活中,几乎天天都会用到。如果我们把搜索引擎也当作一个互联网产品的话,那它跟社交、电商这些类型的产品相比,有一个非常大的区别,那就是,它是一个技术驱动的产品。所谓技术驱动是指,搜索引擎实现起来,技术难度非常大,技术的好坏直接决定了这个产品的核心竞争力。在搜索引擎的设计与实现中,会用到大量的算法。有很多针对特定问题的算法,也有很多我们...原创 2019-08-10 14:43:40 · 1252 阅读 · 1 评论