数据结构
妙趣前端
学生
展开
-
普里姆算法(邻接矩阵)
普里姆算法(邻接矩阵)思想从某个顶点开始(不要把它看成一个单独的顶点,把它看成只有一个结点的子生成树)在第一步的生成树的相邻边中,选一条最小的边,将最小的边和边的另一个结点并入子生成树中(生成树就长大了一点)继续,直到所有的顶点都被并入了生成树步骤1.取图中任意一个顶点 v 作为生成树的根,之后往生成树上添加新的顶点 w2.在添加的顶点 w 和已经在生成树上的顶点v 之间必定存在一条...原创 2020-03-14 21:19:11 · 2278 阅读 · 0 评论 -
智能重复
智能重复/* 试着编写smartRepeat 使用栈结构 ,自己编写栈结构 ,需要完成栈的基本操作,入栈 ,出栈,销毁栈,栈的初始化 将 3[abc] ---> abcabcabc 将 3[2[a]2[b]] ---> aabbaabbaabb 将 3[2[a]2[2b]] ---> aa2b2b aa2b2b aa2b2b (最终原创 2021-02-16 15:47:42 · 374 阅读 · 0 评论 -
C语言链表简单操作
文章目录C语言链表简单操作创建链表 初始化链表头插法尾插法任意位置插法删除链表中的指定数字返回链表中第i个结点(地址)根据数值查找返回节点的位置删除链表中第i个结点,并且用x带出删除的值链表中查找是否结点的数据等于x,如果存在,返回该结点的指针,否则返回NULL获取链表长度销毁链表,释放内存总代码C语言链表简单操作创建链表 初始化链表//创建链表LinkList createList(){ // 头部空节点 LinkList L = (LinkList)malloc(sizeof(L原创 2021-02-01 22:35:47 · 747 阅读 · 1 评论 -
规律数学题
要求:输入:n(0 < n < 20)输出:满足以上条件的n阶矩阵样例:输入:9输出:#include <stdio.h>// 普通打印void printArr(int arr[][20], int n);int main(void) { int n, max, arr[20][20] = { 0 }; printf("输入n:"); scanf_s("%d", &n); if (n == 0) { printf("n不能为零...原创 2020-11-21 17:18:15 · 198 阅读 · 0 评论 -
KMP算法
KMP算法(快速模式匹配算法)C语言详解快速模式匹配算法,简称 KMP 算法,是在 BF 算法基础上改进得到的算法。学习 BF 算法我们知道,该算法的实现过程就是 “傻瓜式” 地用模式(假定为子串的串)与主串中的字符一一匹配,算法执行效率不高。KMP 算法不同,它的实现过程接近人为进行模式匹配的过程。例如,对主串 A(“ABCABCE”)和模式串 B(“ABCE”)进行模式匹配,如果人为去判断,仅需匹配两次。图 1 第一次人为模式匹配第一次如图 1 所示,最终匹配失败。但在本次匹配过程中,我们可原创 2020-10-22 21:37:39 · 302 阅读 · 0 评论 -
树、森林、以及二叉树之间的转化
文章目录树、森林、以及二叉树之间的转化树和二叉树的转换1. 树转换为二叉树2. 二叉树还原为树二叉树转化为树、森林二叉树转化树二叉树转化森林树、森林、以及二叉树之间的转化树和二叉树的转换树和二叉树是两种不同的数据结构,树实现起来比较麻烦,但是树可以转换为二叉树进行处理,处理完以后再从二叉树还原为树。下面说说转换的方法:1. 树转换为二叉树(1) 树中所有相同双亲结点的兄弟结点之间加...原创 2020-05-05 14:20:55 · 882 阅读 · 4 评论 -
堆排序
堆排序1 什么是堆堆的定义把这个关系 和完全二叉树对应起来,如下图,如果 下标 从1 开始, 这 任意一个节点 i 2i +1 2i +2对于小标从 i ==1 下标从0开始i ==0 的情况来看下 下面 是 不是堆 ?左面 是 小顶堆 ; 右面是 大顶堆看看下面的图形左边 3 6 7 不满足 大顶堆的定义, 中间 大顶堆 右面 是 大顶堆2 堆的存储的结构图1 为...原创 2020-03-24 19:55:23 · 159 阅读 · 0 评论 -
AVL树(一)之 图文解析 和 C语言的实现
文章目录平衡二叉树(AVL树)一、概要二、AVL树的介绍1、树的高度2. 旋转2.1 LL的旋转2.2 RR的旋转2.3 LR的旋转2.4 RL的旋转三、新建流程四、实现代码1、定义2、 节点的创建3、树的高度4、大小比较5、旋转5.1 LL的旋转5.2 RR的旋转5.3 LR的旋转5.4 RL的旋转6、插入7、删除8、完整代码9、测试数据编译环境后记平衡二叉树(AVL树)一、概要平衡二叉...原创 2020-03-22 23:20:31 · 841 阅读 · 0 评论 -
二叉排序树
文章目录二叉排序树一、定义二、 二叉排序树性质:三、二叉排序树的操作1、建立2、查找3、插入4、删除四、代码实现1、二叉树的建立2、查找3、插入4、删除5、实验数据6、编译环境五、后记二叉排序树一、定义二叉排序树,又叫二叉查找树,如果非空,则具有以下性质:若它的左子树不空,则左子树上所有节点的值均小于它的根节点的值;若它的右子树不空,则右子树上所有节点的值均大于它的根节点的值;它的左...原创 2020-03-21 21:19:58 · 2678 阅读 · 0 评论 -
斐波那契查找(黄金分割查找算法)
文章目录斐波那契一、摘要二、什么是斐波那契查找三、 基本思想四、举例五、如何计算1、斐波那契数组2、利用斐波那契数组确定元素的位置3、举例六、代码实现1、斐波那契数组实现2、斐波那契查找3、实验数据及测试4、编译环境七、后记斐波那契一、摘要如果从文件中读取的数据记录的关键字是有序排列的(递增的或是递减的),则可以用一种比折半查找法更有效率的查找方法来查找文件中的记录,即为斐波那契查找,也称...原创 2020-03-20 20:26:00 · 2781 阅读 · 3 评论 -
插值查找(比例查找法)
文章目录插值查找(比例查找法)摘要插值查找测试代码实验数据插值查找(比例查找法)摘要当我们在使用**折半查找法**的时候,都会有个疑问,为什么一定要用折半,为什么不能折三分之一,四分之一呢?为什么我们不能根据我们查找的数值的不同而制定不同的比例来查找呢?于是,经过算法科学家的努力,插值查找法(按比例查找)诞生了。首先我们先写出折半查找法的核心语句mid = (right + left...原创 2020-03-19 20:54:30 · 715 阅读 · 0 评论 -
折半查找法
文章目录折半查找法摘要概述引申解题步骤算法代码实现折半查找法摘要折半查找法是效率较高的一种查找方法。假设有已经按照从小到大的顺序排列好的五个整数a0~a4,要查找的数是X,其基本思想是: 设查找数据的范围下限为l=1,上限为h=5,求中点m=(l+h)/2,用X与中点元素am比较,若X等于am,即找到,停止查找;否则,若X大于am,替换下限l=m+1,到下半段继续查找;若X小于am,换上限...原创 2020-03-19 20:43:24 · 4884 阅读 · 0 评论 -
拓扑排序和关键路径
文章目录拓扑排序和关键路径摘 要1:引言2:设计步骤:etv和ltv数组的计算方法算法思想2. 实现代码建立(以邻接表为例)邻接表建立栈的建立拓扑排序关键路径的查找完整代码编译环境3.后记拓扑排序和关键路径摘 要介绍求关键路经的算法,对于给出的事件结点网络,要求求出从起点到终点的所有路径,经分析、比较后找出长读最大的路径,从而得出求关键路径的算法,并给出计算机上机实现的源程序。关键词 ...原创 2020-03-19 14:23:45 · 5798 阅读 · 0 评论 -
拓扑排序
拓扑排序对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边(u,v)∈E(G),则u在线性序列中出现在v之前。通常,这样的线性序列称为满足拓扑次序(Topological Order)的序列,简称拓扑序列。简单的说,由某个集合上的一个偏序得到该集合上的一个全序,这个操作称之为拓扑排序。拿个...原创 2020-03-18 15:51:57 · 544 阅读 · 0 评论 -
KMP算法及优化
KMP算法及优化今天看到同学在复习数据结构书上的KMP算法,忽然发觉自己又把KMP算法忘掉了,以前就已经忘过一次,看样子还是没有真正的掌握它,这回学聪明点,再次搞明白后记录下来。一般字符串匹配过程KMP算法是字符串匹配算法的一种改进版,一般的字符串匹配算法是:从主串(目标字符串)和模式串(待匹配字符串)的第一个字符开始比较,如果相等则继续匹配下一个字符, 如果不相等则从主串的下一个字符开始匹...原创 2020-03-17 22:09:15 · 598 阅读 · 0 评论 -
并查集(进阶)
并查集(进阶)一、引文上一篇博客——并查集(入门)写完后,我对并查集有了基本的了解。并查集可以判断一幅无向图中有几个连通分量并查集的find、join函数都是必不可少的路径压缩算法对于并查集的优化也很关键有了这些知识,我成功AC了hdu1232畅通工程,总觉得并查集不应该这么简单(套模板,修改一点点就AC),后来,遇到了poj1182食物链这道题,发现只学习了上篇博客的知识是无法解...原创 2020-03-17 09:13:22 · 270 阅读 · 0 评论 -
并查集(入门)
并查集(入门)一、问题引入题意:首先在地图上给你若干个城镇,这些城镇都可以看作点,然后告诉你哪些对城镇之间是有道路直接相连的。最后要解决的是整幅图的连通性问题。比如随意给你两个点,让你判断它们是否连通,或者问你整幅图一共有几个连通分支,也就是被分成了几个互相独立的块。像畅通工程这题,问还需要修几条路,实质就是求有几个连通分支。如果是1个连通分支,说明整幅图上的点都连起来了,不用再修路了;如果...原创 2020-03-17 08:46:34 · 418 阅读 · 0 评论 -
双向链表
双向链表为什么需要双向链表?单链表的结点都只有一个指向下一个结点,单链表的数据元素无法直接访问其前驱元素,所以逆序访问单链表中元素极其耗时;思想有点类似使用空间复杂度换时间复杂度。双向链表:在单链表的结点中增加一个指向其前驱的pre指针;该链表中第一个结点的前趋结点为NULL,最后一个结点的后继结点为NULL 。(三)双向链表的方法实现头插尾插中间插入判断一个节点是否存...原创 2020-03-16 22:49:36 · 435 阅读 · 0 评论 -
静态链表
静态链表逻辑结构上相邻的数据元素,存储在指定的一块内存空间中,数据元素只允许在这块内存空间中随机存放,这样的存储结构生成的链表称为静态链表。静态链表的构建方法静态链表中每个结点既有自己的数据部分,还需要存储下一个结点的位置,所以静态链表的存储实现使用的是结构体数组,包含两部分: 数据域 和 游标(存放的是下一个结点在数组中的位置下标)。typedef struct {int data;...原创 2020-03-16 22:32:15 · 2360 阅读 · 0 评论 -
弗洛伊德算法
弗洛伊德算法介绍弗洛伊德算法和Dijkstra算法一样,弗洛伊德(Floyd)算法也是一种用于寻找给定的加权图中顶点间最短路径的算法。该算法名称以创始人之一、1978年图灵奖获得者、斯坦福大学计算机科学系教授罗伯特·弗洛伊德命名。基本思想通过Floyd计算图G=(V,E)中各个顶点的最短路径时,需要引入一个矩阵S,矩阵S中的元素a[i][j]表示顶点i(第i个顶点)到顶点j(第j个顶点)...原创 2020-03-16 09:39:19 · 897 阅读 · 0 评论 -
迪杰斯特拉算法
迪杰斯特拉算法介绍迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径。它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止。基本思想通过Dijkstra计算图G中的最短路径时,需要指定起点s(即从顶点s开始计算)。此外,引进两个集合S和U。S的作用是记录已求出最短路径的顶点(以及相应的最短路径长度),而U则是记录还未求出...原创 2020-03-15 21:29:00 · 452 阅读 · 0 评论 -
克鲁斯卡尔算法(Kruskal算法)求最小生成树
克鲁斯卡尔算法(Kruskal算法)求最小生成树克鲁斯卡尔算法,从边的角度求网的最小生成树,时间复杂度为O(eloge)。和普里姆算法恰恰相反,更适合于求边稀疏的网的最小生成树。对于任意一个连通网的最小生成树来说,在要求总的权值最小的情况下,最直接的想法就是将连通网中的所有边按照权值大小进行升序排序,从小到大依次选择。由于最小生成树本身是一棵生成树,所以需要时刻满足以下两点:1.生成树中任...原创 2020-03-15 18:25:00 · 10124 阅读 · 2 评论