代码改变世界

随笔档案-2011年09月

字符串:KMP Eentend-Kmp 自动机 trie图 trie树 后缀树 后缀数组

2011-09-29 21:50 by CSWolf, 407 阅读, 收藏,
摘要: 涉及到字符串的问题,无外乎这样一些算法和数据结构:自动机 KMP算法 Extend-KMP 后缀树 后缀数组 trie树 trie图及其应用。当然这些都是比较高级的数据结构和算法,而这里面最常用和最熟悉的大概是kmp,即使如此还是有相当一部分人也不理解kmp,更别说其他的了。当然一般的字符串问题中,我们只要用简单的暴力算法就可以解决了,然后如果暴力效率太低,就用个hash。当然hash也是一个面试中经常被用到的方法。这样看来,这样的一些算法和数据结构实际上很少会被问到,不过如果使用它们一般可以得到很好的线性复杂度的算法。老实说,我也一直觉得字符串问题挺复杂的,出来一个如果用暴力,hash搞不定 阅读全文

各大计算机公司 笔试及面试 题目 - 专题(链表 一)

2011-09-29 21:46 by CSWolf, 590 阅读, 收藏,
摘要: 面试的时候,书写程序要注意以下几点1.确认了解题意,如果对题意了解不清,应该向面试人员问清楚2.明确题意后,首先思考找到一个复杂度可以接受的正确算法,并表述出来,注意可以在草稿纸上写写划划,进行验证3.观察复杂度能否再次降低4.书写程序时,一定要认真,坚决防止出现逻辑错误,并根据程序具体分析可能的极端情况,处理好边界,并自己进行用例测试,以验证程序。节点的定义如下:typedef struct list {int key;struct list *next;}list;(1)已知链表的头结点head,写一个函数把这个链表逆序 ( Intel)list * reverse(list * head 阅读全文

各大计算机公司 笔试及面试 题目 - 专题(字符串 二)

2011-09-29 21:45 by CSWolf, 485 阅读, 收藏,
摘要: 转载请注明作者:phylips@bmy出处:http://duanple.blog.163.com/blog/static/70971767200982584340501/1.求最长回文子串。[解法]:将整个字 符串反过来写在原字符串后面,中间用一个特殊的字符隔开。这样就把问题变为了求这个新的字符串的某两个后缀的最长公共前缀。而某两个后缀的lcs的计算利用后缀数组,可以O(1),这样总的复杂度就可以降为O(n)。eg:aabebf ----> aabebf&fbebaa假设存在一个回文串,则它具有如下特点,|------<---*--->--|&|--< 阅读全文

各大计算机公司 笔试及面试 题目 - 专题(字符串 一)

2011-09-29 21:43 by CSWolf, 344 阅读, 收藏,
摘要: 1.将字符串转换成整数,将整数转换为字符串,浮点数与字符串的转换(atoi itoa)int atoi(const char *str){ int res = 0; int sign; assert(str != NULL); if(str[0] == '-') sign = -1; else if(str[0] == '+') sign =1; else if(isdigit(str[0])){sign = 1;res=str[0] - '0';} for(int i = 1 ; str[i] != '\0' ; i++){ a 阅读全文

各大计算机公司 笔试及面试 题目 - 专题(海量数据处理 二)

2011-09-29 20:09 by CSWolf, 684 阅读, 收藏,
摘要: 1、海量数据分布在100台电脑中,想个办法高校统计出这批数据的TOP10。方案1:s在每台电脑上求出TOP10,可以采用包含10个元素的堆完成(TOP10小,用最大堆,TOP10大,用最小堆)。比如求TOP10大,我们首先取前10个元素调整成最小堆,如果发现,然后扫描后面的数据,并与堆顶元素比较,如果比堆顶元素大,那么用该元素替换堆顶,然后再调整为最小堆。最后堆中的元素就是TOP10大。2、 1000万字符串,其中有些是重复的,需要把重复的全部去掉,保留没有重复的字符串。请怎么设计和实现?方案1:这题用trie树比较合适,hash_map也应该能行。3、一个文本文件,找出前10个经常出现的词, 阅读全文

海量数据处理方法总结

2011-09-29 19:28 by CSWolf, 342 阅读, 收藏,
摘要: 大数据量的问题是很多面试笔试中经常出现的问题,比如baidu google 腾讯 这样的一些涉及到海量数据的公司经常会问到。下面的方法是我对海量数据的处理方法进行了一个一般性的总结,当然这些方法可能并不能完全覆盖所有的问题,但是这样的一些方法也基本可以处理绝大多数遇到的问题。下面的一些问题基本直接来源于公司的面试笔试题目,方法不一定最优,如果你有更好的处理方法,欢迎与我讨论。1.Bloom filter适用范围:可以用来实现数据字典,进行数据的判重,或者集合求交集基本原理及要点:对于原理来说很简单,位数组+k个独立hash函数。将hash函数对应的值的位数组置1,查找时如果发现所有hash函数 阅读全文

各大计算机公司 笔试及面试 题目 - 专题(海量数据处理 一)

2011-09-29 19:28 by CSWolf, 452 阅读, 收藏,
摘要: 1、海量日志数据,提取出某日访问百度次数最多的那个IP。 首先是这一天,并且是访问百度的日志中的IP取出来,逐个写入到一个大文件中。注意到IP是32位的,最多有个2^32个IP。同样可以采用映射的方法,比如模1000,把整个大文件映射为1000个小文件,再找出每个小文中出现频率最大的IP(可以采用hash_map进行频率统计,然后再找出频率最大的几个)及相应的频率。然后再在这1000个最大的IP中,找出那个频率最大的IP,即为所求。或者如下阐述(雪域之鹰):算法思想:分而治之+Hash1.IP地址最多有2^32=4G种取值情况,所以不能完全加载到内存中处理;2.可以考虑采用“分而治之”的思想, 阅读全文

各大计算机公司 笔试及面试 题目 - 联发科(内核线程、轻量级进程、用户线程和LinuxThreads库)

2011-09-28 21:00 by CSWolf, 839 阅读, 收藏,
摘要: 在现代操作系统中,进程支持多线程。进程是资源管理的最小单元;而线程是程序执行的最小单元。一个进程的组成实体可以分为两大部分:线程集和资源集。进程中的线程是动态的对象;代表了进程指令的执行。资源,包括地址空间、打开的文件、用户信息等等,由进程内的线程共享。线程有自己的私有数据:程序计数器,栈空间以及寄存器。Why Thread?(传统单线程进程的缺点)1.现实中有很多需要并发处理的任务,如数据库的服务器端、网络服务器、大容量计算等。2.传统的UNIX进程是单线程的,单线程意味着程序必须是顺序执行,不能并发;既在一个时刻只能运行在一个处理器上,因此不能充分利用多处理器框架的计算机。3.如果采用多进 阅读全文

各大计算机公司 笔试及面试 题目 - 深信服(八皇后问题)

2011-09-28 20:18 by CSWolf, 410 阅读, 收藏,
摘要: 八皇后问题是一个以国际象棋为背景的问题:如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线上。八皇后问题可以推广为更一般的n皇后摆放问题:这时棋盘的大小变为n×n,而皇后个数也变成n。当且仅当n= 1 或n≥ 4 时问题有解。在n×n格的棋盘上摆放n个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,求解满足条件的棋盘布局。n-皇后问题是典型的可以使用回溯算法求解的问题。如果你明白了问题的具体执行过程,也就对该问题的特点有了把握,从而选择合 阅读全文

各大计算机公司 笔试及面试 题目 - 阿里巴巴、深信服(Linux的启动流程 V2)

2011-09-28 16:10 by CSWolf, 374 阅读, 收藏,
摘要: 引:本文以RedHat9.0和i386平台为例,剖析了从用户打开电源直到屏幕出现命令行提示符的整个Linux启动过程。并且介绍了启动中涉及到的各种文件。阅读Linux源代码,无疑是深入学习Linux的最好方法。在本文对Linux启动过程的介绍中,我们也尝试从源代码的视角来更深入的剖析Linux 的启动过程,所以其中也简单涉及到部分相关的Linux源代码,Linux启动这部分的源码主要使用的是C语言,也涉及到了少量的汇编。而启动过程中也执行了大量的shell(主要是bash shell)所写脚本。为了方便读者阅读,笔者将整个Linux启动过程分成以下几个部分逐一介绍,大家可以参考下图:当用户打开 阅读全文

各大计算机公司 笔试及面试 题目 - 阿里巴巴、深信服(Linux的启动流程 V3)

2011-09-28 16:10 by CSWolf, 355 阅读, 收藏,
摘要: ·启动第一步--加载BIOS当你打开计算机电源,计算机会首先加载BIOS信息,BIOS信息是如此的重要,以至于计算机必须在最开始就找到它。这是因为BIOS中包含了CPU的相关信息、设备启动顺序信息、硬盘信息、内存信息、时钟信息、PnP特性等等。在此之后,计算机心里就有谱了,知道应该去读取哪个硬件设备了。启动第二步--读取MBR众所周知,硬盘上第0磁道第一个扇区被称为MBR,也就是Master Boot Record,即主引导记录,它的大小是512字节,别看地方不大,可里面却存放了预启动信息、分区表信息。系统找到BIOS所指定的硬盘的MBR后,就会将其复制到0×7c00地址所 阅读全文