算法
文章平均质量分 63
unclerunning
这个作者很懒,什么都没留下…
展开
-
线性筛法找质数 —正确性,无重复性证明
线性筛法找质数 —O(n)1. int main() 2. { 3. long MAXP; 4. cout << "输入范围MAXP [1~MAXP]:" << endl;5. cin >> MAXP;6. 7. long prime[MAXP] = {0},num_prime = 0; 8. int isNotPrime原创 2016-04-02 16:00:10 · 911 阅读 · 0 评论 -
输出集合{1,2,...,n}的所有子集
输出集合{1,2,…,n}的所有子集基于完全二叉树的深度优先搜索 以集合{1,2,3}为例: 基于bit pattern 对于一个含有n个元素的集合,可以用一个n位的2进制数来表这个集合,第i为1表示第i个元素在表示的集合中,否则不在 。按字典顺序排序 排在集合{X,j,i}\{X,j,i\} (X表示小于j的元素构成的某个集合)后面的集合为: 1. i#include<原创 2016-04-10 12:16:12 · 4059 阅读 · 0 评论 -
求集合{1,2,...,n}的长度等于M(M<n)的所有子集
求集合{1,2,…,n}的长度等于M(M/*这个函数用来获取所有长度等于M的子集*/void subset_length_equalTo_M(int const &n, vector<vector<int>> &result){ int M; cout << "这个函数用来获取所有长度等于M的子集,并按字典顺序排序" << endl; cout << "请输入M" << e原创 2016-04-10 16:34:27 · 1490 阅读 · 0 评论 -
求集合的分割(划分)
求集合的分割(划分)划分 把一个分割的各个集合中的元素从大到小排序,然后再以集合的最小的元素对这些集合从大到小进行排序, 排在第一的集合对应1,第二的集合对应2,依次类推。对应一个分割,有一个编码与之对应,这个编码如下: 如果元素x属于i集合,则x的码值为i。对每一个元素求出其对应于一个分割的码值,将这些码值组合起来就 得到了这个分割的编码。 如: {1,2}{3}原创 2016-04-11 17:27:18 · 2849 阅读 · 0 评论 -
正整数分割
正整数分割定义 分割: 将一个正整数划分为几个数的和的不同表示方法的总数。 记号 记P(x,y)P(x,y)表示正整数x的所有划分中,极大值不大于y的划分的总数。 例如4的所有划分: 1+1+1+1,2+1+1,2+2, 3+1,4 一共,5个,其中P(4,2)=2P(4,2)=2。 记S(x,y)S(x,y)表示正整数x的所有划分中,极大值不大于y的划分的加和序列集合,并且原创 2016-04-11 21:24:19 · 1172 阅读 · 0 评论 -
杨氏矩阵
杨氏矩阵参考操作 条件:一个已经建好的杨氏矩阵(Young Tableau) 操作: 1. 在杨氏矩阵中插入元素x —- Insert(x) 2. 在杨氏矩阵中删除位于 (x, y) 位置的元素—- Delete(x, y) 3. 返回x是否在矩阵中—-Find(x) 4. 返回第k大数3. 查找算法Find(x) — Step-wise Linear Searc原创 2016-04-17 10:14:33 · 866 阅读 · 0 评论 -
KMP字符串匹配算法(一)—模式字符串的匹配有限自动机
KMP字符串匹配算法(一)—模式匹配 KMP是一种通过对“模式串P”进行预处理之后,利用预处理信息来在“文本T”中寻找匹配的算法,这里的“模式串P”和“文本T”可以是任何意义下的可进行”相等“比较的元素集。通常情况下|P|远远小于|T|。有限自动机 之所以要提到有限自动机,是因为KMP算法与其有很大的共通之处。为在匹配过程中避免不必要的比较,他们都做了针对模式串的预处理。而且我觉得自动机里原创 2016-04-06 16:10:08 · 1478 阅读 · 0 评论 -
数值乘方算法
数值乘方算法#include<iostream>using namespace std;/*** 求一个整数的乘方* @param num 要乘方的数字* @param power 多少次方* @return*/static int MulCount;//记录乘法次数//递归版本1int power_v1(int const num, int const power){ if原创 2016-04-02 23:16:47 · 931 阅读 · 0 评论 -
在矩阵中寻找最大正方形连续区域
在矩阵中寻找最大正方形连续区域问题描叙 输入一个矩阵M、一个数字k,找出一个最大的正方形连续区域,这个区域里的数字均是k。 界的思考 对于矩阵M中的每一个元素,要么等于k要么不等于k,要知道这个数的状态,必须有一次比较。一共n个数,所以至少需要n2n^2次比较。故比较次数的下界为Ω(n2)\Omega(n^2),那么是否存在一个O(n2)O(n^2)的原创 2016-04-17 16:28:23 · 5371 阅读 · 1 评论 -
求集合的全排列
求集合的全排列旋转法: 对于含有n个元素的数组,旋转n次之后他就会恢复原状。 选择法 假如给定的集合是ABC,那么我们可以先想一下最终的结果形式可以认为是所有以A开头,以B开头和以C开头的三种。按此递归的继续下去。 以A开头的,后面还有BC,接下来的第二个字符分为两种,以B开头的和以C开头的。那么结果就是ABC,ACB 以B开头的, 结果就是BAC和BCA原创 2016-04-11 13:41:09 · 869 阅读 · 0 评论 -
寻找两个排序数组的中位数
寻找两个排序数组的中位数中位数保持 从一组数字的中位数两边删除同样多的元素(不管被删除的数字的相对顺序是什么样的),中位数保持。— 尽可以把位于中位数左边和右边的这些数字打乱,只要中位数两边被删除的数目相等就能使中位数保持(是剩下的这些数的中位数)。 情景分析 假设两个已排序的数组,记为A[m]A[m],B[n]B[n]。设想一下,当能确定这两个数组中比中位数小的数值的个数xx以及原创 2016-04-13 22:51:08 · 1261 阅读 · 0 评论 -
Fibonacci数——求第n个斐波拉契数
Fibonacci数——求第n个斐波拉契数#include<iostream>#include<cmath>#include<ctime>using namespace std;time_t begin_,end_;//递归版本一long Fibonacci_rec_v1(long const n){ if (n == 1 || n == 2) return 1L; return原创 2016-04-03 14:18:45 · 1368 阅读 · 0 评论 -
扩展Fibonacci数
问题描述: 定义一组叫做扩充的Fibonacci数如下己知X与Y 两个数,于是扩充Fibonacci数FiF_i为: Fi=⎧⎩⎨11X∗Fi−2+Y∗Fi−1i=1i=2i>2F_i=\begin{cases}1&\text{i=1} \\1&\text{i=2}\\X*F_{i-2}+Y*F_{i-1}&\text{i>2}\end{cases} 因此,当X=Y=l 时,这一组扩原创 2016-04-04 09:50:49 · 654 阅读 · 0 评论 -
最长公共子串
最长公共子串概述 给定两个字符串,求出它们之间最长的相同子字符串的长度。解法一: 找出一个字符串的所有子串,然后对他们进行比较。 一个长度为n的字符串有C0n+C1n+...+Cnn=(1+1)n=2nC_n^0+C_n^1+...+C_n^n =(1+1)^n=2^n个子字符串,要对这么多的字符串进行比较,复杂度实在是太高了。解法二: 将字符串s1和s2分别写在两把直尺上面,然后原创 2016-04-04 20:26:29 · 790 阅读 · 0 评论 -
求排列组合数C(n,r)
求排列组合数C(n,r)C(n,r)#include<iostream>#include<limits>using namespace std;/*这是一个求组合数C(n,r)的算法程序。*//*杨辉三角:0 11 1 12 1 2 13 1原创 2016-04-08 17:44:41 · 1973 阅读 · 0 评论 -
KMP字符串匹配算法(二)—KMP要点和证明
KMP字符串匹配算法(二)—KMP要点和证明字符串的前缀函数 next[q]next[q] 定义函数next(q)=max{k∣k&amp;amp;amp;amp;amp;amp;lt;q∧Pk⊃Pq}next(q)=max\{k\mid \color{red}{k&amp;amp;amp;amp;amp;amp;lt;q}\land P_k\supset P_q\}为字符串PP的前缀函数 通俗的讲 next[q]next[q] 就是能作为PqP_q的真后缀的PqP原创 2016-04-06 20:57:37 · 914 阅读 · 0 评论 -
蛇形填数问题—递归+迭代
#include<iostream>using namespace std;/* 蛇形填数问题: 输入n: 将1~n*n按下面的要求填入二维数组中: ---------> /|\ | | | <-------\|/ 例如当输入n=3时: 1 2 3 8 9 4 7 6 5*/void sna原创 2016-04-04 13:13:46 · 564 阅读 · 0 评论 -
输出正整数的所有分割
输出正整数的所有分割 同时还能解决输出正整数的分割数目的大小的问题。 在这里,递归只是一个遍历的过程,而所要解决的问题需要在这个遍历的过程中得到解决。思路 先假设一个递归函数Part(Num,MaxValue)Part(Num, MaxValue) 能够遍历Num的所有极大值不大于MaxValue的分割序列,接下来我们要做的就是在这个假设的基础上实现这样一个递归函数来完成我们要求的Par原创 2016-04-12 18:51:27 · 774 阅读 · 0 评论 -
求集合{1,2,...,n}的长度小于M(M<=n)的所有子集
求集合{1,2,…,n}的长度小于M(M<=n)的所有子集说明 参考http://blog.csdn.net/unclerunning/article/details/51112124 中提到的按字典顺序排序集合{1,2,…,n}的所有子集。 以求集合{1,2,3,4}所有长度小于2的子集为例: /*这个函数用来获取所有长度小于M的子集*/void subset原创 2016-04-10 13:12:56 · 1085 阅读 · 0 评论 -
求正整数的所有分割并输出II
求正整数的所有分割并输出II函数Part(N,M)能得到N不大于M的所有分割的集合。#include<iostream>#include<vector>#include<algorithm>#include<iterator>using namespace std;/*求正整数的所有分割并输出:case 1: N>M, Part(N,M)为集合Part(N,M-1)并上M+Part(N原创 2017-06-06 10:23:07 · 414 阅读 · 0 评论