算法基础知识
匹马向当阳
一个有梦想、渴望技术交流、渴望思想同化的寻路人。
展开
-
笔记:哈希表代码实现
哈希表有冲突时,存入时有冲突处理,查找时,则是逆冲突处理,找到正确的哈希地址,并将该地址的数据读出。#include <iostream>#include <stdio.h>#include <malloc.h>#define HASHSIZE 12 /*定义哈希表长为数组的长度*/#define NULLKEY -32768using na...原创 2019-10-30 17:56:30 · 628 阅读 · 1 评论 -
笔记:背包问题简单示例
package knapsack;//简单背包问题示例public class Knapsack { public static void main(String[] args){ int val[] = {10, 40, 30, 50};//物品的价值 int wt[] = {5, 4, 6, 3};//物品的重量 int W = 10;/...原创 2017-12-08 16:32:38 · 1033 阅读 · 0 评论 -
笔记:非递归算法算二叉树的高度
1.方法思路:用深搜和后序遍历结合,遍历所有节点,记录最大高度。时间为O(n),空间为O(max)。(自创)代码如下(未测试): 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20...原创 2018-09-22 12:34:55 · 5258 阅读 · 0 评论 -
笔记:图的两种存储结构示例、相互转换示例以及邻接表的DFS、BFS示例
//1.图的邻接矩阵的数据类型定义如下:#define MAXV <最大顶点个数>//在后面的类型定义中都使用到本宏定义typedef struct{int no;//顶点编号InfoType info;//顶点其他信息}VertexType;//顶点类型typedef struct{int edges[MAXV][MAXV];//邻接矩...原创 2019-06-11 17:39:38 · 363 阅读 · 0 评论 -
笔记:败者树
//败者树示例与解析,败者树即是多个数据从二叉树的叶子节点出发,逐次比较,败者滞留子结点,胜者上升父节点,最后最终ls【0】为最终胜者#include<cstdio>#include<cstdlib>#include<cstring>#include<iostream>using namespace std;#define LEN 5...原创 2019-04-16 22:17:42 · 1278 阅读 · 0 评论 -
笔记:排序专题
插入类排序:1.直接插入排序://插入排序算法较简单。具体思路为,A[0]为哨兵,A[i]为待插入元素,A[1]~A[i-1]为已排列的有序序列,//将A[i]从后往前比较插入有序序列中。void InsertSort(ElemType A[],int n){ int i,j; for(i=2;i<=n;i++) if(A[i].key<A...原创 2018-12-09 21:30:42 · 231 阅读 · 0 评论 -
笔记:归并排序
//归并排序是将序列通过不断二分为最小单位序列,再将它们两两比较合并为有序序列,从而得到最终的有序//序列的算法。void MergeSort(ElemType A[],int low,int high){ if(low<high) { int mid=(low+high)/2;//将序列分为两段 MergeSort(A,low,mid...原创 2018-12-08 15:45:47 · 175 阅读 · 0 评论 -
笔记:堆排序
//堆排序算法过程是,先制造大顶堆,然后通过不断摘取根节点(最大值)并重塑大顶堆的过程,将序列有//序化。void HeapSort(ElemType A[],int len){ int i; BuildMaxHeap(A,len);//塑造大顶堆 for(i=len;i>1;i--) { swap(A[i],A[1]);//摘取最大值...原创 2018-12-08 14:40:47 · 161 阅读 · 0 评论 -
笔记:递归实现快速排序
//快排的思路就是选定一个数(一般为序列第一个数)为枢轴,将序列分为比枢轴小和比枢轴大的两个序列,//再对两个序列进行快排,从而逐渐实现使序列在分解过程中逐渐有序的目的。void QuickSort(ElemType A[],int low,int high){ if(low<high) { int pivotpos=Partition(A,low,h...原创 2018-12-05 14:03:05 · 643 阅读 · 0 评论 -
笔记:普利姆(Prim)算法(生成最小树)
//贪心算法下的最小生成树,普利姆算法。以连通图的任一顶点作为起点,每次筛选权值最小的边连接剩余顶点,最终生成最小生成树Void miniSpanTree_Prim(MGraph G){//算法入口,将某一点置入作为起点 int min,i,j,k; int adjvex[MAXVEX];//保存当前生成树中与该顶点i权值最小的邻接点的编号,若对应的lowcost[i]为0,则...原创 2018-11-15 19:25:36 · 961 阅读 · 0 评论 -
笔记:克鲁斯卡尔算法(解决最小生成树问题)
//用到了并查集和堆排序解决最小生成树,思路就是权值边排序(堆排序),然后从最小权值边取起,边取边判定是否有回路(用并查集),有回路则放弃该边。思路相对简单,直接看代码。#define MaxSize 100typedef struct{ int a,b;//边的两个顶点 int weight;//边的权值}Edge;//边结构体int Find(int *parent,...原创 2018-11-15 22:39:31 · 701 阅读 · 0 评论 -
笔记:迪杰斯特拉算法(求给定顶点到各个顶点的最短路径和最小权值)
//该算法简单说就是在图里求给定顶点到各个顶点的最短路径和最小权值。//过程方法是,遍历并记录起始点到各个顶点的距离,取最小权值邻接点,记录前驱结点。最终生成的结果//可通过前驱结点找到起点到该顶点的最短路径。Void Dijkstra(MGraph G,int v,int path[],int dist[]){//参数分别为:图,源点(起点),供保存//该点到源点最小路径的前驱结点的路...原创 2018-11-21 13:22:08 · 963 阅读 · 0 评论 -
笔记:弗洛伊德算法(解决图中任意两顶点的最短路径和最小权值问题)
//一个有权图的邻接矩阵经过弗洛伊德算法处理后,得到的结果,能够解决求任意两顶点的最小路径问题和最小//权值问题。具体处理得到的结果是一个记录最小权值的二维数组A[i][j](表示顶点i到顶点j的最小权值)//和记录前驱顶点的二维数组Path[i][j](表示i到j的最短路径中j的前驱结点,如是k,则再查//Path[i][k],如此可逆序输出i到j的最短路径);具体处理步骤看代码voi...原创 2018-11-21 19:56:59 · 543 阅读 · 0 评论 -
笔记:拓扑排序算法(有向无环图拓扑排序输出或者检验有向图是否存在回路)
//该算法比较简单,对有向无环图进行拓扑排序输出。也可以检验有向图是否存在回路。这里处理的对象是邻接表。bool ToplogicalSort(Graph G){ InitStack(S); for(int i=0;i<G.vexnum;i++)//初始化栈,存储入度为0的顶点 if(indegree[i]==0)Push(S,i); int co...原创 2018-11-22 15:05:11 · 1070 阅读 · 0 评论 -
笔记:KMP算法(解决字符串匹配问题)
//解决字符串匹配问题,除了暴力匹配,还可以使用KMP匹配算法。Void main(){ int next[10]; int pos; S[0]=strlen("abcabaaabaabcac");//将字符串的字符数保存在S[0]里 strcpy(S+1,"abcabaaabaabcac"); T[0]=strlen("abaabcac"); ...原创 2018-11-29 15:15:25 · 243 阅读 · 0 评论