08 2012 档案

摘要:1. 字典树又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来节约存储空间,最大限度地减少无谓的字符串比较,查询效率比哈希表高。2. Trie Tree的性质: (1)根节点不包含字符,除根节点外每一个节点包含一个字符。 (2)从根节点到某一节点,路径数经过的字符连接起来,为该节点对应的字符串。 (3)每个节点的子节点包含的字符均不相同。3. 基本操作主要是插入和查找,偶尔涉及删除操作。4. 实现方法,搜索字典树项目的方法为: (1)从... 阅读全文
posted @ 2012-08-31 13:46 kasuosuo 阅读(626) 评论(0) 推荐(0)
摘要:1. 这道题主要是要将几种情况考虑完整,一下给出的程序考虑以下几种情况:(1)以'+'开始的字符串(2)以‘-’开始的字符串(3)出现多个点‘.’的字符串(4)出现非法字符(5)不合理的组合方式2. 代码如下: 1 bool flag=true; 2 float ctof(const char* str) 3 { 4 assert(str); 5 float res=0.0f; 6 float Intpart=0.0f; 7 float Dotpart=0.0f; 8 bool minus=false; 9 const char* tmp=str... 阅读全文
posted @ 2012-08-30 15:33 kasuosuo 阅读(1100) 评论(0) 推荐(0)
摘要:1. linux下编译C程序使用cc gcc g++ 编译C++程序使用 g++。2. 调试程序使用gdb。3. 调试过程主要参考以下两篇文章:http://blog.csdn.net/haoel/article/details/2879http://blog.csdn.net/haoel/article/details/28804.今天在Linux上用GDB进行程序调试的时候,发现提示:No symbol table is loaded. Use the "file" command.导致这个错误的原因一般是:在交叉编译时没有加-g选项.所以在编译程序时一定要注意加上-g 阅读全文
posted @ 2012-08-27 09:56 kasuosuo 阅读(275) 评论(0) 推荐(0)
摘要:1. 二叉树中很多的操作都可以从对二叉树的遍历入手,在遍历的基础上对树中节点进行相关的操作或做相关的信息统计。本文主要讨论二叉树的三种遍历算法。2. 定义二叉树的结构体如下:1 struct Node2 {3 int m_data;4 Node* m_lChild;5 Node* m_rChild;6 Node(int data=0,Node* lChild=NULL,Node* rChild=NULL)7 :m_data(data),m_lChild(lChild),m_rChild(rChild){}8 };3. 递归遍历代码很容易写,如下:... 阅读全文
posted @ 2012-08-26 22:11 kasuosuo 阅读(782) 评论(0) 推荐(0)
摘要:1. 逗号表达式 c语言提供一种特殊的运算符,逗号运算符,优先级别最低,它将两式联接起来,如:(3+5,6+8)称为逗号表达式,其求解过程先表达式1,后表达式2,整个表达式值是表达式2的值,如:(3+5,6+8)的值是14。(a=3*5,a*4)的值是60 逗号表达式的形式如下: 表达式1,表达式2,表达式3,...... ,表达式n 逗号表达式的要领: (1) 逗号表达式的运算过程为:从左往右逐个计算表达式。 (2) 逗号表达式作为一个整体,它的值为最后一个表达式(也即表达式n)的值。 (3) 逗号运算符的优先级别在所有运算符中最低。2. volatile关键字 volati... 阅读全文
posted @ 2012-08-26 20:42 kasuosuo 阅读(275) 评论(0) 推荐(0)
摘要:以下介绍转载自:http://www.cnblogs.com/allensun/archive/2011/02/16/1956532.html布隆过滤器 (Bloom Filter)是由Burton Howard Bloom于1970年提出,它是一种space efficient的概率型数据结构,用于判断一个元素是否在集合中。在垃圾邮件过滤的黑白名单方法、爬虫(Crawler)的网址判重模块中等等经常被用到。哈希表也能用于判断元素是否在集合中,但是布隆过滤器只需要哈希表的1/8或1/4的空间复杂度就能完成同样的问题。布隆过滤器可以插入元素,但不可以删除已有元素。其中的元素越多,false po 阅读全文
posted @ 2012-08-26 16:41 kasuosuo 阅读(1381) 评论(0) 推荐(0)
摘要:转自博客:http://blog.csdn.net/star143133/article/details/6854745 代码见Problem28问题1 :输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则输出由字符a、b、c所能排列出来的所有字符串abc、acb、bac、bca、cab和cba。 思路:这是个递归求解的问题。递归算法有四个特性:(1)必须有可达到的终止条件,否则程序将陷入死循环;(2)子问题在规模上比原问题小;(3)子问题可通过再次递归调用求解;(4)子问题的解应能组合成整个问题的解。 对于字符串的排列问题。如果能生成n - 1个元素的全排列,就能生成n 阅读全文
posted @ 2012-08-25 15:42 kasuosuo 阅读(260) 评论(0) 推荐(0)
摘要:1. 题目:给定一组硬币排成直线(假设硬币数量为偶数),有两个人开始取硬币。每次只能从队列两端取硬币。有没有这样一种方案使先手取硬币,最后得到的硬币面值最大?给出这样一种方案并给出取法及最终获得的最大面值。2. 文章中给出了详细的解释,这类就不说了。3. 代码: 1 #include <iostream> 2 #include <cassert> 3 4 using namespace std; 5 const int MAX_N = 100; 6 7 void printMoves(int P[][MAX_N], int A[], int N) { 8 int sum 阅读全文
posted @ 2012-08-16 16:49 kasuosuo 阅读(350) 评论(0) 推荐(0)
摘要:1. 题目:给定一个数组a(a中不存在重复元素)和一个值k,求出a中元素之和为k的所有组合。比如a为{7,3,6,2},k=7,则所有组和有2+2+3和7。2. 解析:回溯+递归。比较难以理解的是index索引的使用,代码如下:void printSum(int candidates[], int index[], int n) { for (int i = 1; i <= n; i++) cout << candidates[index[i]] << ((i == n) ? "" : "+"); cout << 阅读全文
posted @ 2012-08-16 14:55 kasuosuo 阅读(1395) 评论(0) 推荐(0)
摘要:1. 题目:给定两个有序数组(升序)。求两个数组合并之后的第k小值。2. 分析:常规算法将数组合并,之后从前向后遍历一次,找到k位的值,时间复杂度O(m+n)。改进之后的算法:不需要归并两个数组,而是使用两个指针分别从两个有序数组的起始向后走,如果a[i]<=b[j],那么i++,直到a[i]>b[j] ; 如果a[i]>=b[j],那么j++,直到a[i]<b[j],不过i和j要满足条件i+j+1<k。具体算法流程见代码。算法时间复杂度为O(k)。文章中给出了一个很好的算法:二分搜索的变形。具体见代码。3. 代码: 1 #include <iostream 阅读全文
posted @ 2012-08-16 14:08 kasuosuo 阅读(929) 评论(0) 推荐(0)
摘要:1. 题目:给定一个数组,和一个值k,数组分成k段。要求这k段子段和最大值最小。求出这个值。2.分析:这道题目很经典,也很难,个人认为很难。文章中给出了三种算法:算法1,暴力搜索。本题暴力搜索算法并不是很明显,可以使用递归实现暴力搜索。递归首先要有递归式: nn-1M[n, k] = min { max { M[j, k-1], ∑ Ai } } j=1 i=jn表示数组长度,k表示数组分成几段。初始化条件:M[1, k] = A0 n-1M[n, 1] = ∑ Ai i=0很容易发现上述的递归算法拥有指数时间的复杂度,并且会重复计算一些M值。这类的算法一般... 阅读全文
posted @ 2012-08-16 13:38 kasuosuo 阅读(2379) 评论(0) 推荐(0)
摘要:1. 面试的题目很多是关于位运算的。位运算包括:与,或,异或,取反,左移,右移。2.下面是几道位运算的经典题目。2.1 判断一个数是不是2的密次方?解析:一个数要是2的密次方,必然其二进制表示只有一位为1。所以题目转换为判读这个数是否只有一位为1??代码如下:1 bool IsTwoPower(unsigned int x) 2 { return !(x & (x-1)); } 但是上述代码有一个问题,就是当x=0时,返回值也是true,显然0不是2的密次方。代码修改如下:1 bool IsTwoPower(unsigned int x) 2 { return x && 阅读全文
posted @ 2012-08-16 10:09 kasuosuo 阅读(358) 评论(0) 推荐(0)
摘要:1. 题目:给定一个整数数组,要求输出一个数组,使新数组的第i位是原数组中除去第i位剩余数字的乘积。如输入{4,3,2,1,2},输出{12,16,24,48,24}。要求时间复杂度为:O(n),且不能使用除法运算。2. 分析:如果可以使用除法运算很容易想到的算法是将原数组中所有数字相乘,然后遍历,每次除以原数组中的第i位,即得到新数组中的第i位。但是这个算法有一个问题,要是原数组中存在一个数字为0,那么乘积自然也为0,那么新数组中的所有数字都是0,结果不对,而且除以0会导致异常。文章中给出了一个采用O(n)空间的算法,即定义数组B为原数组从左向右相乘的结果{1,4,12,24,24}(第一个 阅读全文
posted @ 2012-08-12 21:29 kasuosuo 阅读(214) 评论(0) 推荐(0)
摘要:1. 题目:顺时针螺旋输出二维矩阵。2. 分析:螺旋输出二维矩阵,每次剥除最外层的数据,下次再输出里面的数据。很容易想到,这个可以用递归实现,在输出一圈时,输出顺序为:topLeft-->topRight-->bottomRight-->bottomLeft-->topLeft。在递归程序中怎样计算每一个元素的下标这个是关键。3. 代码: 1 #include<iostream> 2 #include<cassert> 3 4 using namespace std; 5 6 #define ROW 5 7 #define COL 4 8 9 / 阅读全文
posted @ 2012-08-12 17:24 kasuosuo 阅读(458) 评论(0) 推荐(0)
摘要:1. 题目:给定一个有小写字母组成的字符串,重组这个字符串,使相同字符之间的间隔至少为d。 Input:{a,b,b}, distance=2 output:{b,a,b}。2. 个人认为这道题目很有难度。初看时不知如何下手。结合文章中给出的算法,具体算法如下:主体的算法思想是“贪心算法”。出现次数最多的字符被选中放入新字符串的优先级最高,如果这个字符不能被选中(因为距离的限制,比如上次选择了字符a,这次选择如果仍然a出现次数最多,但是却不能选a,因为如果要求距离为2,再次选择a,造成两个a相邻,那距离就为1了),那么我们选择下一个优先级最高的字符(并且这个字符的出现也要满足距离的要求,如.. 阅读全文
posted @ 2012-08-12 16:57 kasuosuo 阅读(926) 评论(0) 推荐(0)
摘要:产生死锁的根本原因:资源有限且操作不当。 死锁的四个必要条件互斥条件(Mutual exclusion):资源不能被共享,只能由一个进程使用。请求与保持条件(Hold and wait):已经得到资源的进程可以再次申请新的资源(局部资源分配条件)。非剥夺条件(No pre-emption):已经分配的资源不能从相应的进程中被强制地剥夺。循环等待条件(Circular wait):系统中若干进程组成环路,该环路中每个进程都在等待相邻进程正占用的资源。处理死锁的策略1.忽略该问题。例如鸵鸟算法,该算法可以应用在极少发生死锁的的情况下。为什么叫鸵鸟算法呢,因为传说中鸵鸟看到危险就把头埋在地底下,可能 阅读全文
posted @ 2012-08-11 09:53 kasuosuo 阅读(461) 评论(0) 推荐(0)
摘要:1. 题目:给定一个数组求出和为0的所有三元组,要求去除重复的情况,如[-1,0,1]和[0,-1,1]是相同的情况。2. 分析:有一道经典题目是:给定一个有序数组,求出和为0的所有二元组。这道题目通过两个指针,一个从前向后走,一个从后向前走。最终的时间复杂度为O(n)。本题是这道题目的变形或者说引申。最原始的算法:三重for循环,找出所有情况,时间复杂度为O(n^3)。不过,根据上面那道题目可以得到一个时间复杂度为O(n^2)的算法。要求a+b+c=0,可以变成a+b=-c这种形式,外循环遍历一次数组,相当于固定c,内循环判断a+b是否等于-c。3. 代码:View Code 1 #inc. 阅读全文
posted @ 2012-08-10 15:58 kasuosuo 阅读(1654) 评论(0) 推荐(0)
摘要:1. 题目:给定一个旋转的有序数组,比如{7,8,9,10,1,2,3}是{1,2,3,7,8,9,10}旋转之后得到的,在数组中查找是否存在元素key。要求时间复杂度为O(lgn)。假定数组中不存在重复元素。2. 分析:从上面的选择数组可以发现,array[middle]将数组分成两段,两段中必有一段是有序的。这样就可以使用二分查找了。一个变形的二分查找。3. 代码:View Code 1 #include <iostream> 2 #include <cassert> 3 4 using namespace std; 5 6 int rotateBinarySear 阅读全文
posted @ 2012-08-10 14:52 kasuosuo 阅读(1298) 评论(0) 推荐(0)
摘要:1. 题目:使用putchar(不能使用sprintf,itoa等)输出一个long整型数。2. 分析:两种方法:(1)迭代输出 (2)递归输出3. 代码:View Code 1 //递归算法 2 void putlong(unsigned long n) 3 { 4 if (n < 10) 5 { 6 putchar(n+'0'); 7 return ; 8 } 9 putlong(n / 10); 10 putchar(n % 10 + '0'); 11 } 12 13 14 //迭代算法15 vo... 阅读全文
posted @ 2012-08-10 10:25 kasuosuo 阅读(462) 评论(0) 推荐(0)
摘要:1. 题目:给定一个字符串,单词以' '或'\t'间隔,返回字符串中的单词个数。如输入:"\t ab\tc drf e ffrt\tert",输出为6。2. 解答: (1)我的思路:遍历字符串,遇到非' '或'\t',则count++,然后while循环跳过之后的所有非' '或'\t';如果是' '或'\t',然后while循环跳过所有的' '或'\t'。这样每次遇到非' '或'\t' 阅读全文
posted @ 2012-08-09 16:55 kasuosuo 阅读(543) 评论(0) 推荐(0)
摘要:1. 使用C代码去除字符串中的空格,void removeSpace(char* str)2. 解析: (1)主要考察C编程功底 (2)需要注意的问题:代码书写方式,整洁书写代码。 (3)虽然是一道简单的题目,但是很考察基础能力。3. 代码:View Code 1 #include <iostream> 2 #include <cassert> 3 4 using namespace std; 5 6 //这中编码方式存在错误 7 void removeSpace1(char *str) { 8 char *p1 = str, *p2 = str; 9 cout... 阅读全文
posted @ 2012-08-09 16:00 kasuosuo 阅读(972) 评论(0) 推荐(0)
摘要:1. 题目:如何判断一个点在三角形内部?2. 解析: (1)方法1:面积法,如下面两幅图所示,图(a)点O在ABC外侧,面积S(ABO)+S(ACO)+S(BCO)>S(ABC);图(b)点O在ABC内部,S(ABO)+S(ACO)+S(BCO)=S(ABC)。由此可以使用面积法来判断点是否在三角形内侧。 (2)方法2:三角形的边做逆时针标准,如下图。如果点在三角形内,则点必然在射线AB,BC,CA的左侧;如果点在三角形外,则点必在某条射线的右侧。 (3)方法3:从点O水平向左作一条射线,并计算与三角形各条边是否相交。如果相交的边数为奇数,则点在三角形内部;如果相... 阅读全文
posted @ 2012-08-09 10:37 kasuosuo 阅读(1780) 评论(0) 推荐(0)
摘要:1. 题目:找出两个有序数组的交集。2. 解析:给定数组a和b,a的长度为m,b的长度为n (1)最原始的方法,依次遍历a中每一个元素,并通过遍历b来判断a中元素是否在b中。时间复杂度O(m×n) (2)改进的算法,在b中查找a的元素改为二分查找,时间复杂度为O(mlgn) (3)因为a和b都是有序的,遍历a和b,并对a和b中的元素进行判断,如果a[i]<b[j] i++, 如果a[i]>b[j] j++, 如果a[i]==b[j] i++, j++。时间复杂度为O(m+n)3. 分析: (1)当m很小,n很大时,O(mlgn)二分法查找的效率高于线性查找的O(m+n), 阅读全文
posted @ 2012-08-09 09:58 kasuosuo 阅读(205) 评论(0) 推荐(0)
摘要:1. 代码如下:View Code 1 #include <iostream> 2 #include <cassert> 3 4 using namespace std; 5 6 struct Node 7 { 8 Node* m_next; 9 int m_data; 10 Node(int data=0,Node* next=NULL) 11 { 12 this->m_data=data; 13 this->m_next=next; 14 } 15 }; 16 17 Node* Create... 阅读全文
posted @ 2012-08-08 20:14 kasuosuo 阅读(419) 评论(0) 推荐(0)
摘要:1. 使用筛选法求素数的思想是:使用一个bool isPrime[N]来存储一个数是不是素数的标志位。 首先偶数不是素数(2除外),将2的倍数isPrime全部设置为false。 i从3开始遍历,如果i为素数,则将i的倍数isPrime全部设置成false。这样就筛选掉了好多不是素数的数。 从0遍历isPrime[i]数组,如果值为true,则说明i为素数,否则i不是素数。2. 代码如下: View Code 1 #include <iostream> 2 #include <cassert> 3 #include <cmath> 4 using names 阅读全文
posted @ 2012-08-08 15:28 kasuosuo 阅读(1251) 评论(0) 推荐(0)
摘要:l 并查集:(union-find sets)一种简单的用途广泛的集合. 并查集是若干个不相交集合,能够实现较快的合并和判断元素所在集合的操作,应用很多,如其求无向图的连通分量个数等。最完美的应用当属:实现Kruskar算法求最小生成树。l 并查集的精髓(即它的三种操作,结合实现代码模板进行理解):1、Make_Set(x) 把每一个元素初始化为一个集合初始化后每一个元素的父亲节点是它本身,每一个元素的祖先节点也是它本身(也可以根据情况而变)。2、Find_Set(x) 查找一个元素所在的集合查找一个元素所在的集合,其精髓是找到这个元素所在集合的祖先!这个才是并查集判断和合并的最终依据。判断两 阅读全文
posted @ 2012-08-08 11:26 kasuosuo 阅读(451) 评论(0) 推荐(0)
摘要:1. 堆是一个完全二叉树,堆主要设计到的操作有插入,删除,堆化。2. 堆的主要应用有堆排序:从小到大排序,使用大顶堆;从大到小排序,使用小顶堆。3. 下面以大顶堆为例,给出实现代码:View Code 1 #include <iostream> 2 #include <cassert> 3 4 using namespace std; 5 6 //大顶堆的实现 7 class Myheap 8 { 9 public: 10 Myheap(int hSize=DefaultSize) 11 { 12 if (hSize>DefaultSiz... 阅读全文
posted @ 2012-08-07 17:14 kasuosuo 阅读(265) 评论(0) 推荐(0)
摘要:1. 位图主要是为了节省空间,如一个整数有32位,那么可以用这个整数的32位来表示32个整数。2. 实现代码如下:View Code 1 #include<iostream> 2 #include <fstream> 3 #include <cassert> 4 5 using namespace std; 6 7 #define INT_BITS sizeof(int) 8 #define SHIFT 5 //2^5=32 9 #define MASK 0x1f //3110 #define MAX 1024*1024*1024 //可以表示的最大整数11 阅读全文
posted @ 2012-08-07 13:24 kasuosuo 阅读(789) 评论(0) 推荐(0)