上一页 1 ··· 3 4 5 6 7 8 9 下一页
摘要: 统计难题 Time Limit: 4000/2000 MS (Java/Others)Memory Limit: 131070/65535 K (Java/Others) Total Submission(s): 7635Accepted Submission(s): 2972Problem DescriptionIgnatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀).Input输入数据的第一部分是一张单词表,每行... 阅读全文
posted @ 2011-10-12 09:01 Matrix海子 阅读(1361) 评论(0) 推荐(0) 编辑
摘要: Trie树 Trie树也称字典树,因为其效率很高,所以在在字符串查找、前缀匹配等中应用很广泛,其高效率是以空间为代价的。 一.Trie树的原理 利用串构建一个字典树,这个字典树保存了串的公共前缀信息,因此可以降低查询操作的复杂度。 下面以英文单词构建的字典树为例,这棵Trie树中每个结点包括26个孩 阅读全文
posted @ 2011-10-11 23:23 Matrix海子 阅读(24384) 评论(10) 推荐(5) 编辑
摘要: C语言文件操作解析(四)在文件操作中除了打开操作以及读写操作,还有几种比较常见的操作。下面介绍一下这些操作中涉及到的函数。一.移动位置指针的函数 rewind函数和fseek函数,这两个函数的原型是:void rewind(FILE *fp); 将位置指针移动到文件首 int fseek(FILE *fp,long int offset,int origin); 将位置指针移动到距离origin的offset字节数的位置 其中对于fseek函数中的参数,origin为起始点,offset为距离origin的偏移字节数origin的值有三个:SEEK_SET(0)—>文件首,SEEK_CU 阅读全文
posted @ 2011-10-11 19:22 Matrix海子 阅读(1751) 评论(0) 推荐(0) 编辑
摘要: C语言文件操作解析(三) 在前面已经讨论了文件打开操作,下面说一下文件的读写操作。文件的读写操作主要有4种,字符读写、字符串读写、块读写以及格式化读写。一.字符读写 字符读写主要使用两个函数fputc和fgetc,两个函数的原型是: int fputc(int ch,FILE *fp);若写入成功则返回写入的字符,否则返回-1 int fgetc(FILE *fp); 若读取成功则返回读取的字符,否则返回-1注意:1)对于fputc函数和fgetc函数,每次操作,fputc只能写入1个字节的数据,无论参数ch多大,只将其低8位的数据写入到文件中;fgetc 每次只能返回一个字节的数据。2)对. 阅读全文
posted @ 2011-10-07 13:20 Matrix海子 阅读(5858) 评论(2) 推荐(3) 编辑
摘要: 堆排序 堆排序是利用堆的性质进行的一种选择排序。下面先讨论一下堆。1.堆堆实际上是一棵完全二叉树,其任何一非叶节点满足性质: Key[i]<=key[2i+1]&&Key[i]<=key[2i+2]或者Key[i]>=Key[2i+1]&&key>=key[2i+2] 即任何一非叶节点的关键字不大于或者不小于其左右孩子节点的关键字。 堆分为大顶堆和小顶堆,满足Key[i]>=Key[2i+1]&&key>=key[2i+2]称为大顶堆,满足 Key[i]<=key[2i+1]&&Key[i 阅读全文
posted @ 2011-10-06 08:51 Matrix海子 阅读(119754) 评论(33) 推荐(22) 编辑
摘要: C语言文件操作解析(二)C语言中对文件进行操作必须首先打开文件,打开文件主要涉及到fopen函数。fopen函数的原型为 FILE* fopen(const char *path,const char *mode) 其中path为文件路径,mode为打开方式 1)对于文件路径,只需注意若未明确给出绝对路径,则默认该文件在工程的目录下。若需给出绝对路径,则注意转义字符'\',比如有文件test.txt存放在C盘根目录下,则文件路径参数值应为C:\\test.txt。 2)对于mode,主要由r,w,a,+,b,t六个字符组合而成。 r:只读方式,文件必须存在 w:只写方式,若文件 阅读全文
posted @ 2011-10-05 20:54 Matrix海子 阅读(31068) 评论(7) 推荐(1) 编辑
摘要: C语言文件操作解析(一)在讨论C语言文件操作之前,先了解一下与文件相关的东西。一.文本文件和二进制文件 文本文件的定义:由若干行字符构成的计算机文件,存在于计算机系统中。文本文件只能存储文件中的有效字符信息,不能存储图像、声音等信息。狭义上的二进制文件则指除开文本文件之外的文件,如图片、DOC文档。 事实上,无论是上面所定义的文本文件还是二进制文件,在计算机中存储都是以二进制的形式存储的,因此其本质并没有区别。所以广义上的二进制文件便指所有的文件。 通常意义下,我们所说的文本文件指只包含了纯文本信息的文件(通过手动编辑完成,包含的都是可显字符),二进制文件特指文件里面存储的是二进制代码的文件. 阅读全文
posted @ 2011-10-05 15:17 Matrix海子 阅读(6362) 评论(1) 推荐(3) 编辑
摘要: 联合体union 当多个数据需要共享内存或者多个数据每次只取其一时,可以利用联合体(union)。在C Programming Language 一书中对于联合体是这么描述的: 1)联合体是一个结构; 2)它的所有成员相对于基地址的偏移量都为0; 3)此结构空间要大到足够容纳最"宽"的成员;4)其对齐方式要适合其中所有的成员;下面解释这四条描述: 由于联合体中的所有成员是共享一段内存的,因此每个成员的存放首地址相对于于联合体变量的基地址的偏移量为0,即所有成员的首地址都是一样的。为了使得所有成员能够共享一段内存,因此该空间必须足够容纳这些成员中最宽的成员。对于这句“对齐方式 阅读全文
posted @ 2011-10-03 13:13 Matrix海子 阅读(55490) 评论(11) 推荐(15) 编辑
摘要: C/C++浮点数在内存中的存储方式 任何数据在内存中都是以二进制的形式存储的,例如一个short型数据1156,其二进制表示形式为00000100 10000100。则在Intel CPU架构的系统中,存放方式为 10000100(低地址单元) 00000100(高地址单元),因为Intel CPU的架构是小端模式。但是对于浮点数在内存是如何存储的?目前所有的C/C++编译器都是采用IEEE所制定的标准浮点格式,即二进制科学表示法。 在二进制科学表示法中,S=M*2^N 主要由三部分构成:符号位+阶码(N)+尾数(M)。对于float型数据,其二进制有32位,其中符号位1位,阶码8位,尾数2. 阅读全文
posted @ 2011-10-02 22:01 Matrix海子 阅读(50423) 评论(12) 推荐(10) 编辑
摘要: 大端和小端 嵌入式开发者应该对大端和小端很熟悉。在内存单元中数据是以字节为存储单位的,对于多字节数据,在小端模式中,低字节数据存放在低地址单元,而在大端模式中,低字节数据存放在高地址单元。比如一个定义一个short型的变量a,赋值为1,由于short型数据占2字节。在小端模式中,其存放方式为0X4000 000000010X4001 00000000而在大端模式中,其存放方式为0X4000 000000000X4001 00000001若需用程序验证系统是大端模式还是小端模式(一般我们用的x86结构的都是小端模式),有两种方法1.利用联合体的性质 因为联合体中的成员是共享内存的,并且数据是从. 阅读全文
posted @ 2011-10-01 23:29 Matrix海子 阅读(1683) 评论(0) 推荐(2) 编辑
摘要: 看下面一道面试题:#include<stdio.h>#include<stdlib.h>int main(void) { int a[5]={1,2,3,4,5}; int *ptr=(int *)(&a+1); printf("%d,%d",*(a+1),*(ptr-1)); return 0;} 输出结果为:2,5在这里主要是考察*(a+1)和&a+1的区别了。很显然*(a+1)取的是a[1],然而&a+1取的是什么呢?&a不是首地址加1,而是加上1个a数组大小的偏移。因此ptr实际上等于a+5,所以*(ptr-1 阅读全文
posted @ 2011-09-26 17:07 Matrix海子 阅读(2104) 评论(0) 推荐(1) 编辑
摘要: 结构体字节对齐 在用sizeof运算符求算某结构体所占空间时,并不是简单地将结构体中所有元素各自占的空间相加,这里涉及到内存字节对齐的问题。从理论上讲,对于任何变量的访问都可以从任何地址开始访问,但是事实上不是如此,实际上访问特定类型的变量只能在特定的地址访问,这就需要各个变量在空间上按一定的规则排列,而不是简单地顺序排列,这就是内存对齐。 内存对齐的原因: 1)某些平台只能在特定的地址处访问特定类型的数据; 2)提高存取数据的速度。比如有的平台每次都是从偶地址处读取数据,对于一个int型的变量,若从偶地址单元处存放,则只需一个读取周期即可读取该变量;但是若从奇地址单元处存放,则需要2个读取. 阅读全文
posted @ 2011-09-17 10:48 Matrix海子 阅读(19138) 评论(22) 推荐(12) 编辑
摘要: Dijkstra算法(单源最短路径) 单源最短路径问题,即在图中求出给定顶点到其它任一顶点的最短路径。在弄清楚如何求算单源最短路径问题之前,必须弄清楚最短路径的最优子结构性质。 一.最短路径的最优子结构性质 该性质描述为:如果P(i,j)={Vi....Vk..Vs...Vj}是从顶点i到j的最短路 阅读全文
posted @ 2011-08-26 23:17 Matrix海子 阅读(205604) 评论(14) 推荐(7) 编辑
摘要: 二叉树的非递归遍历 二叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的。对于二叉树,有前序、中序以及后序三种遍历方法。因为树的定义本身就是递归定义,因此采用递归的方法去实现树的三种遍历不仅容易理解而且代码很简洁。而对于树的遍历若采用非递归的方法,就要采用栈去模拟实现。在三 阅读全文
posted @ 2011-08-25 20:12 Matrix海子 阅读(226604) 评论(58) 推荐(75) 编辑
摘要: KMP算法在介绍KMP算法之前,先介绍一下BF算法。一.BF算法 BF算法是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符与模式串P的第一个字符进行匹配,若相等,则继续比较S的第二个字符和P的第二个字符;若不相等,则比较S的第二个字符和P的第一个字符,依次比较下去,直到得出最后的匹配结果。 举例说明: S: ababcababa P:ababa BF算法匹配的步骤如下 i=0 i=1 i=2 i=3 i=4 第一趟:ababcababa 第二趟:ababcababa... 阅读全文
posted @ 2011-08-24 13:06 Matrix海子 阅读(84391) 评论(30) 推荐(45) 编辑
摘要: 求算n! 对于比较小的n,求其阶乘的时候可以用递归解决。但是如果n很大的时候,比如1000,那么n!肯定超出整形数据所能表示的范围。因此必须采用其它方法解决,通常解决大数运算数据超出范围的问题时采用数组去模拟。其实求算n!可以看成是每次两个整数相乘的过程,因此可以模拟成大数相乘的过程。只是需要增加一些变量去存储中间临时变量。 实现代码:#include<iostream>#define MAX 1000using namespace std;int main(void){ int n; while(scanf("%d",&n)==1&&n 阅读全文
posted @ 2011-07-16 09:55 Matrix海子 阅读(12602) 评论(2) 推荐(2) 编辑
摘要: 并查集 并查集是一种简单的用途广泛的集合。并查集是若干个不相交集合,能够实现较快的合并和判断元素所在集合的操作。应用很多,如其求无向图的连通分量个数等。最完美的应用当属:实现Kruskar算法求最小生成树。并查集的精髓在于三个操作:初始化,查找,合并。 1.三个操作 (1)初始化Make_Set() 阅读全文
posted @ 2011-07-13 13:43 Matrix海子 阅读(1159) 评论(0) 推荐(1) 编辑
摘要: 图的遍历 图的遍历有两种遍历方式:深度优先遍历(depth-first search)和广度优先遍历(breadth-first search)。 1.深度优先遍历 基本思想:首先从图中某个顶点v0出发,访问此顶点,然后依次从v0相邻的顶点出发深度优先遍历,直至图中所有与v0路径相通的顶点都被访问了 阅读全文
posted @ 2011-07-13 13:38 Matrix海子 阅读(41210) 评论(4) 推荐(3) 编辑
摘要: 二分查找 二分查找(二分搜索)又称折半查找,它要求线性表是有序的,并且需要用一维数组进行存储。二分查找的基本思想如下: 假设L[low......high]为当前要查找的区间(假设是递增有序)。 (1)首先确定该区间的中间位置,mid=(low+high)/2; (2)将待查找的key值与L[mid].key进行比较,如果相等,则查找结束;若不等,则在新的区间进行相同的操作,新的区间确定过程如下: 1)若key>L[mid].key,则key值只可能在mid的右边区间,则新的查找区间为L[mid+1,high]; 2)若key<L[mid].key,则key值只可能在mid的左边区 阅读全文
posted @ 2011-07-13 13:37 Matrix海子 阅读(1655) 评论(0) 推荐(0) 编辑
摘要: 二叉排序树 1.定义 二叉排序树(Binary Search Tree)又称二叉搜索(查找)树,其定义如下: (1)若它的左子树非空,则左子树上所有结点的权值都比根结点的权值小; (2)若它的右子数非空,则右子树上所有结点的权值都比根结点的权值大; (3)左、右子树本身又是一棵二叉排序树。 以上既是 阅读全文
posted @ 2011-07-13 13:36 Matrix海子 阅读(3695) 评论(1) 推荐(2) 编辑
上一页 1 ··· 3 4 5 6 7 8 9 下一页