算法入门
介绍常见算法
十步杀一人_千里不留行
当你还不能写出自己满意的程序时,你就不要去睡觉。
展开
-
查找 - 计算式查找法 - 哈希法
1、哈希函数的构造方法> 数字分析法假设关键字 Key 为 8 位十进制整数:① 确定哈希表的长度,示例:100,即地址空间为 0 ~ 99② 确定 “取值比较均匀分布” 的位置,示例:第四位和第七位③ 则哈希函数为 H(Key) = H(ABCDEFGH) = DG④ 示例: H(81301367) = 06、 H(81346532) = 43> 平方取中法假设关键字 Key 为大写...原创 2018-04-20 09:26:37 · 897 阅读 · 0 评论 -
程序员的算法课(15)-分治法获取文件中出现频次最高100词
一、问题描述这个问题在大数据面试中容易出现,问题如下:有一个1G大小的一个文件,里面每一行是一个词,词的大小不超过16字节,内存限制大小是1M,要求返回频数最高的100个词。二、思路此处1G文件远远大于1M内存,分治法,先hash映射把大文件分成很多个小文件,具体操作如下:读文件中,对于每个词x,取hash(x)%5000,然后按照该值存到5000个小文件(记为f0,f1,...,...原创 2019-08-25 17:50:26 · 1963 阅读 · 1 评论 -
程序员的算法课(14)-Hash算法-对海量url判重
前面给大家讲了哈希表(散列)这种数据结构,那么使用哈希表来解决实际问题,那就是Hash算法了,我们一起来看看。一、Hash算法的概念Hash算法(Hash Algorithm),简称散列算法,也成哈希算法(英译),是将一个大文件映射成一个小串字符。与指纹一样,就是以较短的信息来保证文件的唯一性的标志,这种标志与文件的每一个字节都相关,而且难以找到逆向规律。举个列子:服务器存了1...原创 2019-08-25 17:48:55 · 2263 阅读 · 2 评论 -
程序员的算法课(13)-分治法
一、什么是分治【百度百科】分治法((Divide and Conquer))可以通俗的解释为:把一片领土分解,分解为若干块小部分,然后一块块地占领征服,被分解的可以是不同的政治派别或是其他什么,然后让他们彼此异化。分治法的精髓:分--将问题分解为规模更小的子问题; 治--将这些规模更小的子问题逐个击破; 合--将已解决的子问题合并,最终得出“母”问题的解;在计算机科学中,分治法是...原创 2019-08-25 17:48:01 · 891 阅读 · 0 评论 -
程序员的算法课(11)-KMP算法
一、KMP算法定义【百度百科】KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特—莫里斯—普拉特操作(简称KMP算法)。KMP算法的核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是通过一个next()函数实现,函数本身包含了模式串的局部匹配信息。KMP算法的时间复杂度O(m...原创 2019-08-25 17:47:17 · 1080 阅读 · 0 评论 -
程序员的算法课(12)-使用通配符*,?等来查找字符串
一、前言相信大家都用过文本编辑器(EditPlus,notepad++,sublime..)、Word或者开发IDE工具(IDEA,Eclipse..);甚至于你应该也写过不少SQL语句;你也用过百度、谷歌(怎么上谷歌我也不会,不要问我)搜过你要的内容。里面都会有个很重要的功能,那就是搜索,而搜索的方式中,对于通配符搜索我想大家也不会陌生。【百度百科】通配符是一种特殊语句,主要有星号(*)...原创 2019-08-22 23:09:33 · 1270 阅读 · 0 评论 -
程序员的算法课(10)-字符串排序算法实例(纯代码)
一、低位优先(Least-Signifcant-Digit First,LSD)字符串的低位优先排序算法目的就是将一组字符串按照从右到左的顺序依次比较指定索引位置的字符大小并排序。根据上述字符串的分组算法的逻辑,很容易使用下面的代码实现:下面的代码实质上就是将一组字符串按照倒数第一个字符分组(最后一个字符相同的,分组前后相对顺序不变),接着再按照倒数第二个字符分组(倒数第二个字符相同的,分组前...原创 2019-08-22 22:52:21 · 910 阅读 · 0 评论 -
程序员的算法课(9)-常见字符串算法
一. 字符串排序算法1.低位优先(Least-Signifcant-Digit First,LSD)该算法要求被排序的每个字符串长度都相等。它会把字符串当成数字,从字符串的右边开始向左检查字符(相当于从数字的最低位到高位)。2. 高位优先(MSD)的字符串排序它不要求被排序的字符串等长,而且不一定需要检查所有的输入就能完成排序。该算法将从左开始向右检查字符(就像通常我们比较字符串...原创 2019-08-22 22:49:57 · 808 阅读 · 0 评论 -
程序员的算法课(8)-贪心算法:理解霍夫曼编码
一、一种很贪婪的算法定义贪心是人类自带的能力,贪心算法是在贪心决策上进行统筹规划的统称。【百度百科】贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。二、贪心跟动态规划贪心选择贪心选择是指所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到。这是贪心算法可行的第一个...原创 2019-08-22 22:22:56 · 1392 阅读 · 0 评论 -
程序员的算法课(7)-01背包问题
一、01背包问题描述有n 个物品,它们有各自的重量和价值,现有给定容量的背包,如何让背包里装入的物品具有最大的价值总和? i 1 2 3 4 w(体积) 2 3 4 5 ...原创 2019-08-21 23:26:46 · 1332 阅读 · 0 评论 -
程序员的算法课(6)-最长公共子序列(LCS)
上一节我们讲了动态规划,我们也知道,动态规划对于子问题重叠的情况特别有效,因为它将子问题的解保存在存储空间中,当需要某个子问题的解时,直接取值即可,从而避免重复计算!这一节我们来解决一个问题,就是最长公共子序列。一、啥叫最长公共子序列?【百度百科】LCS是Longest Common Subsequence的缩写,即最长公共子序列。一个序列,如果是两个或多个已知序列的子序列,且是所有子...原创 2019-08-21 22:53:17 · 5746 阅读 · 4 评论 -
程序员的算法课(5)-动态规划算法
前言众所周知,递归算法时间复杂度很高为(2^n),而动态规划算法也能够解决此类问题,动态规划的算法的时间复杂度为(n^2)。动态规划算法是以空间置换时间的解决方式。一、什么是动态规划动态规划(Dynamicprogramming)是一种在数学、计算机科学和经济学中使用的,通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。动态规划算法是通过拆分问题,定义问题状态和状态之间的...原创 2019-08-20 23:25:42 · 1899 阅读 · 0 评论 -
程序员的算法课(4)-二分查找
一个90%的程序员写不对的程序,一个面试高频出现的面试题,一个开发中用之甚广的算法,一个最能体现程序员素质的代码,它就是二分查找。一、二分查找的定义【百度百科】二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。二分查找法充分利用了元素间的次序关系,采用分治策略,可在最坏的情况下用O...原创 2019-08-20 22:01:33 · 722 阅读 · 0 评论 -
程序员的算法课(3)-递归(recursion)算法
一、什么是递归递归是一种数学上分而自治的思想。递归将大型复杂问题转化为与原问题相同但规模较小 的问题进行处理 递归需要有边界条件,当边界条件不满足时,递归继续进行;当边界条件满足时,递归停止【百度百科】程序调用自身的编程技巧称为递归( recursion)。递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的...原创 2019-08-20 21:43:51 · 981 阅读 · 2 评论 -
程序员的算法课(2)-排序算法
术语说明稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面; 不稳定:如果a原本在b的前面,而a=b,排序之后a可能会出现在b的后面; 内排序:所有排序操作都在内存中完成; 外排序:由于数据太大,因此把数据放在磁盘中,而排序通过磁盘和内存的数据传输才能进行;一、排序算法总结n: 数据规模 k: “桶”的个数 In-place: 占用常数内存,不占用额外内存 Ou...转载 2019-08-19 22:22:18 · 835 阅读 · 0 评论 -
程序员的算法课(1)-算法概述
【算法之美】数据结构+算法=程序。前言数据结构只是静态的描述了数据元素之间的关系。高效的程序需要在数据结构的基础上设计和选择算法。高效的程序=恰当的数据结构+合适的算法算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。如果一个算法有缺陷,或...原创 2019-08-18 17:58:49 · 1306 阅读 · 2 评论 -
程序员的算法课(16)-B+树在数据库索引中的作用
前文讲了二叉树和多路树,二叉树的性能很好,像AVL树、红黑树都是很优秀的结构,那么在数据库索引中,并没有采用二叉树这种结构,这是为什么呢?因为,有性能更好的树来做搜索!目前大部分数据库系统及文件系统都采用B-Tree或其变种B+Tree作为索引结构。一、B-树和B+树回顾1.B-树B-tree(多路搜索树)是一种常见的数据结构。使用B-tree结构可以显著减少定位记录时所经历的中间过...原创 2019-08-27 20:26:32 · 874 阅读 · 0 评论 -
程序员的算法课(17)-常用的图算法:深度优先(DFS)
一、深度优先搜索介绍图的深度优先搜索(Depth First Search),和树的先序遍历比较类似。它的思想:假设初始状态是图中所有顶点均未被访问,则从某个顶点v出发,首先访问该顶点,然后依次从它的各个未被访问的邻接点出发深度优先搜索遍历图,直至图中所有和v有路径相通的顶点都被访问到。 若此时尚有其他顶点未被访问到,则另选一个未被访问的顶点作起始点,重复上述过程,直至图中所有顶点都被访问...原创 2019-08-27 22:52:04 · 1012 阅读 · 0 评论 -
程序员的算法课(18)-常用的图算法:广度优先(BFS)
一、广度优先搜索介绍广度优先搜索算法(Breadth First Search),又称为"宽度优先搜索"或"横向优先搜索",简称BFS。它的思想是:从图中某顶点v出发,在访问了v之后依次访问v的各个未曾访问过的邻接点,然后分别从这些邻接点出发依次访问它们的邻接点,并使得“先被访问的顶点的邻接点先于后被访问的顶点的邻接点被访问,直至图中所有已被访问的顶点的邻接点都被访问到。如果此时图中尚有顶...原创 2019-08-27 22:52:41 · 1692 阅读 · 0 评论 -
程序员的算法课(19)-常用的图算法:最短路径(Shortest Path)
一、最短路径问题【google笔试题】一个环形公路,给出相邻两点的距离(一个数组),求任意两点的最短距离,要求空间复杂度不超过O(N)。如果从有向图中某一顶点(称为源点)到达另一顶点(称为终点)的路径可能不止一条,如何找到一条路径使得沿此路径上各边上的权值总和达到最小。最短路径问题是图论研究中的一个经典算法问题,旨在寻找图(由结点和路径组成的)中两结点之间的最短路径。算法具体的形式包括...原创 2019-08-27 22:53:03 · 2294 阅读 · 0 评论 -
程序员的算法课(20)-常用的图算法:最小生成树(MST)
一、图的生成树和最小生成树生成树(SpanningTree):如果一个图的子图是一个包含图所有节点的树,那这个子图就称为生成树。图的生成树不惟一。从不同的顶点出发进行遍历,可以得到不同的生成树。专业的说法:在一个无向连通图中,如果存在一个连通子图包含原图中所有的结点和部分边,且这个子图不存在回路,那么我们称这个子图为原图的一棵生成树。最小生成树:在带权图中,所有的生成树中边权和最小的那棵(...原创 2019-08-27 22:53:41 · 1522 阅读 · 0 评论