算法总结
string_win
这个作者很懒,什么都没留下…
展开
-
高精度算法(超出范围的数值的计算)
高精度算法的实现步骤如下:读入,将数据储存到数组中,进行加减乘除的计算。储存数据时注意的问题:判断位数,由于这里是储存到字符串里面,故而数组的第一位可能是负号“-”, 此处可以用ASCII码来判断是不是等于45,标记,然后再读入数据转化为下标等于位数减一。(即下标0时是个位,这个到乘法时就会发现很奇妙了)加法:(1)上步判断并去掉了负号,加法时判断是否同号,若同号直接加,加法是用循原创 2015-12-08 22:48:22 · 1485 阅读 · 0 评论 -
线性时间排序:计数排序
算法描述:找出每一个数值在改数组中有多少个值比它小,那么就可以把这个数放在第n+1位。算法实现:遍历每一个a[i],是的c[a[i]]++。然后计算每一个数前面有多少个数。在把这些书转移,一共会用到三个数组。时间复杂度:O(n+k),k为数据的个数。比较适用于数据量大,且比较密集的情况。代码如下:#include using namespace std;int main原创 2016-01-11 22:17:11 · 254 阅读 · 0 评论 -
快速排序(随机化版本)
算法描述:每次选择一个值,将比它小的值放在它的左边,比它大的值放在它的右边。不断递归调用即可。时间复杂度:平均复杂度O(nlgn),最大复杂度为O(n2),最小复杂度为O(n)。有序程度越高,复杂度越大。最高时是每次换位都是全部分到同一边。但快速排序的稳定性比较强, 大部分都是接近于平均情况。如果每次取得值选择的是随机值,那么就稳定在平均复杂度了。代码如下(随机化版本)#include原创 2016-01-11 21:25:07 · 503 阅读 · 0 评论 -
插入排序
算法描述:从第二个值开始向左查找,找到适合的位置插入。实现过程是:如果找到比它本身大的交换,如果找到比它小的,插在该值的后面。时间复杂度:平均时间复杂度为O(n2),输入的数据越有序,速度越快。最快可以达到线性时间O(n)。代码如下:#include using namespace std;void InsertionSort(int a[], int n){ fo原创 2016-01-11 19:02:23 · 258 阅读 · 0 评论 -
选择排序
算法描述:从小到大排序:选择第二个到最后中最小的,将它与第一个交换,再选择第三个到最后的最小的,将它与第二个交换,以此类推。时间复杂度:两重循环,时间复杂度是O(n2),较为繁琐。代码如下:#include using namespace std;void SelectSort(int a[], int n){ for(int i = 0; i < n; i++)原创 2016-01-11 18:28:12 · 214 阅读 · 0 评论 -
冒泡排序
算法描述:排序的过程和排序的名字相同,这里描述的是排序从小到大的过程。每次都从第一个数开始遍历,将这个数和后面一个数对比,如果这个数的大于后面一个数,那么就把这两个数交换,如果这个数小于后面一个数,那么就拿后面一个数和后面一个数的后一个数比较,第一轮遍历过后,最后一个数就是最大的一个数了。然后第二轮遍历的次数减少一。以此类推。时间复杂度:两次循环,时间复杂度O(n2),效率比较低。原创 2016-01-11 17:57:43 · 278 阅读 · 0 评论 -
深度优先搜索(POJ1164 城堡问题)
深度优先搜索:具体做法就是沿着某条路走到尽头,如果没路了,就退回上一步,在寻找其他路线,如果再没路,继续退回上一路线,直到最开始。从而达到遍历的目的。例题:POJ1164The CastleTime Limit: 1000MS Memory Limit: 10000KTotal Submissions: 6936 Accepted: 38原创 2015-12-16 20:04:33 · 508 阅读 · 0 评论 -
区间覆盖问题(贪心)
问题描述:数轴上有n个闭区间[ai, bi], 选择尽量少的区间覆盖一条指定线段[s,t]。分析:突破口还是区间包含和排序扫描,但是可以先把每个区间在大区间以外的部分去掉,同时相互包含的情况下,此处是考虑大区间。各区间按照ai从小到达排序,如果区间1的起点不是s,那么无解。把在s之前的部分切掉,选择以s为起点的最大区间,以该区间的末尾为s,如此反复,知道最后一次替换后的s大于t为止。代码过原创 2015-12-16 00:53:24 · 451 阅读 · 1 评论 -
最优编码问题(哈夫曼编码)(贪心)
问题描述:给出n个字符的频率ci,给每个字符赋予一个01编码串,使得任意一个字符的编码不是另一个字符编码的前缀,而且编码后总长度(每个字符的频率与编码长度乘积的总和)尽量小。分析:此处策略为设置变长编码,给低频的编码设置较长,高频的编码设置较短。任何一个前缀编码都可以表示为每个非叶节点恰好有两个子结点的完全二叉树。左结点为1,右结点为0。叶节点就代表编码,那么最深处的叶节点的频率应该是原创 2015-12-16 01:39:33 · 4106 阅读 · 0 评论 -
区间选点问题(贪心)
问题描述:数轴上有n个闭区间[ai, bi]。取尽量少的点,使得每个区间内都至少含有一个点(不同区间内含的点可以是同一个)分析:区间包含,小区间满足则大区间也一定满足,步骤和选择不相交区间相似,先对bi进行非上升排序,如果bi相等则保持ai从大到小排序(大区间包含)。从第一个区间开始,取最后一个点,因为取最后一个点可以笼罩的区域最多。然后思路同不相交区间,循环,若后一个区间的起始部分大于前一个原创 2015-12-16 00:02:41 · 868 阅读 · 0 评论 -
部分背包问题(贪心) HDU1009
问题描述:有n个物体,第i个物体的重量为wi,价值为vi。在总重量不超过c的情况下让总价值尽量高。每一个物体都可以只取走一部分,价值和重量按比例计算。分析:要综合考虑价格和重量,所以应该从性价比最高的开始拿,就是单位重量价格最高的,知道刚好到达C为止。例题:hdu1009FatMouse' TradeTime Limit: 2000/1000 MS (Java/Others原创 2015-12-15 16:47:53 · 590 阅读 · 0 评论 -
选择不相交区间(活动安排问题)(贪心)(HDU2037)
数轴上有n个开区间(ai,bi)。选择尽量多个区间,使得这些区间两两没有公共点。(这里的区间可以当作是活动的时间)分析:个人理解是每一个区间尽可能选小区间,同时使数轴利用率尽可能大。(1)先对bi进行非减序排序,b1(2)对排序后的顺序进行ai的检查,若被检查的区间的开始小于前一个采用的区间的结束部分,那么就不采用该区间。如果被检查的区间的开始大于前一个采用的区间的结束部分,那么就采用原创 2015-12-15 17:43:52 · 1058 阅读 · 0 评论 -
乘船问题(贪心)
问题描述:有n个人,第i个人重量为wi。每艘船的最大载重量为c,且最多只能乘两个人。用最少的船装载所有人。分析:先按轻重排序,考虑最轻的人,让他和最重的人组合,如果跟最重的无法组合,那么重量往下减,知道可以组合。若所有人都不可以那么所有人都单船。如果有人可以,那么从第二轻的人开始,同时组合是刚刚组合到较重的人编号往下,如此递推即可。题目有点难找,这种时候还是自己脑补吧!T组数据,max原创 2015-12-15 16:59:04 · 4379 阅读 · 1 评论 -
最优装载问题(贪心)
问题简述:给出n个物体,第i个物体重量为wi。选择尽量多的物体,是的总重量不超过C。分析:最简单的一种了,排序,依次选择每一个物体,直到无法装下为止。附代码如下:#include using namespace std;int a[10010];int main(){ int n, sum = 0, maxn, k = 0; while(cin >> n原创 2015-12-15 16:11:13 · 760 阅读 · 0 评论 -
归并排序
算法分析:归并排序使用的是分治的思想,分、治、和。不断把数组二分,知道每一个小数组只有一个元素,然后在逐层合并。时间复杂度:O(nlgn)#include using namespace std;void merge1(int a[], int b[], int p, int r, int q){ int i = p, j = r+1, k = p; while原创 2016-01-11 19:03:29 · 365 阅读 · 0 评论