玩转数据结构与算法
学会算法,走遍天下都不怕。
mind_programmonkey
好久没上线了~,有问题私信哈,每周末尽量抽时间回答问题哈
展开
-
数据结构和算法的知识图谱
原创 2019-04-19 11:20:53 · 1488 阅读 · 0 评论 -
算法篇之贪心法
算法篇之贪心法 -----细说贪心法(细说不是胡说)目录算法篇之贪心法前言...原创 2019-03-23 19:44:53 · 954 阅读 · 1 评论 -
算法篇之回溯法
算法篇之回溯法 --细说回溯法(细说不是胡说)...原创 2019-03-23 16:02:57 · 2705 阅读 · 2 评论 -
算法篇之动态规划
算法篇之动态规划 --细说动态规划(细说不是胡说)目录前言一、什么是...原创 2019-03-21 15:29:41 · 794 阅读 · 1 评论 -
算法篇之分治算法--输出前k大个数
例题3:输出前k大的数描述:给定一个数组包含n个元素,统计前k大的数并且把这k个数从大到小输出。输入:第一行包含一个整数n,表示数组的大小。n<100000第二行包含n个整数,表示数组的元素,整数之间以一个空格分开。每个整数的绝对值不超过100000000.第三行包含一个整数k,k<n.输出:从大到小输出前k大的数,每个数一行。 解析:引入操作arr...原创 2019-01-07 21:18:25 · 2553 阅读 · 0 评论 -
算法篇之分治算法--快速排序
2.快速排序/**数组排序任务可以如下完成:第一步:设k=a[0],将k挪到适当位置,使得比k小的元素都在k左边,比k大的元素都在k右边 ,和k相等的,不关心在k左右出现均可。第二步:把k左边的部分快速排序第三步:把k右边的部分快速排序*/#include<iostream>#define maxsize 100using namespace st...原创 2019-01-07 21:16:27 · 494 阅读 · 0 评论 -
算法篇之分治算法--归并排序
分治算法分治:把一个任务分成形式和原任务相同,但规模更小的几个部分任务(通常是两个部分),分别完成,或只需要选一部分完成。然后再处理完成后的这一个或几个部分的结果,实现整个任务的完成。 例题1:归并排序数组排序任务可以如下完成:a.把前一半排序 b.把后一半排序c.把两半归并到一个新的有序数组,然后再拷贝回原数组,排序完成。 /**归并排序先对前一半归并...原创 2019-01-07 21:15:34 · 657 阅读 · 0 评论 -
算法篇之二分算法
例题1:寻找指定和的整数对输入n(n<=100,000)个整数,找出其中的两个数,它们之和等于整数m(假定肯定有解)。/**找一对数(1)数组排序sort()函数用于C++中,对给定区间所有元素进行排序。头文件是#include <algorithm>(2)二分查找 对每个元素a[i],在数组中二分查找m-a[i],看能否找到 */#include<i...原创 2019-01-07 16:24:19 · 362 阅读 · 0 评论 -
算法篇之递归学习(二)
例题1爬楼梯树老师爬楼梯,他可以每次走一级或者2级,输入楼梯的级数,求不同的走法数。/**爬楼梯例如:楼梯一共有三级,他可以每次都走一级,或者第一次走一级,第二次走两级也可以第一次走两级,第二次走一级,共3种方法。 n阶台阶的走法=先走一级后,n-1级台阶的走法+先走两级后,n-2级台阶的走法 f(n)=f(n-1)+f(n-2) */ #include<iostr...原创 2019-01-06 20:30:02 · 500 阅读 · 0 评论 -
算法篇之递归学习(一)
递归:一个函数调用其自身函数 例题1 求阶乘/**求阶乘问题 */ #include<iostream>using namespace std;int Factorial(int n){ if(n==0) return 1; return n*Factorial(n-1);}int main() { int n; cin>>n;...原创 2019-01-05 21:10:18 · 473 阅读 · 0 评论 -
算法篇之枚举学习
枚举法:基于逐个尝试答案的一种问题求解策略例题1:完美立方描述:a^3 = b^3+ c^3 + d^3为完美立方等式。例如12^3=6^3+ 8^3 + 10^3 。编写一个程序,对任给的正整数N (N≤100), 寻找所有的四元组(a, b, c, d),使得a^3 = b^3+ c^3 + d^3,1<a,b,c,d<=N.样例输入 :24样例输出:...原创 2019-01-05 18:48:36 · 409 阅读 · 0 评论 -
算法初入门--枚举、递归。贪心
1.枚举枚举法,也称作穷举,指的是从问题所有可能的解的集合中一一枚举各元素。题目中给定的检验条件判定哪些是无用的,哪些是有用的。 优点是算法简单,在局部地方使用枚举法,效果十分好。缺点是运算量过大,当问题的规模变大的时候,循环的阶数越大,执行速度越慢。例题:百钱买白鸡问题:有一个人有一百块钱,打算买一百只鸡。到市场一看,公鸡一只3元,母鸡一只5元,小鸡3只1元,试求用100元买1...原创 2019-01-05 08:56:24 · 838 阅读 · 0 评论 -
判断一棵树是否为二叉排序树
怎么样判断一棵树是否为二叉排序树int justBT(BTNode *p,BTNode *pre){ int p1,p2; if(p==NULL) return 1; else { p1=justBT(p->lchild,pre); if(p1==0||pre->data>p->data) return 0; pre=p; p2=...原创 2018-12-27 08:08:40 · 1849 阅读 · 1 评论 -
排序的总结
//1.直接插入排序void InsertSort(int R[],int n){ int i,j;int temp; for(i=1;i<n;i++) { temp=R[i]; j=i-1; while(j>=0&&temp<R[j]) { R[j+1]=R[j]; j--; } R[j+1]=temp; }}...原创 2018-12-27 08:08:31 · 234 阅读 · 0 评论 -
图的应用之拓扑排序
图的拓扑排序可用来判断有向图是否存在回路、环//修改图的结点typedef struct{ char data; int count; EdgeNode *firstEdge;}VertexNode;//统计一个结点的入度数 void count(AGraph *g,int k) { EdgeNode *p; int i,j; for(i=0;i<g->...原创 2018-12-27 08:08:25 · 460 阅读 · 0 评论 -
图的基础知识、图的结构体定义以及遍历方式
1.图的基础知识图:由顶点的有穷非空集和顶点之间的边的集合组成。通常为G(V,E)有向图:每条边都有方向 无向图:每条边都没有方向有向完全图:若有向图有n个顶点,且具有n(n-1)个边 无向完全图:若无向图有n个顶点,且具有(n(n-1)/2)简单路径:序列中顶点不重复出现的路径成为简单路径 回路:若一条路径中第一个顶点和最后一个顶点相同,则这条路径是一条回路连通图:...原创 2018-12-27 08:08:18 · 3009 阅读 · 0 评论 -
树与二叉树的应用之判断一棵树是否为完全二叉树
一棵二叉树采用二叉链表存储结构,试判断该二叉树是否为完全二叉树(这里采用层次遍历的方法)int isCompleteBinaryTree(BTNode *p){ BTNode *queue[maxsize];BTNode *p; int front=0,rear=0; int flag=0; if(p==NULL) return 1; else{ rear=(rear+1...原创 2018-12-27 08:08:12 · 1130 阅读 · 0 评论 -
树与二叉树的应用之统计层号、输出路径、判断相似、左右子树交换
1.二叉树采用二叉链表存储结构,现求二叉树中值为x的层号(回溯法)int L=1;void leno(BTNode *p,int x){ if(p!=NULL) { if(p->data==x) { cout<<L<<endl; return; } L++; leno(p->lchild,x); leno(p-&...原创 2018-12-27 08:08:06 · 363 阅读 · 0 评论 -
树与二叉树应用之统计结点数以及将叶子结点串联成单链表
1.二叉树采用二叉链表存储结构,统计所有结点数目int n=0;void count(BTNode *p){ if(p!=NULL) { n++; count(p->lchild); count(p->rchild); }}2.二叉树采用二叉链表存储结构,统计所有叶子结点数组int n=0;void count(BTNode *p){ if...原创 2018-12-27 08:07:59 · 932 阅读 · 0 评论 -
二叉树应用之线索化
线索二叉树 对二叉树以某种次序遍历使其变化线索二叉树的过程称作线索化。typedef struct TBTNode{ char data; int ltag,rtag;//ltag=0,则lchild指向左孩子 ltag=1,则lchild指向直接前驱 同理rtag struct TBTNode *lchild; struct TBTNode *rchild;}...原创 2018-12-27 08:07:45 · 508 阅读 · 0 评论 -
二叉树的应用之根据序列确定二叉树
1.根据先序和中序序列确定一棵二叉树设计思想:先序遍历中第一个元素,即为树的根结点值A,在中序遍历中找到A,由A将中序遍历序列分为两个子序列,左序列构成左子树,右序列构成右子树BTNode *createBT(char pre[],char in[],int l1,int r1,int l2,int r2){ if(L1>R1) return NULL; BTNode *...原创 2018-12-27 08:07:37 · 658 阅读 · 1 评论 -
二叉树应用之遍历算法的改进
1.对前序遍历算法的改进 非递归算法void preOrder(BTNode *p){ BTNode *stack[maxsize]; int top=-1; BTNode *q; if(p!=NULL) { stack[++top]=p; while(top!=-1) { q=stack[top--]; cout<<p->data<...原创 2018-12-26 11:28:40 · 519 阅读 · 0 评论 -
树与二叉树之层次遍历、求二叉树宽度
1.层次遍历算法思想:建立一个循环队列,先将二叉树头结点如队列,然后出队列,访问该结点,若该结点有左子树则左结点队列,如果有右子树入队列,然后出队访问,直到为空void level(BTNode *p){ BTNode *queue[maxsize]; int front=0,rear=0; BTNode *q; if(p!=NULL) { rear=(rear+1)%m...原创 2018-12-26 11:19:12 · 4147 阅读 · 1 评论 -
树与二叉树之计算表达式的值、求二叉树的深度,查找结点值
1.计算表达式的值设计思想:先求左子树表达式的值,再求右子树的值,最后相乘int comp(BTNode *p){ int A,B; if(p!=NULL) { if(p->lchild!=NULL&&p->rchild!=NULL) { A=comp(p->lchild); B=comp(p->rchild); ...原创 2018-12-26 09:47:17 · 628 阅读 · 1 评论 -
树与二叉树之生成一棵二叉树
typedef struct BTNode{ struct BTNode *lchild; struct BTNode *rchild; char data;}BTNode;#include<iostream>using namespace std;void createBTree(BTNode &T){ char c; cin>>c; i...原创 2018-12-26 09:38:36 · 497 阅读 · 0 评论 -
树与二叉树之二叉树结点的遍历
//链式存储结构的二叉链表结构体定义typedef struct BTNode{ char data; struct BTNode *lchild; struct BTNode *rchild;}BTNode;//先序遍历void preorder(BTNode *p){ if(p!=NULL) { cout<<p->data; preorder(...原创 2018-12-26 09:32:01 · 289 阅读 · 0 评论 -
树与二叉树之基础知识篇
1.树的存储结构 有顺序存储结构(双亲存储结构)和链式存储结构(孩子存储结构、孩子兄弟存储结构)2.二叉树、完全二叉树、满二叉树、二叉排序树、平衡二叉树、B-树二叉树:在一般的树上加两个限制条件:a.二叉树中结点的度只能为0,1,2 b.子树中有左右顺序之分,不能颠倒满二叉树:如果在一棵树中,所有分支结点都有左孩子和右孩子结点,并且叶子结点都集中在二叉树的最下层,则称之为满...原创 2018-12-26 09:25:22 · 306 阅读 · 0 评论 -
栈的应用之两个栈模拟一个队列
利用两个栈s1,s2模拟一个队列,已知栈的三个运算定义如下:push(ST,x):元素x入st栈pop(ST,&x):st栈顶元素出栈,赋给变量xisEmpty(ST):判断ST栈是否为空//入队列 int enQueue(SqStack &s1,SqStack &s2,int x){ int y; if(s1.top==maxsize-1) {...原创 2018-12-26 09:12:57 · 618 阅读 · 0 评论 -
栈的应用之设计共享栈
//共享栈的结构体定义typedef struct{ int elem[maxsize]; int top[2];//top[0]为s0栈顶 top[1]为s1栈顶 }SqStack;//入栈int push(SqStack &st,int stNo,int x){ if(st.top[0]+1<st.top[1]) { if(stNo==0) { ...原创 2018-12-26 09:00:16 · 639 阅读 · 0 评论 -
栈的表达式之计算中缀、前缀和后缀表达式
1.计算中缀表达式//判断运算符优先级int getPriority(char op){ if(op=='+'||op=='-') return 0; else return 1;} //计算表达式int calsub(float opnd1,char op,float opnd2,float &result){ if(op=='+') result=...原创 2018-12-26 08:53:37 · 702 阅读 · 0 评论 -
栈的应用之表达式转换
1.中缀表达式转后缀表达式void infixToPostFix(char exp[],char s2[],int &top2){ char s1[maxsize];int top1=-1; int i=0; while(exp[i]!='\0') { if(exp[i]>='0'&&exp[i]<='9') { s2[++top2...原创 2018-12-26 08:33:20 · 382 阅读 · 0 评论 -
约瑟夫环的两种实现方式--数组和循环链表
1.数组实现形式#include<iostream>#define LEN 40#define Interval 3int main(){ int R[LEN]; for(int i=0;i<LEN;i++) R[i]=1;//数组初始化 1:活着 0:自杀 int lefcount=LEN;//剩下的人数 int index=0,count=0;;/...原创 2018-12-25 20:31:29 · 487 阅读 · 0 评论 -
回溯法之八皇后问题
八皇后问题:要求在一个8*8的棋盘上放8个皇后,使得它们不互相攻击,一个皇后可以攻击处在同一行或同一列或同一斜线。解的形式:x[1:n]表示皇后i放在i行的x[i]列剪枝条件:x[i]=x[j] |j-i|=x[j]-x[i]int nocollison(int k){ int j=1; while(j<k) { if(x[j]==x[k]||(abs(x[j]-...原创 2018-12-25 20:07:50 · 416 阅读 · 0 评论 -
回溯法之全排列和组合问题
1.全排列问题:输入n个不同的字符串,给出它们所有的n个字符全排列void perm(char str[],int d,int n){ int i; char temp; if(d==n-1) { for(i=0;i<d;i++) cout<<str[i]<<" "; cout<<endl; } for(i=d;i<...原创 2018-12-25 18:20:29 · 1604 阅读 · 0 评论 -
回溯法关于图
图的结构体定义typedef struct { int adjvex; EdgeNode *next;}EdgeNode;typedef struct{ int data; EdgeNode *firstEdge;}Vertex;typedef struct { Vertex adjList[maxsize]; int n,e;}AGraph;1.假设图G...原创 2018-12-25 18:15:06 · 779 阅读 · 3 评论 -
回溯法之关于树
1.二叉链表的存储方式,求二叉树中值为x的层号int L=1;void leno(BTNode *p,int x){ if(p!=NULL) { if(p->data==x) { cout<<L<<endl; break; } L++; leno(p->lchild,x); leno(p->rchild,x...原创 2018-12-25 18:01:04 · 477 阅读 · 0 评论 -
篇章二线性表---常见操作
1.顺序表数组R[],元素0~m+n-1,前m个有序,后n个元素有序递增,使其整体有序void insertSort(int R[],int n){ int i,j,temp; for(i=m;i<=m+n-1;i++) { temp=R[i]; for(j=i-1;j>=0&&temp<R[j];j--) R[j]=R[j+1]; ...原创 2018-12-25 17:32:07 · 392 阅读 · 0 评论 -
篇章二线性表---基础知识
1.顺序表的结构体定义//顺序表 typedef struct{ int data[maxsize]; int length;}SqList;//单链表typedef struct{ int data; struct LNode *next;}LNode;//双链表typedef struct DLNode{ int data; struct DLNode *...原创 2018-12-24 15:09:11 · 318 阅读 · 0 评论 -
数据结构----绪论
新世界,新篇章,I'm Coming!!!问题:将R中序列循环左移P个位置,即{x0,x1,x2,,,,xn-1},变换{xp,xp+1,,,,,xn-1,x0,x1,,,xp-1}算法设计思想:先将R中前P个元素逆置,再将剩下元素逆置,最后整体逆置。void Reverse(int R[],int l,int r){ int i,j; int temp; for(i=l,j...原创 2018-12-24 08:43:02 · 282 阅读 · 0 评论 -
回归篇
I‘m coming!!! Waiting For New World!!!原创 2018-12-24 08:25:45 · 201 阅读 · 0 评论