- 博客(14)
- 资源 (1)
- 收藏
- 关注
原创 字符串匹配算法
kmp算法的时间复杂度是O(m+n) //get next value void get_next_val(char *s,int *next) { int len=strlen(s); int j=0,k=-1; next[0]=-1; while(j<len-1) { if(k==-1 || s[j]==s[k]) {
2013-05-14 22:53:32
675
原创 大数的加法和乘
用手工计算的方法即可 void mult(char *str1,char *str2,char *str3) { int s1=strlen(str1),s2=strlen(str2); memset(str3,'0',(s1+s2+1)*sizeof(str3[0])); reverse_str(str1); reverse_str(str2);
2013-05-14 22:45:32
678
原创 常见数组面试题
1、求子数组的最大和 这是一个典型DP问题,状态转移方程为M(i)=max{M(i-1)+a(i),a(i)} int max_sum(int *A,int n) { int thissum=0,maxsum=0; for(int i=0;i<n;i++) { thissum+=A[i]; if(thissum>maxsum) maxsum=thissum; if(thissu
2013-05-14 22:32:00
780
原创 O(lgn)计算斐波那契数
1、斐波那契数按如下递推式定义 f(0)=f(1)=1 f(n)=f(n-1)+f(n-2), n>=2 2.常规的求斐波那契数时间复杂度为O(n),直接用递推式求 f[0]=f[1]=0; for(i=2;i<n;i++) f[i]=f[i-1]+f[i-2]; 或者先求出通项公式,特征值为x1,x2,则 f(n)=A*x1^n+B*x2^n 3.现在主要讨论O(lgn)
2013-05-13 22:18:29
1181
1
原创 洗牌算法
1、随即函数rand()的使用方法 rand()会返回一随机数值,范围在0至RAND_MAX 间。在调用此函数产生随机数前,必须先利用srand()设好随机数种子,如果未设随机数种子,rand()在调用时会自动设随机数种子为1。那么每次调用的时候产生的随机数是一样的。 srand()用来设置rand()产生随机数时的随机数种子。用time(0)做为其参数 #include #in
2013-05-13 16:29:06
590
原创 给定RAND5,写出RAND7
描述:给定能随机生成整数1到5的函数rand5(),写出能随机生成整数1到7的函数rand7() 这个题网上有很多各种各样的答案,但是感觉都不太科学。做为一个学统计的ds,用概率论 的方法来解决这个问题。 先假定给定的函数产生的是均匀分布,即 f(x=i)=1/5 , i=1,2,3,4,5。 假设随机变量x=rand5()*(rand5()-1) 则x的分布为 x 0
2013-05-12 18:27:59
833
原创 随机分配座位以及8皇后问题
1、给定一个数组,输出数组元素的所有排列 void generate_permutation(int *arr,int beg,int ed,int len) { if(beg==ed-1) { for(int i=0;i<len;i++) cout<<arr[i]<<" "; cout<<endl; } for(i
2013-05-11 15:01:12
883
转载 The Zen of Python
Beautiful is better than ugly. Explicit is better than implicit. Simple is better than complex. Complex is better than complicated. Flat is better than nested. Sparse is better than dense. Readabilit
2013-05-10 17:03:23
537
原创 常见链表算法
链表节点的数据结构为 struct node { int data; struct node* next; } 1.创建链表 1)前插法 void create_list() { int len; head=(node*)malloc(sizeof(node)); head->next=NULL; cout>len; while(le
2013-05-10 17:01:49
766
原创 常见的树结构
1.查询二叉树(binary search tree) 性质:所有左子树节点的值 struct node { int key; node* lchild,*rchild; }; node* new_node(void) { node* t=(node*)malloc(sizeof(node)); t->lchild=t->rchild=NUL
2013-05-10 17:01:11
729
原创 并查集
按秩合并的带权并查集,常在寻找公共朋友,构造最小生成树(Kruskal)算法中。 #define N 101 struct UnionSet { //p,父节点;rank,秩 int p[N],rank[N],sz; void init_set(int n) { sz=n; //设置每个元素父节点为其本身
2013-05-10 17:00:22
549
原创 快排以及查找第K元素
1.快排。 快排,合并排序什么的必须熟练掌握啊,这么经典的算法。。。 int qsort_aux(int A[],int p,int q) { //选择最后一个元素x做为参照,将小于x和大于x的元素放在x两侧 int i=p-1,j,x=A[q]; for(j=p;j<q;j++) { if(A[p]<=x) swap(A[++i],A[j]
2013-05-10 16:59:35
908
原创 常见算法题
一、维护O(1)时间查找最大元素的栈 问题描述:一个栈stack,具有push和pop操作,其时间复杂度皆为O(1)。设计算法max操作, 求栈中的最大值,该操作的时间复杂度也要求为O(1)。 可以修改栈的存储方式,push,pop的操作,但是要保证O(1)的时间复杂度,空间时间复杂 度无要求。 可以创建一个类,类里有两个栈,一个栈S维持正常的push、po
2013-05-10 16:58:33
2231
原创 简单的字符串算法
1、标准库函数 int strlen(char* s) { if(s==NULL) return 0; int len=0; while(str[++len]!='\0'); return len; } char strcpy(char* str1,const char* str2) { if(str1==str2
2013-05-10 16:57:04
662
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人