算法
核能蚂蚁军
一个爱读历史的程序员
展开
-
最大字段和问题
应用场合:国际期货市场某种商品在某个月内的第1,2,…,31天的涨幅记作a1,a2,…a31,若某天的价值下跌,这天就是负值。如果想知道在那几天涨幅最大,究竟涨了多少,就可以抽象为最大子段问题;蛮力法:时间复杂度是O(n^2)分治法:时间复杂度为O(nlog2 n)以下是分治法(如需知道那几天的涨幅最大,还需要回溯,这里没有)#include<iostream>int M...原创 2019-03-25 23:38:39 · 292 阅读 · 0 评论 -
假币问题-减治法
【问题】在n枚外观相 司的硬币中,有一枚是假币,并且已知假币较轻。可以通过架天平来任意比较两组硬币 从而得知两组硬币的重量是否相同,或者哪一组更轻一些,假币问题:要求设计一个高效的算法来检测 出这枚假币。#include <iostream>using namespace std;const int N = 8; //假设求解8枚硬币...原创 2019-04-11 22:01:31 · 2083 阅读 · 1 评论 -
两个序列的中位数-减治法
前提:两个比较的序列都为有序的#include<stdio.h>#include <iostream>#include<iomanip>using namespace std;int SearchMId(int A[],int B[],int n){ int s1=0,e1=n-1,s2=0,e2=n-1; int mid1,mid2; whi...原创 2019-04-09 15:06:02 · 1138 阅读 · 1 评论 -
折半查找-减治法
前提是:有序序列#include<stdio.h>#include <iostream>#include<iomanip>using namespace std;int BinSearch1(int r[],int n,int k){ int low=0; int high=n-1; int mid; while(low<=high)...原创 2019-04-09 15:23:37 · 2123 阅读 · 3 评论 -
二叉树查树-减治法
源代码:#include<stdio.h>#include <iostream>#include<iomanip>using namespace std;struct BiNode{ int data; BiNode *lchild,*rchild;};BiNode * SearchBST(BiNode * root,int k){ if(...原创 2019-04-09 20:15:31 · 1011 阅读 · 0 评论 -
选择问题-减治法
选择问题:对于无序序列62,47,54,76,95,34,42,84,72,56,找出第9小的数。写出求解过程及最终结果#include<stdio.h>#include <iostream>#include<iomanip>using namespace std;int Partition(int r[],int low,int high) /...原创 2019-04-09 21:02:25 · 3006 阅读 · 0 评论 -
数塔问题-动态规划法
对以下数塔,进行动态规划的填表:对每一个数塔进行求解:代码:#include <iostream>using namespace std;const int n=5;int DataTower(int d[n][n]){ int maxAdd[n][n]={0},path[n][n]={0}; //maxAdd二维数组存储最大数值 path数组存储确实每一层决...原创 2019-04-16 21:37:59 · 1308 阅读 · 0 评论 -
多短图的最短路径问题-动态划分法
应用示例:在车辆中安装了车辆导航系统,人们就可以不必为迷路、绕远而担心,只需点击所在位置与目的地,路径规划会帮你找出到达目的地的最短路线。路径规划是基于具有拓扑结构的道路网络,在车辆行驶前或行驶过程中寻找车辆从起始点到达目的地的最佳行车路线的过程,它是多段图最短路径问题的典型应用。对以下多段图,求出从原点1到终点10的最短路径。分析:源代码:#include <iostr...原创 2019-04-16 22:39:19 · 3490 阅读 · 0 评论 -
多源点最短路径问题Floyd算法-动态规划法
多源点最短路径问题Floyd算法,如图:分析过程:代码:#include<iostream>#include<iomanip>using namespace std;const int n=3;void Floyd(int arc[n][n],int dist[n][n]){ int i,j,k; for(i=0;i<n;i++) for(...原创 2019-04-16 23:57:16 · 2439 阅读 · 0 评论 -
最长公共子序列问题-动态规划法
源代码:#include<iostream>using namespace std;int L[10][10],S[10][10];int CommonOrder(char x[],int m,char y[],int n,char z[]){ int j,i,k; for(j=0;j<=n;j++) { L[0][j]=0; } for(i=0;i&l...原创 2019-05-14 15:30:38 · 558 阅读 · 0 评论 -
最长递增子序列-动态规划法
#include<iostream>#include<iomanip>using namespace std;int IncreaseOrder(int a[],int n){ int i,j,k,index; int L[10],x[10][10]; for(i=0;i<n;i++) { L[i]=1; x[i][0]=a[i]; } f...原创 2019-05-07 15:30:05 · 353 阅读 · 0 评论 -
0/1背包问题-动态规划法
算法实现设n个物品的重量存储在数组w[n]中,价值存储在数组v[n]中,背包容量为C,数组V[n+1][C+1]存放迭代结果,其中V[i][j]表示前i个物品装入容量为j的背包中获得的最大价值,数组x[n]存储装入背包的物品,动态规划法求解0/1背包问题的算法如下:#include <iostream>using namespace std;int V[6][7];int...原创 2019-05-14 22:42:22 · 518 阅读 · 0 评论 -
图着色问题-贪心法
#include<iostream>using namespace std;const int n=5;static int arc[100][100];static color[100];int ok(int i){ for(int j=0;j<n;j++) if(arc[i][j]==1&&color[i]==color[j]) r...原创 2019-05-21 15:29:05 · 9866 阅读 · 3 评论 -
最小生成树——prim算法——贪心法
Lowcost[v]代表顶点到生成树中所有顶点的最短边,adjvex[v]表示最短边在生成树中的顶点。#include<iostream>using namespace std;const int n = 6;const int max = 100;typedef struct{ int lowcost; int adjvex;}Element;void Pr...原创 2019-05-31 14:33:14 · 1009 阅读 · 0 评论 -
背包问题——贪心法
注意:在计算前,物品已按照单位重量价值进行降序排序。使用函数sort();另外注意:和0/1背包问题的区别,在背包问题中,可以讲某种物品的一部分装入背包中,但是不能重复装入。解:物品1 重量2 价值10物品2 重量3 价值5物品3 重量5 价值15物品4 重量7 价值17物品5 重量1 价值6物品6 重量4 价值18物品7 重量1 价值3通过算出单位重量价值分别为:5;5/3;...原创 2019-05-31 16:07:08 · 711 阅读 · 0 评论 -
素数环——回溯法
素数环满足三个条件:1)与已经填写的素数环中的整数不重复2)与前面相邻的整数之和是个素数3)最后一个填写到素数环中的整数与第一个填写的整数之和是整数20以内的素数环:1 2 3 41 4 3 2 5 61 2 3 8 5 6 7 41 2 3 4 7 6 5 8 9 101 2 3 4 7 6 5 12 11 8 ...原创 2019-05-31 20:18:59 · 641 阅读 · 0 评论 -
淘汰赛冠军问题-减治法
问题:假设有2^k个****(前提)选手进行竞技淘汰赛,最后决出冠军的选手。#include<stdio.h>#include <iostream>#include<iomanip>using namespace std;bool Comp(int r1,int r2){ if(r1>r2) return true; else r...原创 2019-04-11 20:34:45 · 6279 阅读 · 2 评论 -
堆排序-减治法
注意,C++语言的数组下标是从0开始,则r[i]的左子树是r[2i+1],右子树是r[2i+2];#include<stdio.h>#include <iostream>#include<iomanip>using namespace std;void SiftHeap(int r[],int k,int n){ int i,j,temp; i=...原创 2019-04-11 20:11:09 · 1774 阅读 · 1 评论 -
棋盘问题
应用场景:小游戏本代码运用的是分治法的思想我的编译过程中错误点:cout<<setw(4)<<board[x][y];中的setw(4)错误的原因是没有添加头文件这是在头文件<iomanip.h>里的,编译找不到的原因分治法:#include <iostream>#include<iomanip>using namesp...原创 2019-03-26 14:38:33 · 114 阅读 · 0 评论 -
数字旋转方阵问题-分治法
分治法:数字旋转方阵问题#include<stdio.h>#include <iostream>#include<iomanip>using namespace std;int data[5][5];void Full(int number,int begin,int size){ int i,j,k; if(size==0) retur...原创 2019-04-01 20:15:30 · 1468 阅读 · 0 评论 -
归并排序——分治法 —排序
归并排序时间复杂度:O( n log2 n)#include<stdio.h>#include <iostream>#include<iomanip>using namespace std;int r[10];void Merge(int r[],int r1[],int s,int m,int t){ int i=s,j=m+1,k=s; w...原创 2019-04-01 21:50:10 · 133 阅读 · 0 评论 -
子集问题-有多少种元素组合,2^n
子集问题。输出集合{1,2,3,4}的所有子集#include <iostream>using namespace std;bool B[1000];int S[1000];int len;void printSubset(int cur) { if(cur == len) { for(int i = 0; i < cur; i++) if(B[i]) ...转载 2019-03-22 19:07:13 · 334 阅读 · 0 评论 -
排序思想-分治法
分别代表输出的是什么类型:%c:字符%d:有符号十进制整数%f:浮点数(包括float和doulbe)%e(%E):浮点数指数输出[e-(E-)记数法]%g(%G):浮点数不显无意义的零"0"%i:有符号十进制整数(与%d相同)%u:无符号十进制整数%o:八进制整数 e.g. 0123%x(%X):十六进制整数0f(0F) e.g. 0x1234%p:指针%s:字符串#in...原创 2019-04-02 10:22:41 · 418 阅读 · 0 评论 -
最近对问题-分治法
应用示例:假设一个金属片上钻n个孔,如果孔距离的太近就会发生断裂,需要判断最近距离就是最近对问题double Closest(point S[], int low, int high); //实现求最近对距离double Distance(point a, point b); //求两点之间距离int Parti...原创 2019-04-02 13:19:48 · 191 阅读 · 0 评论 -
快速排序-分治法-排序
快速排序:初始键值序列: 34 20 71 26 23 9 44 35i j右侧扫描直到R[j]<34,且交换后i++: 9 20 71 26 23 34 44 35i j左侧扫描直到R[i]>34,且交换后j–: 9 20 34 26 23 71 44 35i j右侧扫描直到...原创 2019-04-02 14:39:06 · 2319 阅读 · 0 评论 -
BF算法--蛮力法-串匹配问题
BF算法:输入:主串S,模式T输出:T在S中的位置第一趟匹配 i-> 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16I=2,j=2 a b a b c a b c c a b c a c b a b匹配失败 j-&...原创 2019-04-02 14:51:05 · 636 阅读 · 0 评论 -
顺序查找--蛮力法
第一种方法:时间复杂度:O(n)#include<stdio.h>int Search(int r[],int n,int x){ //int n参数是指数组长度,int x参数是指查询的值 int i=n; r[0]=x; while(r[i]!=x) i--; return i;}void main(){ int d[]={1,2,3,4,7,9,5...原创 2019-04-02 15:03:47 · 944 阅读 · 1 评论 -
KMP算法--蛮力法--串匹配问题
KMP算法:输入:主串S,模式T输出:T在S中的位置J = a b c a cNext[j] = { -1 0 0 0 1 }第一趟匹配 i-> 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16I=2,j=2 a b a b c a b c c a b...原创 2019-04-02 15:11:38 · 720 阅读 · 0 评论 -
真分数化简为最简分数(6/8==3/4)
真分数化简为最简分数注意: 真分数(分母一定大于分子)#include<iostream> #include<stdio.h> using namespace std; //namespace是指标识符的各种可见范围 int main(){ int n;//分子 int m;//分母 int f...原创 2019-04-02 15:18:37 · 3456 阅读 · 0 评论 -
全排列问题——枚举法--多层循环--蛮力法
全排列问题。输出1、2、3、4,5这5个数的全排列#include<iostream> #include<cstring>using namespace std; int main(){ int n1,n2,n3,n4,n5; //用5个变量表示每个位置上的数字 int count=0; //全排列个数 for(n1=1;n1<...原创 2019-04-02 15:37:15 · 1055 阅读 · 0 评论 -
最近对问题-蛮力法
最近对问题:#include<stdio.h>void ClosestPoints(int x[],int y[],int n){ int index1,index2; int d,minDist=1000; int i,j; for(i=0;i<n-1;i++) for(j=i+1;j<n;j++){ d=(x[i]-x[j])*(x[i]-x[...原创 2019-04-02 15:47:26 · 258 阅读 · 0 评论 -
插入查找-减治法
r[0]有两个作用:一是进入查找插入位置的循环之前,暂存了r[i]的值,使得不至于因记录的后移而丢失r[i]的内容;二是查找插入位置的循环中充当观察哨#include<stdio.h>#include <iostream>#include<iomanip>using namespace std;void InsertSort(int r[],int n...原创 2019-04-11 19:41:51 · 349 阅读 · 0 评论 -
图着色问题——回溯法
while (k>=1)依次考察每一种颜色,若顶点k的着色与其他顶点的着色不发生冲突,则转步骤2);否则,搜索下一个颜色;若顶点已全部着色,则输出数组color[n],返回;否则,A. 若顶点k是一个合法着色,则k=k+1,转步骤1)处理下一个顶点;B. 否则,重置顶点k的着色情况,k=k-1,转步骤1)回溯;#include<iostream>using na...原创 2019-05-31 21:33:55 · 1724 阅读 · 0 评论