摘要: 从《严书》上看到了KMP算法,看了一遍没懂,但觉得挺神奇的,就花费了几天时间深入的理解。算法的原理其实不难,难的就是那个巧妙的next数组,这个next数组很吸引我,我的大部分时间也都是花费在这个数组上面的。这个next数组是KMP里面一个很关键的地方,对于在数据结构书上看过一遍整个算法流程的人,能够把next数组搞明白,整个KMP算法的整体思想就差不多理解了。然后在一些细节上面深入思考一下,就可以理解和领会改进的KMP算法。一、KMP算法简单介绍KMP算法是字符串匹配算法的一种,相对于朴素的字符串匹配算法而言,可以大大避免重复遍历的情况。此算法可以在O(n+m)的时间数量级上完成字符串匹配操 阅读全文
posted @ 2011-09-21 14:07 张兰云 阅读(1827) 评论(0) 推荐(1)
摘要: extern 作用1:声明外部变量现代编译器一般采用按文件编译的方式,因此在编译时,各个文件中定义的全局变量是互相透明的,也就是说,在编译时,全局变量的可见域限制在文件内部。例1:创建一个工程,里面含有A.cpp和B.cpp两个简单的C++源文件://A.cpp:int iRI;int main(){//.....}//B.cppint iRI;gcc A.cpp -cgcc B.cpp -c编译出A.o, B.o都没有问题。但当gcc A.o B.o -o test时,main.o:(.bss+0x0): multiple definition of `iRI'b.o:(.bss+0 阅读全文
posted @ 2011-09-20 18:08 张兰云 阅读(2632) 评论(0) 推荐(1)
摘要: 引言:在进行网络通信时是否需要进行字节序转换?相同字节序的平台在进行网络通信时可以不进行字节序转换,但是跨平台进行网络数据通信时必须进行字节序转换。原因如下:网络协议规定接收到得第一个字节是高字节,存放到低地址,所以发送时会首先去低地址取数据的高字节。小端模式的多字节数据在存放时,低地址存放的是低字节,而被发送方网络协议函数发送时会首先去低地址取数据(想要取高字节,真正取得是低字节),接收方网络协议函数接收时会将接收到的第一个字节存放到低地址(想要接收高字节,真正接收的是低字节),所以最后双方都正确的收发了数据。而相同平台进行通信时,如果双方都进行转换最后虽然能够正确收发数据,但是所做的转换是 阅读全文
posted @ 2011-09-20 17:59 张兰云 阅读(801) 评论(0) 推荐(0)
摘要: 关于表达式去掉多余的括号括号在三种情况下可以去掉:1:开头的括号,不管怎样都可以去掉2:括号前面不是'-'号的括号,可以去掉3:括号前面是'-'号,但是里面没有运算符的也可以去掉// 1690.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include<iostream>#include<cstdio> #include<cstring> using namespace std;#define N 260int main() { int t,i,j,del[N],ma 阅读全文
posted @ 2011-09-20 10:34 张兰云 阅读(294) 评论(0) 推荐(1)
摘要: poj 1159给出一个序列,求出最少插入多少字符就能形成一个回文1:用动态规划的方法做,C[i][j]表示从i到j要插入的字符个数。状态转移方程如下:C[i][j]={ C[i+1][j-1] if char[i]=char[j]; 1+min(C[i][j-1],c[i+1][j]) if char[i]!=char[j]2:求他的反转和本身的最长公共子序列 所要插入的字符个数就是字符串长度减去最长公共子序列。 阅读全文
posted @ 2011-09-10 21:45 张兰云 阅读(256) 评论(0) 推荐(1)
摘要: 求最长上升子序列,用动态规划的方法,转移方程为:D[i]=max{1,D[j]+1} j=1,2,...,i-1并且 A[j]<A[i]其实怎么用程序把他实现也是不简单的,思想真是伟大。解法二:这个算法其实已经不是DP了,有点像贪心。至于复杂度降低其实是因为这个算法里面用到了二分搜索。本来有N个数要处理是O(n),每次计算要查找N次还是O(n),一共就是O(n^2);现在搜索换成了O(logn)的二分搜索,总的复杂度就变为O(nlogn)了。这个算法的具体操作如下(by RyanWang):开一个栈,每次取栈顶元素top和读到的元素temp做比较,如果temp > top 则将te 阅读全文
posted @ 2011-09-09 20:10 张兰云 阅读(3200) 评论(3) 推荐(2)
摘要: 搜索关键词:散列函数、散列表、哈希函数、哈希表、Hash函数、Hash表散列方法不同于顺序查找、二分查找、二叉排序树及B-树上的查找。它不以关键字的比较为基本操作,采用直接寻址技术。在理想情况下,无须任何比较就可以找到待查关键字,查找的期望时间为O(1)。一、散列表的概念1、散列表 设所有可能出现的关键字集合记为U(简称全集)。实际发生(即实际存储)的关键字集合记为K(|K|比|U|小得多)。 散列方法是使用函数h将U映射到表T[0..m-1]的下标上(m=O(|U|))。这样以U中关键字为自变量,以h为函数的运算结果就是相应结点的存储地址。从而达到在O(1)时间内就可完成查找。其中: ... 阅读全文
posted @ 2011-09-01 11:05 张兰云 阅读(3722) 评论(0) 推荐(0)
摘要: #include <stdio.h>#include <string.h>#define M 100010char sa[M], sb[M];int la, lb;int solve() { la = strlen(sa); lb = strlen(sb); int maxlen = 0; for (int i = 0; i < la; ++ i) { for (int j = 0; j < lb; ++ j) { int len = 0; for (int i1 = i, j1 = j; i1 < la && j1 < lb; 阅读全文
posted @ 2011-09-01 09:45 张兰云 阅读(253) 评论(0) 推荐(1)
摘要: 触发器:分为两种DML和DDL前一种是针对insert,update,delete的后一种是针对alter drop create trigger 触发器 on stu for insert as if(select scoer from inserted)<0 begin print ' ' rollback end go 阅读全文
posted @ 2011-08-26 21:36 张兰云 阅读(108) 评论(0) 推荐(0)
摘要: C和C++混合编程,C源文件中会调用C++源文件中定义的函数int func_cpp(int),C++也会调用C源程序中定义的函数int func_c(int),请组织程序的结构c.c, cpp.cpp, pro.h//pro.h#ifndef PRO_H#define PRO_H#ifdef _cplusplusextern "c"{#endifint func_cpp(int);int func_c(int);#ifdef _cplusplus}#endif#endif//c.c#include "pro.h"int func_c(int){.... 阅读全文
posted @ 2011-08-26 13:56 张兰云 阅读(413) 评论(0) 推荐(0)