算法学习
文章平均质量分 59
shitangdejiaozi
游戏开发菜鸟
展开
-
面试中的算法准备
我决定写篇短文,即为此文。之所以要写这篇文章,缘于微博上常有朋友询问,要毕业找工作了,如何备战算法。尽管在微博上简单梳理过,如下图所示: 但因字数限制,许多问题无法一次性说清楚,故特撰此文着重阐述下:程序员如何快速准备面试中的算法,继而推荐一些相关的书籍或资料。顺便也供节后跳槽、3月春季招聘小高潮、及6月毕业找工作的朋友参考。备战面试中算法的五个步骤对于立志进一线互联网公司,同时不满转载 2015-10-19 21:43:32 · 496 阅读 · 1 评论 -
算法学习(十三)一堆数据中找到丢失数字问题
题目描述: 每个机器都有一个标号Id,每个id数据保存两个备份,如果一台机器死机,就会丢失一个备份,如果得到一个数据文件Id的列表,是否能够快速找到这个仅出现一次的Id? 分析: 其实就是海量数据中有一个数据是只出现一次的,其他都是出现两次,找到那个出现一次的数据。 解法一: 这种记录出现次数的问题,最先想到的当然就是伴随数组,遍历列表,数组元素为数据出现次数,数组下标可以是标号id,那个原创 2016-05-16 10:45:47 · 1556 阅读 · 0 评论 -
排序算法的稳定性和内存占用,时间复杂度,空间复杂度讨论
排序算法的稳定性讨论为什么要提出稳定性这个概念?因为在实际中我们一般是按记录中的某个关键值对一组记录进行排序,比如说某组记录含有身高,体重,年龄三个量,然后我们需要对其按年龄进行排序。这时我们希望如果关键值相等的时候,先输入的数据应该还是排在前面,而不是随便排。那么前面我们学习的排序算法那些是稳定的,那些是不稳定的呢? 我们先给出一个总的结论,然后再来依次简要说明一下: 稳定的排序算法有转载 2015-10-14 10:15:19 · 6541 阅读 · 0 评论 -
算法学习(六)链表问题总结,相交,成环
求链表倒数第K个结点题目描述: 输入一个单向链表,输出该链表中倒数第k个结点,链表的倒数第0个结点为链表的尾指针。 分析: 首先链表是一个顺序结构,不像数组寻址比较方便,链表一般都是通过遍历来寻址,所以碰到倒数这种情况,转化为求L-K个结点,L为链表长度,所以你需要先遍历,得到链表的长度,然后再遍历找到第L-K个结点。这样是不是有点low啊,是的,下面就是经典的双指针方法,这里要再次强调下链表原创 2016-04-22 11:26:49 · 2388 阅读 · 2 评论 -
算法学习(十),跳台阶问题、奇偶排序
台阶问题:问题描述: 一个台阶总共有n级,没一次都可以选择跳1级,或者跳2级。 求总共有多少种跳法,并分析算法的时间复杂度。 分析: 如果只有一阶,f (1)= 1,有两阶,有两种跳法,分两次跳,每次一级,或者是一次跳2级。推广到n阶台阶,(n>2),第一次跳的时候又两种选择,如果是第一次跳一级,那么跳法数目等于f(n-1) ,另外一种是第一次跳2级,此时跳法数组等于f(n-2),所以总的原创 2016-05-09 11:05:54 · 1175 阅读 · 1 评论 -
算法学习(十一)数组中出现次数超过长度一半的数
数组中出现次数超过数组长度一半的 数字题目描述: 给定 一个数组,找到数组中出现次数超过数组长度一半的数字,如数组 a[]= {0,1,2,1,1},输出为1 分析: 1,可以使用伴随数组b,遍历数组a,将值作为数组b的下标,将次数作为值,然后遍历数组b,找到次数超过一半的值,然后输出。时间复杂度为O(N),不过要增加空间复杂度。 2,我们可以先对数组进行排序,因为某个数字出现次数超过一半,原创 2016-05-09 17:42:53 · 711 阅读 · 0 评论 -
动态规划学习(一)算法思想简介
1.分治法将问题划分为互不相交的子问题,递归的求解子问题,再将它们的解组合起来,求出原问题的解。但是这样会 做许多不必要的工作,它会重复地求解那些公共的子问题。2.动态规划与分治法类似,都是组合子问题的解来求解,主要应用于子问题重叠的问题,不同的子问题具有公共的子子问题,对每个子子问题只求解一次,将解保存起来,从而无需每次求解一个子子问题都重新计算。通常用来求解最优化问题。设计动态规划步骤1.刻画一原创 2016-07-11 15:47:38 · 706 阅读 · 0 评论 -
动态规划(二)最长回文子序列
1.题目描述:给一个字符串,找出它的最长的回文子序列的长度。和腾讯的2016实习题目类似。 输入:goolgle 输出:4 goog是它的最长回文子序列所说的子序列不一定是连续的,但是顺序不变。 子串必须是连续的字符组成。2.分析最优子结构假设S[i…j]是给定的字符串,长度为n,让dp[i][j]表示从s[i]到s[j]包含的最长回文子序列的长度。 初始化:dp[i][i] = 1;原创 2016-07-11 21:41:11 · 612 阅读 · 0 评论 -
动态规划(三)最长递增子序列
题目描述最长递增子序列(LIS),找到一个给定序列的最长子序列的长度,而且这个子序列是按照递增顺序排列。 例如:输入{10,20,9,33,21,50}。 输出为:4 ,LIS = {10,20,33,50}分析最优子结构: 对于数组A[n],建立数组ls[n],ls[i]保存以A[i]为结尾的递增子序列的长度。那么ls[i] = max(ls[j ]) +1,(j< i && A[j] <原创 2016-07-12 15:41:41 · 535 阅读 · 0 评论 -
动态规划(四)最长公共子序列
题目描述最长公共子序列问题(LCS),给定两个序列X= {x1,x2…,xm},Y= {y1,y2,…yn},求X 和Y长度最长的公共子序列。 什么叫公共子序列:Z既是X的子序列,又是Y的子序列,我们称它是X和Y的公共子序列。 子序列和子串的区别:子串是串的一个连续的部分,子序列是不改变顺序,从序列中去掉任意的元素而获得的新序列。 例如:X = {A,B,C,B,D,A,B},Y= {B,D,原创 2016-07-12 22:54:52 · 494 阅读 · 0 评论 -
算法学习(九)回文的判断
回文:英文palindrome,指一个顺着读和反过来读都一样的字符串,不如madam、mnnm。回文判断判断一个字符串是否是回文。 分析: 1.最直接的就是将字符串逆序后存入到另一个字符串,然后比较两个字符串是否一样,一样就是回文。 2.我们也可以只用双指针首尾扫描法,直到相遇两端的字符都一样,这个字符串就是回文。 3.或者找到中间元素,然后分别向两边遍历,直到两端,字符都一样,就是回文。b原创 2016-05-03 17:21:09 · 967 阅读 · 0 评论 -
算法学习(八)求给定区间的第k小(大)数
前面有关于求数组的第k小的数和topk的讨论,这么再加上一个限定条件,限定求给定区间。 题目描述: 给定一个数组a[],给定区间2-5,求区间内第3小的数。分析: 这个其实就是对a[2…5]内得数求第k小的数,和前面的关于数组第k小的数的求法是一致的,快排,选择排序,维护k个元素的最大堆。 如果对于这个数组要求多次求不同区间内得第k小的数,是不是每次都要重新排序,有木有每次都是O(N)的方法原创 2016-05-03 11:02:56 · 946 阅读 · 0 评论 -
算法学习(五)求解500万以内的亲和数,连续数据映射为数组
题目描述: 求500万以内的所有亲和数,如果两个数a和b,a的所有真因数之和等于b,b的所有真因数之和等于a,则称a,b是一对亲和数。 真因数:除了本身以外的所有因数, 列如:220的真因数:1,2,4,5,10,11,20,22,44,55,110; 284的真因数:1,2,4,71,142. 220= 1+2+4+71+142 = sum[284] 284 = 1+2+4+5+10+原创 2016-04-18 21:31:21 · 1558 阅读 · 0 评论 -
算法导论第十章练习10.2-2,10.2-3,10.2-5,10.2-6,10.2-7
10.2-2用一个单链表实现一个栈。#include <stdio.h>#include <stdlib.h>#include <stdbool.h>struct node;typedef struct node * Stack;typedef Stack PtrToNode;struct node{ int key; PtrToNode next;};Stack Cre原创 2015-10-20 11:23:14 · 652 阅读 · 0 评论 -
算法导论第十章 基本数据结构实现(栈,队列,链表),课后题答案
栈栈实现一种后进先出的策略,入栈和出栈,都是通过栈顶指针来操作。#include <stdio.h>#include <stdbool.h>#include <time.h>#include <stdlib.h>#define SIZE 10typedef struct{ int array[SIZE]; int top;}T_stack;bool Empty(T_stac原创 2015-10-19 15:44:32 · 840 阅读 · 0 评论 -
算法导论 6章堆排序的代码实现和部分课后练习
以最大堆来实现最大优先队列:/#include <stdio.h>#include <limits.h>int parent(int i); //计算父节点的下标int Left(int i); //计算分支左结点的下标int Right(int i);void MAX_HEAPIFY(int A[],int i); //保证最大堆的性质int HEAP_EXTRAC原创 2015-10-10 16:38:47 · 405 阅读 · 0 评论 -
算法学习(七)有内存限制的海量数据排序
磁盘文件排序问题描述: 输入:给定一个文件,里面最多含有n个不重复的正整数(也就是说可能含有少于n个不重复正整数),且其中每个数都小于等于n,n = 10^7。 输出:得到按从小到大升序排列的包含所有输入的整数的列表。 条件:最多有大约1MB的内存空间可用,但磁盘空间足够。且要求运行时间在五分钟以下,10秒为最佳结果。 分析: 首先注意的是它的内存要求,基本上否决了大多数的排序算法。 文原创 2016-04-25 21:08:58 · 7873 阅读 · 1 评论 -
算法学习(二)Top K 算法问题
参考学习结构之法,算法之道 上次谈论了寻找最小的k个数问题,如果反过来就是寻找最大的k个问题了。Top K题目描述:输入n个整数,输出其中最大的k个数 例如输入1,2,3,4,5,6,7这个7个数,最大的三个数为5,6,7. 这和寻找最小的k个数问题本质上差不多。这也引出了对于Top K算法的讨论。 题目描述:搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来,每个查询串的长度为原创 2016-04-13 10:45:12 · 1423 阅读 · 0 评论 -
算法学习(一):寻找最小的k个数
题目题目描述:寻找最小的k个元素 题目:输入n个整数,输出其中最小的k个 例如输入1,2,3,4,5,6,7,8,则最小的4个数是1,2,3,4思路一,最容易想到的就是排序,然后输出前k个元素,快速排序,排序时间是n*logn,再加上遍历输出前k个元素,总的时间复杂度是n*logn+k = O(n*logn) 二,其实题目中只要求输出前k个数,没有要求这些数是有顺序的,而且不必对n个数进行排序原创 2016-04-06 19:50:53 · 1183 阅读 · 0 评论 -
算法学习(十二)最大连续乘积子串、字符串编辑距离
最大连续乘积子串题目描述:给一个浮点数序列,取最大乘积连续子串的值,例如-2.5,4,0,3,0.5,8,-1,则取出的最大乘积子串为3,0.5,8。也就是说,上述数组中,3,0.5,8这3个数的乘积3*0.5*8 = 12是最大的,而且是连续的。 分析: 注意子串和字序列的区别。 子串:是串的连续的部分。 子序列:是串中不改变顺序,但是是去掉个别元素的到新的序列。 1,连续数的乘积,最简原创 2016-05-10 22:19:37 · 1302 阅读 · 0 评论 -
算法学习(十四)最大公约数问题
题目描述: 求两个正整数的最大公约数,如果两个正整数都很大,有什么简单的算法? 例如:给定1100100210001,120200021,求其最大公约数。 分析: 求最大公约数问题最经典的就是“辗转相除法”,其实就是一个数学问题了,来自欧几里得的著作《几何原本》,原来也就是知道这么个方法,但是具体的原理还真没考虑过,今天就证明一下: 假设f(x,y)是x,y的最大公约数,这里有k = x/原创 2016-05-24 10:45:01 · 785 阅读 · 0 评论 -
算法学习(四)寻找满足条件的两个数或者多个数
寻找和为定值的两个数编程之美2.12节(P176) 题目描述:能否快速找出一个数组中的两个数字,让这两个数字之和等于一个给定的值,为了简化,假设这个数组肯定存在这两个数。 例如数组1,2,4,7,11,15。给定值为15,4+11 = 15,输出4,11。 分析: 1,判断条件就是两数之和为sum,对于A[i] ,需要找sum-A[i]是否也在数组A中,这样就变成了一个查找算法,那么提高查找原创 2016-04-18 16:14:51 · 2374 阅读 · 0 评论 -
算法学习(三)字符串查找,删除,复制strstr/strcpy/strpbrk等库函数
字符串的查找题目描述: 给定一个字符串A,要求在A中查找一个子串B的位置 如A = “ABCDEF”,B = “CD”,返回3.从3开始。 相当于库函数strstr。 方法一:#include<stdio.h>#include<string.h>//匹配函数int match(char *str,char *sub){ while(*sub != '\0') {原创 2016-04-13 21:20:03 · 749 阅读 · 0 评论