![](https://img-blog.csdnimg.cn/20201014180756926.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构学习
文章平均质量分 72
lelelewei
这个作者很懒,什么都没留下…
展开
-
数据结构与算法(二十二):排序算法
数据结构与算法(二十二):排序算法定义排序的稳定性影响因素排序算法冒泡排序选择排序直接插入排序算法定义排序的稳定性假设ki = kj,且在排序前的序列中ri领先于rj(i < j)如果排序后仍然ri领先,那么称所用的排序方法是稳定的;反之,称为不稳定。影响因素时间性能,辅助空间,算法的复杂性。都影响排序的算法性能。排序算法冒泡排序基本思想:两两相邻记录的关键字,如果反序则交换,直到没有反序的记录为止。要点:两两相邻的元素如果有n个元素,比较n-1次,每一轮减少一次比较从下原创 2021-04-22 11:04:30 · 178 阅读 · 0 评论 -
学习笔记:数据结构与算法(十五):图的存储结构和遍历
学习笔记:数据结构与算法(十五):图的存储结构邻接表(无向图)邻接表(有向图)邻接表(网)十字链表邻接多重表边集数组图的遍历深度优先遍历骑士周游问题邻接表(无向图)考虑将数组和链表结合在一起来存储,这种图结构称为邻接表。处理方法:顶点用一个一维数组存储,当然也可以用单链表,但是数组更容易地读取顶点信息。图中每个顶点Vi的所有邻接点构成一个线性表,由于邻接点的个数不确定,所以选择用单链表存储。右侧单链表的数字代表数组中的位置,如果没有了就用空指针结束。邻接表(有向图)在有向图中,结构也是原创 2021-04-21 21:48:10 · 101 阅读 · 0 评论 -
学习笔记:数据结构与算法(二十一):散列表-哈希表
学习笔记:数据结构与算法(二十一):散列表-哈希表定义散列表的查找步骤构造基本原则散列地址方法直接定址法数字分析法平方取中法折叠法除留余数法随机数法选择处理散列冲突开放定址法再散列函数法链地址法公共溢出区法代码实现在a[]中查找key关键字的记录:顺序表查找:按顺序查找有序表查找:二分法查找散列表查找:?记录的存储位置 = f(关键字)定义散列技术是在记录的存储位置和它关键字之间建立一个确定的对应关系f,使得每个关键字key对应一个存储位置f(key)这种对应关系f称为散列函数,又称为哈原创 2021-04-20 10:18:32 · 147 阅读 · 0 评论 -
学习笔记:数据结构与算法(二十):多路查找树
学习笔记:数据结构与算法(二十):多路查找树定义2-3树2-3树的插入原理2-3树的删除原理2-3-4树B树定义多路查找树的特点是其每一个结点的孩子数可以多于两个,且每个结点处可以存储多个元素。所有元素之间存在某种特定的关系。2-3树多路查找树中每一个结点都具有两个孩子或者三个孩子称为2-3树。2-3树的插入原理插入1,正常。插入5,需要拆分6.7插入11,需要拆分9.10…如果所有的树都是三个节点,那么就需要再深一层现在插入2,需要增加深度2-3树的删除原理情况1:如果删除原创 2021-04-19 15:32:38 · 133 阅读 · 0 评论 -
学习笔记:数据结构与算法(十九):平衡二叉排序树
学习笔记:数据结构与算法(十九):平衡二叉排序树定义实现定义要么是一棵空树,要么就左子树和右子树都是平衡二叉树,且左子树和右子树的深度之差的绝对值不超过1。举几个例子这个不是,因为他不是一棵树。这个也不是,左子树和右子树的差为2.这个就是平衡二叉树实现typedef struct BiTNode{ int data; int bf; struct BiTNode *lchild,*rchild;}BiTNode, *BiTree;int InsertAVL(BiTree *原创 2021-04-14 21:32:27 · 71 阅读 · 0 评论 -
学习笔记:数据结构与算法(十八):二叉排序树
学习笔记:数据结构与算法(十八):二叉排序树定义查找操作插入操作删除操作小的数值放在左边,大的放在右边。定义二叉排序树:又称为二叉查找树,或者是一棵空树,或者具有以下性质左子树如果不为空,那么左子树上所有结点的值均小于他的根的值右子树如果不为空,那么右子树上所有结点的值均大于他的根的值他的左右子树也分别为二叉排序树(递归)查找操作实现代码如下://二叉链表结点结构定义typedef struct BiTNode{ int data; struct BiTNode *lchil原创 2021-04-14 11:30:39 · 133 阅读 · 0 评论 -
学习笔记:数据结构与算法(十七):查找算法
学习笔记:数据结构与算法(十七):查找算法顺序查找插值查找(按比例查找)斐波那契查找线性索引查找稠密索引分块索引倒排索引查找算法分为静态查找和动态查找。静态查找:数据集合稳定,不需要添加、删除元素的查找操作动态查找:数据集合在查找的过程中需要同时添加或删除元素的查找操作查找结构:对于静态查找,用线性表结构组织数据,可以使用顺序查找算法,如果对关键字进行排序,可以使用折半查找算法或斐波那契查找算法等提高效率对于动态查找,可以使用二叉排序树的查找技术,或者散列表结构来解决一些问题。顺序查找也叫线原创 2021-04-13 15:58:12 · 104 阅读 · 0 评论 -
学习笔记:数据结构与算法(十六):拓扑排序和关键路径
学习笔记:数据结构与算法(十五):拓扑排序和关键路径拓扑排序拓扑排序算法关键路径关键路径算法拓扑排序无环图:一个无环的有向图,简称DAG图。AOV网:在一个表示工程的有向图中,用顶点表示活动,弧表示活动之间的优先关系,这样的有向图为顶点表示活动的网,称之为AOV网。拓扑序列:设G(V, E)是一个具有n个顶点的有向图,V中的顶点序列V1,V2…Vn满足若从顶点Vi到Vj有一条路径,则在顶点序列中顶点Vi必在顶点Vj之前,则我们称这样的顶点序列为一个拓扑序列。拓扑排序:对一个有向图构造拓扑序列的过程原创 2021-04-12 20:49:51 · 379 阅读 · 0 评论 -
学习笔记:数据结构与算法(十五):图
学习笔记:数据结构与算法(十五):图广度优先遍历带权最小生成树-- 普里姆算法带权最小生成树-- 克鲁斯卡尔算法最短路径之迪杰斯特拉算法最短路径之弗洛伊德算法广度优先遍历广度优先遍历BreadthFirstSearch,也称广度优先搜索,简称BFS。可以利用队列实现堆图的广度优先遍历。下面代码是邻接矩阵代码实现,只有部分代码#include <stdio.h>void BFETraverse(MGraph G){ int i,j; Queue Q; for(i = 0; i原创 2021-04-09 15:42:40 · 117 阅读 · 0 评论 -
学习笔记:数据结构与算法(十四):图
学习笔记:数据结构与算法(十三):赫夫曼树图定义其他的相关概念图的存储结构邻接矩阵(无向图)邻接矩阵(有向图)邻接矩阵(网)图定义图(Graph)是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为G(V,E),其中G表示一个图,V是图G中顶点的集合,E是图G中边的集合。注意:图中数据元素称为顶点(Vertex)强调图的顶点集合V要有穷非空图中,任意两个顶点都可能有关系,逻辑关系用边来表示,边集可以是空的。无向边:顶点Vi和Vj之间的边没有方向,用无序偶(Vi,Vj)表示;无向原创 2021-03-30 08:48:10 · 359 阅读 · 0 评论 -
学习笔记:数据结构与算法(十三):赫夫曼树
学习笔记:数据结构与算法(十三):赫夫曼树赫夫曼树定义构造过程赫夫曼树定义把两棵二叉树简化成叶子结点带权的二叉树(树结点间的连线相关的数叫做权)结点的路径长度:从根结点到该结点的路径上的连接数树的路径长度:树中每个叶子结点的路径长度之和结点带权路径长度:结点的路径长度与结点权值的乘积树的带权路径长度:树中所有叶子结点的带权路径长度之和。构造过程在森林中选出两棵根结点的权值最小的二叉树合并选出的两个二叉树,新增加一个结点作为他俩的根,权值为二者之和。在森林里选出两棵根结点的权值最小的原创 2021-03-29 21:46:34 · 98 阅读 · 0 评论 -
学习笔记:数据结构与算法(十二):线索二叉树
学习笔记:数据结构与算法(十二):线索二叉树线索二叉树树,森林以及二叉树的相互转换普通树转换为二叉树森林到二叉树的转化二叉树到树、森林的转换树和森林的遍历树的遍历森林的遍历线索二叉树普通二叉树的缺点:浪费空间,浪费运行时间改进:每个结点定义前驱和后继结点。将学习笔记(十一)中的结构体扩充为以下结构:ltag为0时指向该结点的左孩子,为1表示指向该结点的前驱rtag为0时指向该结点的右孩子,为1表示指向该结点的后继代码如下#include <stdio.h>#include &原创 2021-03-29 17:01:43 · 121 阅读 · 0 评论 -
学习笔记:数据结构与算法(十一):二叉树
学习笔记:数据结构与算法(十一):二叉树二叉树定义特点基本形态特殊二叉树斜树满二叉树完全二叉树性质存储结构二叉树的遍历前序遍历中序遍历后序遍历层序遍历举例并代码实现二叉树定义二叉树(Binary Tree)是n个结点的有限集合,该集合或者为空集(空二叉树),或者由一个根结点和两棵互不相交的分别成为左子树和右子树的二叉树组成。特点每个结点最多有两棵子树,所以不存在度大于2的结点。左子树和右子树是有顺序的,次序不能颠倒。即使树中某结点只有一颗子树,也要区分是左子树还是右子树。基本形态原创 2021-03-28 17:16:44 · 262 阅读 · 0 评论 -
学习笔记:数据结构与算法(十):树
学习笔记:数据结构与算法(十):树(1)树一些概念树的存储结构双亲表示法孩子表示法双亲孩子表示法树一些概念结点拥有的子树数称为结点的度(degree)度为0的结点称为叶节点(Leaf)或终端结点。度不为0的结点称为分支结点或非终端结点,除根结点外,分支结点也称为内部结点。结点的子树的根称为结点的孩子,相应的,该结点称为孩子的双亲,同一双亲的孩子之间互称为兄弟(Silbling)结点的祖先是从根到该结点所经分支上的所有结点。图中,A是B和C的双亲,B和C是兄弟。结点的层次从根开始定,根为原创 2021-03-25 10:13:12 · 154 阅读 · 0 评论 -
学习笔记:数据结构与算法(九):递归和分治
学习笔记:数据结构与算法(九):递归和分治递归斐波那契数列的递归实现定义例子分治折半查找算法汉诺塔八皇后问题递归斐波那契数列的递归实现斐波那契数列为:1,1,2,3,5,8,13,21,34,55,89,144…用迭代的思想编写打印前40位的数列的代码。#include <stdio.h>#include <math.h>int main(){ int i; int a[40]; a[0] = 1; a[1] = 1; printf("%d %d",a[0原创 2021-03-19 10:44:26 · 205 阅读 · 0 评论 -
学习笔记:数据结构与算法(八):栈和队列(2)
学习笔记:数据结构与算法(八):栈和队列(2)中缀表达式转换为后缀表达式队列链式存储结构结构体创建一个队列入队列出队列销毁队列顺序存储结构循环队列定义初始化入队列出队列中缀表达式转换为后缀表达式总结规则:从左到右依次遍历中缀表达式的每个数字和符号,如果是数字就直接输出,如果是符号,先判断其与栈顶符号的优先级,是右括号或者优先级低于栈顶符号,则栈顶元素依次出栈并输出,直到遇到左括号或栈空才将后进的符号入栈。//有关结构体的定义和初始化函数见上一节笔记(七)int main(){ sqStack s原创 2021-03-17 21:08:27 · 99 阅读 · 0 评论 -
学习笔记:数据结构与算法(七):栈和队列(1)
学习笔记:数据结构与算法(七):栈和队列栈定义顺序存储结构入栈操作出栈操作清空栈销毁栈计算栈的当前容量例题链式存储结构进栈操作出栈操作逆波兰表达式栈定义栈Stack是一种后进先出(LIFO) 的数据结构,是线性表的一种具体形式,要求只在表尾进行删除pop和插入push的操作。插入操作:push,进栈。删除操作:pop,出栈顺序存储结构顺序存储结构:最开始栈中不含有任何数据,叫做空栈,此时栈顶就是栈底。数据从栈顶进入,容量变大,数据出栈时从栈顶弹出,整个栈的容量变小。栈的代码定义typed原创 2021-03-16 14:26:52 · 90 阅读 · 0 评论 -
学习笔记:数据结构与算法(六):线性表(4)
学习笔记:数据结构与算法(六):线性表(4)约瑟夫环循环链表的改进魔术师发牌问题约瑟夫环据说著名犹太历史学家Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。然而Josephus 和他的朋友并不想遵从。首先从一个人开始,越过k-2个人(因为第一个人已经被越过)原创 2021-03-09 09:20:54 · 113 阅读 · 0 评论 -
学习笔记:数据结构与算法(五):线性表(3-循环链表)
学习笔记:数据结构与算法(五):线性表(3)循环链表初始化循环链表插入元素删除元素返回结点位置循环链表将单链表中终端节点的指针端由空指针改为指向头节点,就使整个单链表形成一个环。头尾相接。主要差异在于空链表的判断条件,由判断head->next是否为NULL,变成head->next是否为head。终端结点用尾指针rear表示,开始结点为rear->next->next。主要操作包括:初始化部分,插入部分,删除部分和返回结点所在位置。初始化循环链表void ds_in原创 2021-03-05 14:45:23 · 93 阅读 · 0 评论 -
学习笔记:数据结构与算法(四):线性表(2)
学习笔记:数据结构与算法(四):线性表(2)单链表的整表创建头插法尾插法单链表的整表删除对比优缺点静态链表初始化插入操作单链表的整表创建单链表和顺序存储结构不同,数据分散在内存的角落,属于动态增长的,根据系统情况和实际需求生成。创建思路声明结点p和计数器变量i初始化空链表L让L的头节点的指针指向NULL,建立一个带头结点的单链表循环实现后继结点的赋值和插入头插法从空表开始,生成新结点,读取数据存放在新节点的数据域中,然后将新结点插入到当前链表的表头上,直到结束。(类似于生活中排队第一个原创 2021-03-05 11:10:25 · 134 阅读 · 0 评论 -
学习笔记:数据结构与算法(三):线性表(1)
数据结构与算法(三):线性表线性表的定义数据类型和抽象数据类型线性表的定义线性表(List):由零个或者多个数据元素组成的有限序列。个数n定义为线性表的长度,n=0时,称为空表。特点:是一个序列,有先来后到。如果存在多个元素,第一个元素无前驱,最后一个无后继,其他的有且只有一个前驱和后继。线性表是有限的。数据类型和抽象数据类型数据类型:一组性质相同的值的集合以及定义在此集合上的一些操作的总称。c语言中,数据类型分为原子类型(整型,浮点型,字符型)和结构类型(例如数组等)。抽象数据类型原创 2021-03-01 15:10:13 · 141 阅读 · 0 评论 -
寒假学习——数据结构与算法(二):数据结构复杂度
寒假学习——数据结构与算法(二):数据结构和算法的复杂度效率指的是算法的执行时间,算法执行的时间取决于:算法采用的策略、方案、编译产生的代码质量、问题的输入规模、己起执行指令的速度。因此,抛开硬件软件的问题,主要依赖于算法的好坏和输入规模。算法时间复杂度定义:在进行算法分析时,语句总的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随着n的变化情况而确定T(n)的数量级,记作T(n)=O(f(n)),它表示随问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐近时间复杂度原创 2021-02-07 14:41:15 · 133 阅读 · 0 评论 -
寒假学习——数据结构与算法(一):数据结构和算法的含义
2021寒假学习——数据结构与算法(一)学习数据结构和算法的意义数据结构的分类逻辑结构物理结构算法输入输出有穷性确定性可行性算法设计的要求正确性可读性健壮性时间效率高和存储量低学习数据结构和算法的意义数据结构: 一门研究非数值计算的程序设计问题中的操作对象,以及它们之间的关系和操作等相关问题的学科。简单来说,程序设计 = 数据结构 + 算法。数据结构就是数据元素之间存在的一种或者多种特定关系的集合。数据结构的分类分为逻辑结构 和物理结构逻辑结构:数据对象中数据元素之间的相互关系。谈论和关注的重点原创 2021-02-06 21:06:04 · 301 阅读 · 0 评论