07 2011 档案
摘要:求算n! 对于比较小的n,求其阶乘的时候可以用递归解决。但是如果n很大的时候,比如1000,那么n!肯定超出整形数据所能表示的范围。因此必须采用其它方法解决,通常解决大数运算数据超出范围的问题时采用数组去模拟。其实求算n!可以看成是每次两个整数相乘的过程,因此可以模拟成大数相乘的过程。只是需要增加一些变量去存储中间临时变量。 实现代码:#include<iostream>#define MAX 1000using namespace std;int main(void){ int n; while(scanf("%d",&n)==1&&n
阅读全文
摘要:并查集 并查集是一种简单的用途广泛的集合。并查集是若干个不相交集合,能够实现较快的合并和判断元素所在集合的操作。应用很多,如其求无向图的连通分量个数等。最完美的应用当属:实现Kruskar算法求最小生成树。并查集的精髓在于三个操作:初始化,查找,合并。 1.三个操作 (1)初始化Make_Set()
阅读全文
摘要:图的遍历 图的遍历有两种遍历方式:深度优先遍历(depth-first search)和广度优先遍历(breadth-first search)。 1.深度优先遍历 基本思想:首先从图中某个顶点v0出发,访问此顶点,然后依次从v0相邻的顶点出发深度优先遍历,直至图中所有与v0路径相通的顶点都被访问了
阅读全文
摘要:二分查找 二分查找(二分搜索)又称折半查找,它要求线性表是有序的,并且需要用一维数组进行存储。二分查找的基本思想如下: 假设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的左边区
阅读全文
摘要:二叉排序树 1.定义 二叉排序树(Binary Search Tree)又称二叉搜索(查找)树,其定义如下: (1)若它的左子树非空,则左子树上所有结点的权值都比根结点的权值小; (2)若它的右子数非空,则右子树上所有结点的权值都比根结点的权值大; (3)左、右子树本身又是一棵二叉排序树。 以上既是
阅读全文
摘要:问题描述:n个元素的集合{1,2,, n }可以划分为若干个非空子集。例如,当n=4 时,集合{1,2,3,4}可以划分为15 个不同的非空子集如下:{{1},{2},{3},{4}},{{1,2},{3},{4}},{{1,3},{2},{4}},{{1,4},{2},{3}},{{2,3},{1},{4}},{{2,4},{1},{3}},{{3,4},{1},{2}},{{1,2},{3,4}},{{1,3},{2,4}},{{1,4},{2,3}},{{1,2,3},{4}},{{1,2,4},{3}},{{1,3,4},{2}},{{2,3,4},{1}},{{1,2,3,4}}给
阅读全文
摘要:快速排序1.算法思想 快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序。它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod)。(1)分治法的基本思想 分治法的基本思想是:将原问题分解为若干个规模更小但结构与原问题相似的子问题。递归地解这些子问题,然后将这些子问题的解组合为原问题的解。 (2)快速排序的基本思想 设当前待排序的无序区为R[low..high],利用分治法可将快速排序的基本思想描述为: ①分解:在R[low..high]中任选一个记录作为基准(Pivot),以此基准将当前无序区划分为左、右两个较小的子区间R[low..pi.
阅读全文
摘要:对给出的n个数,求出其所有的排列。思路:对于R={r1,r2,r3.......rn},其全排列可以这样去计算,perm(R)=riperm(R-ri);(1<=i<=n)即以ri为前缀不变,对剩下所有的元素进行排列。即分别以r1,r2,r3,....rn作为前缀不变,对剩下的所有元素进行全排列即为所得到的结果。同理对于perm(R-ri)的求解也是一个相同的过程,因此可以采用递归的思想去解决。#include<iostream>using namespace std;void swap(int &a,int &b){ int temp=a; a=b;
阅读全文
摘要:在前面已经提到了整数划分的问题,在那个问题中,只需要求出整数划分的个数,如果要求将整数划分的所有划分方法也输出,该如何求解?如对于整数6,输出的结果就应该是: 6 5+1 4+2 4+1+1 3+3 3+2+1 3+1+1 2+2+2 2+2+1+1 2+1+1+1+11+1+1+1+1+1 我们可以采用集合的思维去考虑,比如对于整数6,则初始集合相当于{1,1,1,1,1,1} 从1+1+1+1+1+1到2+1+1+1+1实际上就相当于我从左边那一堆{1,1,1,1,1,1}的集合中拿 两个1出来相加然后再把结果放回集合当中得到{2,1,1,1,1}.若这个时候我继续拿集合里面的两个 1..
阅读全文
摘要:Longest Ordered SubsequenceTime Limit: 2000MSMemory Limit: 65536KTotal Submissions: 18853Accepted: 8147DescriptionA numeric sequence of ai is ordered if a1 < a2 < ... < aN. Let the subsequence of the given numeric sequence (a1, a2, ..., aN) be any sequence (ai1, ai2, ..., aiK), where 1 <
阅读全文