编程之美 算法
文章平均质量分 72
luyafei_89430
这个作者很懒,什么都没留下…
展开
-
海量数据处理:十道面试题与十个海量数据处理方法总结
第一部分、十道海量数据处理面试题1、海量日志数据,提取出某日访问百度次数最多的那个IP。 首先是这一天,并且是访问百度的日志中的IP取出来,逐个写入到一个大文件中。注意到IP是32位的,最多有个2^32个IP。同样可以采用映射的方法,比如模1000,把整个大文件映射为1000个小文件,再找出每个小文中出现频率最大的IP(可以采用hash_map进行频率统计,然后再找出频率最大的几转载 2013-10-25 09:48:33 · 1590 阅读 · 0 评论 -
Trie树|字典树的简介及实现
Trie树|字典树的简介及实现(转)Trie,又称字典树、单词查找树,是一种树形结构,用于保存大量的字符串。它的优点是:利用字符串的公共前缀来节约存储空间。相对来说,Trie树是一种比较简单的数据结构.理解起来比较简单,正所谓简单的东西也得付出代价.故Trie树也有它的缺点,Trie树的内存消耗非常大.当然,或许用左儿子右兄弟的方法建树的话,可能会好点.其基本性质可以归纳为:1转载 2013-10-22 15:11:43 · 660 阅读 · 0 评论 -
面试100题系列之3一种关于拆分思路的算法
今天去参加腾讯的笔试,最后一道附加题。两个数组a[N],b[N],其中a[N]的各个元素值已知,现给b[i]赋值,b[i] = a[0]*a[1]*a[2]...*a[N-1]/a[i];要求:1. 不准用除法运算;2. 除了循环计数值,a[N],b[N]外,不准再用其他任何变量(包括局部变量,全局变量等);3. 满足时间复杂度O(n),空间复杂度O(1);我自己的思路:通转载 2013-10-21 19:51:44 · 962 阅读 · 2 评论 -
编程之美--O(n*log(n))--寻找最近点对
原创文章,转载请注明出处~~http://www.cnblogs.com/justinzhang/ 问题描述:给定平面上N个点的坐标,找出距离最近的两个点。 这是编程之美2.11的一道题目,从昨天到现在就一直在设法解决它;如果用常规的解法,只需要将N个点两两计算距离,然后找出最小距离的两个点就可以了;但是这种解法的算法复杂度为O(N^2); 为了降低算法的复杂度,我们需要转载 2013-10-21 18:41:06 · 789 阅读 · 0 评论 -
【扩展】快速寻找满足条件(两个数的和为指定值)的两个数
从上篇文章我们可以看出寻找两个数和为指定值的较好解法是: 先把数组排序,i = 0,j = N-1,这样a[i]+a[j]正好是一个中间数,如果想减小sum的值,就一直缩小j,如果想增加sum的值,就增加i。 设上面的问题算法为getSumNum(int[] a,int sum),arr为数组,sum为和 扩展问题是:如果寻找三个数字或是任意数字呢? 三个数字的想法:转载 2013-10-21 19:10:10 · 649 阅读 · 0 评论 -
编程之美--重建二叉树
给定一个前序和中序变量的结果,写一个算法重建这棵树:如:前序: a b d c e f中序: d b a e c f前序遍历的每一个节点,都是当前子树的根节点,同时,以对应的节点为边界,就会把前序遍历的结果分为左子树和右子树。a是前序中第一个节点,以a为中界,把中序的结果分成:左:db右:ecf对于db,由于在前序中b在d前面,所以,b是d的父亲。转载 2013-10-23 10:02:23 · 8224 阅读 · 1 评论 -
3.10 分层遍历二叉树 扩展问题一、二
书中解法三用数组来对树进行BFS,比较适合在比赛中使用,如果使用队列的话,当数据规模比较大的时候,频繁的进队列,出队列还是很耗时的。 比较经典的“聪明的打字员”一题,就是BFS搜索,但是数据规模比较大,用队列的话很容易超时,参考PKU1184.扩展问题一、二是按深度从下到上遍历二叉树,从左向右或者从右向左。我们可以在开始根节点遍历的时候,每层遍历结束之后,存放一个 NULL 作为层与层转载 2013-10-23 09:41:31 · 792 阅读 · 0 评论 -
设计模式(九)外观模式Facade(结构型)
设计模式--外观模式Facade(结构型):1. 概述 外观模式,我们通过外观的包装,使应用程序只能看到外观对象,而不会看到具体的细节对象,这样无疑会降低应用程序的复杂度,并且提高了程序的可维护性。例子1:一个电源总开关可以控制四盏灯、一个风扇、一台空调和一台电视机的启动和关闭。该电源总开关可以同时控制上述所有电器设备,电源总开关即为该系统的外观模式设计。2.转载 2013-10-23 14:24:28 · 783 阅读 · 0 评论 -
编程之美2.21——只考加法的面试题
问题描述:写一个程序,对于一个64位正整数,输出它所有可能的连续自然数(两个以上)之和的算式。例如:3=1+2; 9=5+4; 9=2+3+4。刚开始看到这个题目,直接想到的方法就是蛮力解决:即对于每一个输入的整数,从1开始加,一直加到等于或者大于这个整数为止。如果等于这个整数,则找到了一种连续自然数相加的模式;如果大于这个整数,则无法找到,继续从2开始加,依次类推。例如对于5来说,首先从转载 2013-10-23 10:27:19 · 962 阅读 · 0 评论 -
设计模式(七)组合模式Composite(结构型)
设计模式(七)组合模式Composite(结构型)1. 概述在数据结构里面,树结构是很重要,我们可以把树的结构应用到设计模式里面。例子1:就是多级树形菜单。例子2:文件和文件夹目录2.问题我们可以使用简单的对象组合成复杂的对象,而这个复杂对象有可以组合成更大的对象。我们可以把简单这些对象定义成类,然后定义一些容器类来存储这些简单对象。客户端代码必须区别对转载 2013-10-23 14:12:01 · 558 阅读 · 0 评论 -
几个常用的操作系统进程调度算法
一、先来先服务和短作业(进程)优先调度算法1.先来先服务调度算法先来先服务(FCFS)调度算法是一种最简单的调度算法,该算法既可用于作业调度,也可用于进程调度。当在作业调度中采用该算法时,每次调度都是从后备作业队列中选择一个或多个最先进入该队列的作业,将它们调入内存,为它们分配资源、创建进程,然后放入就绪队列。在进程调度中采用FCFS算法时,则每次调度是从就绪队列中选择一个最先进入该队列的转载 2013-10-23 14:49:44 · 70831 阅读 · 3 评论 -
字符串的全排列和组合算法
全排列在笔试面试中很热门,因为它难度适中,既可以考察递归实现,又能进一步考察非递归的实现,便于区分出考生的水平。所以在百度和迅雷的校园招聘以及程序员和软件设计师的考试中都考到了,因此本文对全排列作下总结帮助大家更好的学习和理解。对本文有任何补充之处,欢迎大家指出。首先来看看题目是如何要求的(百度迅雷校招笔试题)。一、字符串的排列用C++写一个函数, 如 Foo(const char *转载 2013-11-06 09:58:28 · 842 阅读 · 0 评论 -
strcpy函数的实现
大家一般认为名不见经传strcpy函数实现不是很难,流行的strcpy函数写法是:[cpp] view plaincopyprint?char *my_strcpy(char *dst,const char *src) { assert(dst != NULL); assert(src != NULL); char *ret = ds转载 2013-11-08 09:24:06 · 626 阅读 · 0 评论 -
最长重复子串
首先这是一个单字符串问题。子字符串R 在字符串L 中至少出现两次,则称R 是L 的重复子串。重复子串又分为可重叠重复子串和不可重叠重复子串,这里只是简单讨论最长可重叠的重复子串,给出基本算法和基于后缀数组的算法;关于后缀数组,这里也只是用最简单的形式实现,对于后缀数组的倍增算法和DC3算法的实现以及不可重叠重复子串的问题可参见算法合集之《后缀数组——处理字符串的有力工具》,以后再整理这几个问题。转载 2013-10-22 14:53:11 · 646 阅读 · 0 评论 -
编程之美2.12——快速寻找满足条件的两个数或三个数
问题:1. 快速找出一个数组中的两个数,让这两个数之和等于一个给定的值。2. 快速找出一个数组中的三个数,让这三个数之和等于一个给定的值。1. 解法:算法复杂度为O(nlogn)。先用快速排序对数组排序,让后用双指针(双索引)法对排序好的数组进行反向遍历,并且遍历的方向不变。(若是计算两个数的和,则初始化为i=0,j=n-1,若是计算两个数的差,则初始化为i=0,j=1)之转载 2013-10-21 19:05:05 · 783 阅读 · 0 评论 -
每日一题(75) - 最大公约数问题
题目来自编程之美题目注意:这里不考虑负数。思路(1)辗转相除法思想:[cpp] view plaincopyprint?参数要求:无要求,x >= y 或 y >= x均可 gcd(x,y) = gcd(y ,x % y); 参数要求:无要求,x >= y 或 y >= x均可gcd(x,y) = gcd(y ,x % y);转载 2013-10-21 10:53:00 · 791 阅读 · 0 评论 -
双堆求中位数
用堆维护中位数的意思是说,设计两个堆,第一个堆存放小于中位数的元素,第二个堆存放大于中位数的元素。下面是双堆维护中位数的语言描述:1、初始化的时候设置两个变量分别记录两个堆【左堆和右堆】的元素的个数2、取第一个元素【d[0]】作为初始中位数m3、循环后面的每一个元素,如果比m大,则插入到右堆,如果比m小,则插入到左堆4、此时如果左堆和右堆的元素数目之差的绝对原创 2013-10-25 09:50:30 · 1311 阅读 · 0 评论 -
由随机函数rand7构造rand10
【试题描述】已知有个rand7()的函数,返回1到7随机自然数,让利用这个rand7()构造rand10()随机1~10。【试题分析】1)要保证rand10()在整数1-10的均匀分布,可以构造一个1-10*n的均匀分布的随机整数区间(n为任何正整数)。假设x是这个1-10*n区间上的一个随机整数,那么x%10+1就是均匀分布在1-10区间上的整数。转载 2013-10-25 11:14:08 · 769 阅读 · 0 评论 -
十七道海量数据处理面试题与Bit-map详解
作者:小桥流水,redfox66,July。前言 本博客内曾经整理过有关海量数据处理的10道面试题(十道海量数据处理面试题与十个方法大总结),此次除了重复了之前的10道面试题之后,重新多整理了7道。仅作各位参考,不作它用。 同时,程序员编程艺术系列将重新开始创作,第十一章以后的部分题目来源将取自下文中的17道海量数据处理的面试题。因为,我们觉得,下文的每一道面试题都转载 2013-10-25 10:50:40 · 930 阅读 · 0 评论 -
海量数据处理专题(六)——双层桶划分
海量数据处理专题(六)——双层桶划分【什么是双层桶】事实上,与其说双层桶划分是一种数据结构,不如说它是一种算法设计思想。面对一堆大量的数据我们无法处理的时候,我们可以将其分成一个个小的单元,然后根据一定的策略来处理这些小单元,从而达到目的。【适用范围】第k大,中位数,不重复或重复的数字【基本原理及要点】因为元素范围很大,不能利用直接寻址表,所以通过多次划分,逐步确定范围转载 2013-10-25 11:21:45 · 779 阅读 · 0 评论 -
编程之美3.1 字符串移位包含的问题
题目给定两个字符串 s1 和 s2, 要求判定 s2 是否能够被通过 s1 作循环移位 ( rotate )得到的字符串包含. 例如, 给定 s1 = AABCD 和 s2 = CDAA, 返回 true; 给定s1 = ABCD 和 s2 = ACBD, 返回 false. 解法1直接模拟, 对 s1 进行循环移位, 在判断字符串 s2 是否在移位后的字符串中.转载 2013-10-19 18:51:44 · 632 阅读 · 0 评论 -
计算字符串的相似度--编程之美3.3
许多程序会大量使用字符串。对于不同的字符串,我们希望能够有办法判断其相似程序。我们定义一套操作方法来把两个不相同的字符串变得相同,具体的操作方法为: 1.修改一个字符(如把“a”替换为“b”); 2.增加一个字符(如把“abdd”变为“aebdd”); 3.删除一个字符(如把“travelling”变为“traveling”); 比如,对于“abcdefg”和“abcd转载 2013-10-19 19:50:30 · 668 阅读 · 0 评论 -
四道有趣的单链表面试题(单链表反序、找出链表的中间元素、链表排序、判断一个单链表是否有环
四道有趣的单链表面试题(单链表反序、找出链表的中间元素、链表排序、判断一个单链表是否有环) (转)以下给出链表结点的数据结构:转载 2013-10-19 21:36:10 · 675 阅读 · 0 评论 -
逆转一个整数的二进制表示问题
解法一:这个容易理解。[cpp] view plaincopyprint?//解法一 #define UNSIGNED_BITS_COUNT 32 unsigned int BitRev3(unsigned int input) { unsigned int ret, i; for(ret = i = 0; i >转载 2013-10-21 11:00:56 · 667 阅读 · 0 评论 -
编程之美_2.10_寻找数组中的最大值和最小值
问题描述:给出一个数组,包含N个整数,那么需要比较多少次找到最大值和最小值注意:要想得到最大值和最小值,遍历一遍数组是不可避免的。我们能减少的就是减少比较次数来提高效率方法一、遍历一遍数组,同时得到最大值和最小值具体是,定义一个max 和 min,每遍历一个数,就分别和max 和 min比较一次,直到处理完所有的数据比较次数: N+N = 2N方法二、我们可以把数组中的数据两两转载 2013-10-21 13:12:58 · 794 阅读 · 0 评论 -
程序员面试题精选100题(47)-数组中出现次数超过一半的数字[算法]
题目:数组中有一个数字出现的次数超过了数组长度的一半,找出这个数字。分析:这是一道广为流传的面试题,包括百度、微软和Google在内的多家公司都曾经采用过这个题目。要几十分钟的时间里很好地解答这道题,除了较好的编程能力之外,还需要较快的反应和较强的逻辑思维能力。看到这道题,我们马上就会想到,要是这个数组是排序的数组就好了。如果是排序的数组,那么我们只要遍历一次就可以统计出每个数字出现的次数转载 2013-10-21 09:39:56 · 636 阅读 · 0 评论 -
编程之美--寻找最大的K个数
方法一: 使用partition函数,将数组分为两组。partition函数是快速排序中用来把数组分成两部分的函数。 (1)分为两个组,sa和sb。 (2)若sa组的个数大于K,则继续在sa分组中找取最大的K个数字 。 (3)若sa组中的数字小于K ,其个数为T,则继续在sb中找取 K-T个数字 。 具体代码实现转载 2013-10-21 10:23:48 · 742 阅读 · 0 评论 -
数组中出现次数超过一半的数字
题目:数组中有一个数字出现的次数超过了数组长度的一半,找出这个数字。 分析:这是一道广为流传的面试题,包括百度、微软和Google在内的多家公司都曾经采用过这个题目。要几十分钟的时间里很好地解答这道题,除了较好的编程能力之外,还需要较快的反应和较强的逻辑思维能力。 看到这道题,我们马上就会想到,要是这个数组是排序的数组就好了。如果是排序的数组,那么我们只要遍历一次就可以统计转载 2013-10-21 10:25:10 · 655 阅读 · 0 评论 -
两个栈实现队列 两个队列实现栈
为说明思想,假设队列、栈都很大,不会出现满的情况。1. 两个栈实现队列//前提已知:struct Stack{ int top; //栈顶指针 int stacksize;//栈的大小 int *s; //栈底指针};void InitStack(Stack *s);void Push(Stack *s, int k);in转载 2014-10-12 10:19:42 · 513 阅读 · 0 评论