基本算法
文章平均质量分 65
CNnumen
If i want , i must try...
展开
-
二分查找递归和非递归实现
<br />#include <cstdlib>#include <iostream>#include <vector>#include <algorithm>using namespace std;void binarySearch(const vector<int>::iterator &begin, const vector<int>::iterator &end, int aim){ if(*(begin + (end - begin) / 2) == aim)原创 2010-07-06 15:11:00 · 787 阅读 · 0 评论 -
对任意输入的正整数N,编写C程序求N!的尾部连续0的个数...
对任意输入的正整数N,编写C程序求N!的尾部连续0的个数,并指出计算复杂度。如:18!=6402373705728000,尾部连续0的个数 是3。(不用考虑数值超出计算机整数界限的问题)#include #include using namespace std;int getCount(int n){ int count = 0; for(int i=5; i原创 2010-07-27 23:25:00 · 4211 阅读 · 0 评论 -
第(前)k大数问题
<br />所谓“第(前)k大数问题”指的是在长度为n(n>=k)的乱序数组中S找出从大到小顺序的第(前)k个数的问题。<br />解法1: 我们可以对这个乱序数组按照从大到小先行排序,然后取出前k大,总的时间复杂度为O(n*logn + k)。<br />解法2: 利用选择排序或交互排序,K次选择后即可得到第k大的数。总的时间复杂度为O(n*k)<br />解法3: 利用快速排序的思想,从数组S中随机找出一个元素X,把数组分为两部分Sa和Sb。Sa中的元素大于等于X,Sb中元素小于X。这时有两种情况:<b转载 2010-07-31 22:28:00 · 1162 阅读 · 0 评论 -
AC自动机...
<br />多串匹配-AC自动机<br /> AC自动机即 Aho-Corasick automation,该算法在1975年产生于贝尔实验室。AC自动机是用来处理多串匹配问题的,即给你很多串,再给你一篇文章,让你在文章中找这些串是否出现过,在哪出现。AC自动机思想简单来讲就是在 Trie 上进行 KMP 匹配,所以先要知道 Trie数据结构 和 KMP算法。 AC自动机先将所有模式串构建成单词树,如有模式串 { she, he, say, shr, her, ayd },我们先构建成如下单词树:假设我们转载 2010-08-04 10:29:00 · 724 阅读 · 0 评论 -
AC自动机详解...
<br /> AC自动机算法详解<br /> 首先简要介绍一下AC自动机:Aho-Corasick automation,该算法在1975年产生于贝尔实验室,是著名的多模匹配算法之一。一个常见的例子就是给出n个单词,再给出一段包含m个字符的文章,让你找出有多少个单词在文章里出现过。要搞懂AC自动机,先得有模式树(字典树)Trie和KMP模式匹配算法的基础知识。AC自动机算法分为3步:构造一棵Trie树,构造失败指针和模式匹配过程。<br /> 如果你对KMP算法和了解的话,应该知道KMP算法中转载 2010-08-03 17:24:00 · 988 阅读 · 1 评论 -
随机数生成...
<br />生成0~n-1之间的k个不同的随机顺序的随机整数...<br /> <br />#include <cstdlib>#include <iostream>#include <algorithm>using namespace std;const int MAX = 100;int main(int argc, char *argv[]){ int n; cin >> n; int vec[n]; for(int i=0;原创 2010-08-10 09:06:00 · 871 阅读 · 0 评论 -
数组元素的循环左移和右移...
<br />数组元素循环左(右)移K位...<br /> <br />#include <cstdlib>#include <iostream>#include <algorithm>using namespace std;void reverse(char *a, int left, int right){ while(left <= right) swap(a[left++], a[right--]);}void shiftRight(char *原创 2010-08-10 10:14:00 · 2368 阅读 · 1 评论 -
正向最大匹配和反向最大匹配
<br />百度分词算法-正向最大匹配和反向最大匹配Post by 5151seo.cn, 2009-8-13, Views:392<br />最近看了一下分词算法的东西,整理如下:<br />下面介绍的分词算法中最简单的正向最大匹配和反向最大匹配。<br />这种两种方法都是机械分词方法,它是按照一定的策略将待分析的汉字串与一个”充分大的”机器词典中的词条进行配,若在词典中找到某个字符串,则匹配成功(识别出一个词)。<br />按照扫描方向的不同,串匹配分词方法可以分为正向匹配和逆向匹配;按照不同长度优先转载 2010-08-11 10:57:00 · 3113 阅读 · 0 评论 -
抽屉原理...
<br /><br />抽屉原理<br />抽屉原理有时也被称为鸽巢原理(“如果有五个鸽子笼,养鸽人养了6只鸽子,那么当鸽子飞回笼中后,至少有一个笼子中装有2只鸽子”)。它是德国数学家狄利克雷首先明确的提出来并用以证明一些数论中的问题,因此,也称为狄利克雷原理。它是组合数学中一个重要的原理。<br />假设有3个苹果放入2个抽屉中,则必然有一个抽屉中有2个苹果,她的一般模型可以表述为:<br />第一抽屉原理:把(mn+1)个物体放入n个抽屉中,其中必有一个抽屉中至少有(m+1)个物体。<br /> 若转载 2010-08-10 21:28:00 · 1092 阅读 · 0 评论 -
查找一段文字中最长的重复字串 - 编程珠玑(排过序的后缀数组的应用)
<br /><br />《编程珠玑》在第15章“珍珠字符串”一节,给出了一个非常漂亮的实现 - 基于目标字符串的后缀数组的实现。<br /><br />后缀数组类似于后缀树,但是又有所不同。<br />后缀树常用来查找某一段文字中是否出现过(多个)模式串,通过对目标文字段预处理建立后缀树实现。(如果你不明白,参考本blog有一个 字符串模式匹配总结的文章,里面有一篇参考文章将后缀树)。<br />也可以参考如下文章。<br />后缀树学习 - [ACM]<br />http://kinslovertec.b转载 2010-08-11 14:43:00 · 1052 阅读 · 0 评论 -
后缀树...
<br /><br />在pongba的讨论组上看到一道Amazon的面试题:找出给定字符串里的最长回文。例子:输入XMADAMYX。则输出MADAM。这道题的流行解法是用后缀树(Suffix Tree)。这坨数据结构最酷的地方是用它能高效解决一大票复杂的字符串编程问题:在文本T里查询T是否包含子串P(复杂度同流行的KMP相当)。文本T里找出最长重复子串。比如abcdabcefda里abc同da都重复出现,而最长重复子串是abc。找出字符串S1同S2的最长公共子串。注意不是常用作动态规划例子的LCS哈。比如转载 2010-08-11 14:49:00 · 862 阅读 · 0 评论 -
定义一个函数求字符串的长度,要求该函数体内不能声明任何变量
<br />定义一个函数求字符串的长度,要求该函数体内不能声明任何变量<br /> <br />#include <cstdlib>#include <iostream>using namespace std;int getLen(char *str){ if(*str== '/0') return 0; return getLen(str + 1) + 1;}int main(int argc, char *argv[]原创 2010-08-11 17:54:00 · 5275 阅读 · 0 评论 -
常见的英文单词纠错法...
<br />常见的英文单词纠错法有:,主要有误拼词典法、词形距离法、最小编辑距离法、相似键法、骨架键法、N-gram法、基于规则的技术、词典及神经网络技术。(1)误拼字典法。收集大规模真实文本中拼写出错的英文单词并给出相应的正确拼写,建造一个无歧义的误拼字典。在进行英文单词拼写检查时,查找误拼字典,如命中,则说明该单词拼写有误,该词的正确拼写字段为纠错建议。该方法的特点是侦错和纠错一体化,效率高。但英文拼写错误具有随机性,很难保证误拼字典的无歧义性和全面性,因此查准率低、校对效果差。(2)词形距离法转载 2010-08-18 12:04:00 · 3380 阅读 · 0 评论 -
递归的基本应用练习...
<br />/*将一整数逆序后放入一数组中(要求递归实现)*/#include <cstdlib>#include <iostream>using namespace std;void revert(int *a, int index, int val){ if(val >= 10) revert(a, index + 1, val / 10); a[index] = val % 10;}int main(int argc, char *ar原创 2010-09-25 22:40:00 · 1088 阅读 · 0 评论 -
求n的m次方的后三位...
<br />#include <cstdlib>#include <iostream>using namespace std;int main(int argc, char *argv[]){ int x, y; cin >> x >> y; int result = 1; for(int i=0; i<y; i++) result = result * x % 1000; cout << resul原创 2010-07-27 22:46:00 · 7311 阅读 · 1 评论 -
斐波那契数列高效递归解法...
#include #include using namespace std;const int MAX = 100;__int64 fac[MAX] = {0};__int64 fact(int n){ if(n 0) return fac[n]; fac[n] = fact(n - 1) + fact(n - 2); return fac[n];} int main(int原创 2010-07-25 23:03:00 · 1060 阅读 · 0 评论 -
ZOJ_1383
<br />#include <cstdlib>#include <iostream>#include <bitset>using namespace std;int main(int argc, char *argv[]){ int caseCount; cin >> caseCount; while(caseCount-- > 0) { int value; cin >> value;原创 2010-07-26 14:41:00 · 978 阅读 · 0 评论 -
quick sort
<br />#include <cstdlib>#include <iostream>#include <vector>#include <algorithm>//#include <cmath>using namespace std;int const MAX = 100;int calPart(vector<int> &arr, int low, int high){ int partPos = low; int base = arr.at(low);原创 2010-07-09 11:21:00 · 656 阅读 · 0 评论 -
排列问题
<br />#include <cstdlib>#include <iostream>#include <vector>#include <algorithm>using namespace std;void rank(vector<int> &vec, int low, int high){ if(low == high) { for(int i=0; i<vec.size(); i++) cout << ve原创 2010-07-16 15:48:00 · 596 阅读 · 0 评论 -
KMP算法实现
<br />#include <cstdlib>#include <iostream>#include <string>#include <vector>using namespace std;void getTab(string pat, vector<int> &vec){ int patLen = pat.size(); vec.push_back(-1); for(int i=1; i<patLen; i++)原创 2010-07-19 15:23:00 · 475 阅读 · 0 评论 -
计算一个整数中1的个数...
<br />#include <cstdlib>#include <iostream>#include <bitset>using namespace std;int getCount(int x){ int count = 0; while(x) { count++; x &= (x - 1); } return count;}int main(int argc, ch原创 2010-07-20 16:40:00 · 1269 阅读 · 0 评论 -
KMP实现(二)
<br />#include <cstdlib>#include <iostream>#include <string>#include <vector>using namespace std;void getTab(string pat, vector<int> &vec){ int patLen = pat.size(); vec.push_back(-1); int i = 0, j = -1; while(i < p原创 2010-07-20 11:27:00 · 480 阅读 · 0 评论 -
大数据量,海量数据处理方法总结(转)
<br /><br />1.Bloom filter适用范围:可以用来实现数据字典,进行数据的判重,或者集合求交集基本原理及要点:对 于原理来说很简单,位数组+k个独立hash函数。将hash函数对应的值的位数组置1,查找时如果发现所有hash函数对应位都是1说明存在,很明显这 个过程并不保证查找的结果是100%正确的。同时也不支持删除一个已经插入的关键字,因为该关键字对应的位会牵动到其他的关键字。所以一个简单的改进就是 counting Bloom filter,用一个counter数组代替位数组,就可以转载 2010-07-22 12:53:00 · 786 阅读 · 0 评论 -
整数划分(计数+划分显示)
<br />#include <cstdlib>#include <iostream>using namespace std;const int MAX = 100;int fac[MAX] = {0};int sum(int count){ int sum = 0; for(int i=0; i<=count; i++) sum += fac[i]; return sum;}void display(int count, in原创 2010-07-22 17:40:00 · 912 阅读 · 0 评论 -
整数划分(计数)
<br />#include <cstdlib>#include <iostream>using namespace std;int getCount(int value, int max){ if(value < 1 || max < 1) return 0; if(value == 1 || max == 1) return 1; if(value <= max) return 1 + getCount(原创 2010-07-22 16:28:00 · 550 阅读 · 0 评论 -
整数划分部分问题和算法
<br /><br />整数划分部分问题和算法<br /> <br />一.基本划分问题<br />问题描述:给定一个正整数n,求将其划分为m份的不同方法数。<br />问题分析:<br />(1) 首先,何谓不同方法总数?即两个不同的划分的元素不能完全相同,eg:10 = 1+2+3+4,是10的一个划分,那么10 = 2+1+3+4也应该是10的一个划分,但是由于这两个划分的元素完全相同,所以实际只能算同一种划分。<br />(2) 搞清楚不同方法数之后,那么如果我们在划分时只要按照不下降排列的转载 2010-07-22 19:38:00 · 5839 阅读 · 0 评论 -
迷宫问题...
<br />#include <cstdlib>#include <iostream>#include <fstream>#include <vector>#include <iterator>#include <algorithm>using namespace std;const int NODE_COUNT = 6;vector<int> traceVec;int visit[NODE_COUNT + 1] = {0};typedef struct _NODE原创 2010-07-25 22:54:00 · 615 阅读 · 0 评论 -
n个数中选m个数的全组合...
<br />#include <cstdlib>#include <iostream>using namespace std;const int MAX = 10;int val[MAX];int res[MAX];int m, n;void getAssem(int l, int p){ if(l == m) { for(int i=0; i<m; i++) cout << res[i] << " ";原创 2010-07-25 22:56:00 · 2555 阅读 · 0 评论 -
n个数的所有组合...
<br />#include <cstdlib>#include <iostream>using namespace std;const int MAX = 10;int val[MAX];int res[MAX];int m;void getAssem(int l, int p){ for(int i=0; i<l; i++) cout << res[i] << " "; cout << endl; fo原创 2010-07-25 22:59:00 · 1215 阅读 · 0 评论 -
n后问题迭代, 递归解法...
<br />迭代回溯:<br />#include <cstdlib>#include <iostream>using namespace std;const int MAX = 100;bool isPosVaild(int res[], int row){ for(int i=1; i<row; i++) if(res[row] == res[i] || (abs(res[row] - res[i]) == abs(row - i)))原创 2010-07-26 11:52:00 · 622 阅读 · 0 评论 -
寻找倒数第K个节点...
<br />#include <cstdlib>#include <iostream>using namespace std;typedef struct _NODE{ int value; struct _NODE *next; _NODE(int val) : value(val), next(NULL){}}NODE, *PTRNODE;void createList(PTRNODE &head){ PTRNODE cur原创 2010-09-26 09:38:00 · 1150 阅读 · 0 评论