数据结构
文章平均质量分 82
算法学习
Orange#
这个作者很懒,什么都没留下…
展开
-
AVLTree 一种自平衡的二叉查找树
什么是平衡树对于已有的二叉查找树,它最坏情况下会退化为链表,查找效率降至O(n),我们希望的是插入或者删除元素始终能使得维持成完全二叉树的样子(完全二叉树n个节点,其高度为logn)这样查找效率就能维持在logn。平衡树字面意义上就是说让树的两边看起来是均匀的,只要满足任意节点的左子树和右子树高度差不大于1,那么就称这棵树为平衡树。AVL树在平衡树的基础上还满足二叉查找树的性质,所以AVL树也称为自平衡二叉查找树。AVL树的旋转想维护一棵AVL树,必然需要在高度失衡时对节点进行调整,使得高度原创 2021-12-21 15:42:27 · 791 阅读 · 0 评论 -
hashtable 一种根据key值直接进行访问的数据结构
hash是什么哈希用来将很大范围的数(比如[10^-9, 109]),映射到一块较小的区间内。比如对于109,我们想让它映射到[0, 105]这块区间(也可以理解为数组)内,可以直接对109进行取余(10^9 % 10^5),然后根据余数确定该数在区间内的落点。这里的取余操作就叫做hash,取余也是常见的一种hash算法。我们使用hash就是为了节约空间,如果内存大小无限,我们直接选择开一块2 * 10^9的数据存放数据即可,但是这块内存可能有很多空闲区域。实际中内存是有限的,我们需要尽可能的将大范原创 2021-12-16 15:47:34 · 992 阅读 · 0 评论 -
Dijkstra算法、Floyd算法的思想和实现(C语言)
前言如果您还不了解Dijkstra算法和Floyd算法,我建议您先跳过前言,直接学习算法的步骤和实现,再回过头阅读前言。整理Dijkstra算法后发现,其本质就是在求第n步最短路径时,直接从第n-1步的结果中遍历得到(贪心),再在第n步最短路径求出的基础上对所有的最短路径更新(松弛);整理Floyd算法后发现,其本质就是在加入第n个顶点后,根据第n-1步的状态,求得第n步的最优状态(动态规...原创 2020-01-03 21:09:39 · 763 阅读 · 0 评论 -
双向循环链表基础操作(创建删除插入)
简介:在双向链表中,我们可以通过任意一个结点访问到其前驱元素和后继元素,时间复杂度为O(1),所以双向链表是十分方便的,我们通常构建链表也会选择去构建双向链表。单个节点包括两个指针:空表的判断体条件是L->next == L 或者 L->prior == L创建成功的链表:那么如何创建这个链表呢?...原创 2019-08-13 18:01:05 · 3086 阅读 · 1 评论 -
使用循环链表的经典题目(约瑟夫、魔术师发牌、拉丁方阵)
一:约瑟夫问题问题描述:据说著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。问题是,给定了和,一开始要站在什么地方才能避免被处决?...原创 2019-08-08 21:14:16 · 517 阅读 · 0 评论 -
单链表的排序、有序合并
二、有序合并①什么是有序合并?合并就是将两个链表组装成一个链表,并且新链表节点数据按升序或降序的方式排列。link_one:5 2 1link_two:1 3 1 4link_new:1 1 1 2 3 4 5②代码实现:这里我们假设已创建的两个链表是升序链表,并且将这两个链表合并为新的升序链表。...原创 2019-06-10 22:25:16 · 2253 阅读 · 0 评论 -
单链表的创建、添加、删除
创建头插法:①什么是头插法?#include<stdio.h>#include<stdlib.h>typedef struct node{ int data; struct node * next;}Node;//create函数如下:Node * create(int n){ int i; Node * head= (N...原创 2019-06-08 14:10:03 · 429 阅读 · 0 评论 -
稀疏矩阵(C语言)
稀疏矩阵是什么? -设在 m×n 的矩阵中有 t 个非零元素。令z= t /(m×n),当z≤0.05 时称为稀疏矩阵。也就是说,该矩阵中充斥着大量的0。稀疏矩阵怎么存储? - 因为矩阵中有大量的0,所以我们只记录非零元素。记录非0元素的所在行数、列数、值。由此引了出三元组。 - 什么是三元组? -要记录非0元的信...原创 2019-11-08 00:22:31 · 7256 阅读 · 0 评论 -
树和二叉树习题
知识点:二叉树的有序性由 3 个结点可以构造出多少种不同的二叉树?答案:5。知识点:二叉树的数学性质一个具有 1025 个结点的二叉树的高 h 为____?答案:11到1025。h最小则树为满二叉树,一棵10层的树有1024个节点,则1025个节点最少为11层。最高1025层,串成了一串。在一棵度为4的树T中,若有20个度为4的结点,10个度为3的结点,1个度为...原创 2019-12-06 01:13:18 · 3312 阅读 · 0 评论 -
数组和广义表习题
设有数组 A[i,j],数组的每个元素长度为 3 字节,i 的值为 1 到 8 ,j 的值为 1 到 10,数组从内存首地址 BA 开始顺序存放,当用以列为主存放时,元素 A[5,8] 的存储首地址为?答案: BA + 180。画出矩阵图,先算整列8×7,再算剩余的5个。BA+(8×7+5-1)×3=BA+180。设有一个 10 阶的对称矩阵 A,采用压缩存储方式,以行序为主存储,a...原创 2019-12-05 20:29:59 · 6284 阅读 · 0 评论 -
树(C语言)(待更)
目录简单认识几种二叉树和它们的性质二叉树的存储和遍历二叉树的创建由遍历引申出的问题线索二叉树树和森林哈夫曼树常用点的深度讲解简单认识几种二叉树和它们的性质什么是二叉树? - 就是有一棵树,它的节点最多有两个分支,可以没有分支,可以有一个,也可以有两个。如果它有两个分支,那么它的左右分支是有顺序的,左边的就叫左子树,右边的就叫右子树,左右不能颠倒...原创 2019-11-14 21:47:52 · 200 阅读 · 0 评论 -
data structure 3 栈的表示和实现
1)顺序栈#include <stdio.h>#include <stdlib.h>#define Status int#define OK 1#define ERROR 0#define OVERFLOW -2#define STACK_INIT_SIZE 20#define...原创 2019-11-05 21:01:30 · 95 阅读 · 0 评论 -
data structure 2 各种存储类型之比较
1)四种存储方式的比较 {顺序、链式},{静态、动态} - 顺序存储的固有特点:逻辑顺序与物理顺序一致,本质上是用数组存储线性表的各个元素(即随机存取);存储密度大,存储空间利用率高。 -链式存储的固有特点:元素之间的关系采用这些元素所在的节点的”指针”信息表示(插、删不需要移动节点)。 -静态存储的固有特点:在程序运行的过程中不用考虑追加内存的分...原创 2019-10-26 15:56:10 · 190 阅读 · 0 评论 -
data structure 2 线性表的链式表示和实现
1)链表 -用一组物理位置任意的存储单元来存放线性表的 数据元素。 这组存储单元既可以是连续的,也可以是 不连续的,甚至是零散分布在内存中的任意位置上的。 因此,链表中元素的逻辑次序和 物理次序不一定相同。好比小明家住在1号楼;小红家住在2号楼,同时小红知道小明家的地址为1号楼;小刚家住在3号楼,同时小刚知道小红家的地址为2号楼...2)单链表的基本操作(带头节点) ...原创 2019-10-26 15:47:09 · 111 阅读 · 0 评论 -
data structure 2 线性表的顺序表示和实现
1)线性的顺序存储结构 - 向内存申请一块连续的存储单元,好比数组,就是顺序存储结构。也叫顺序映像。这种方法存储的线性表称作顺序表。 - 静态的顺序存储结构:数组。这就好比学生去春游,一个班的学生坐一辆大巴车,但是一辆不够,多余的学生就不能坐进大巴车。大巴车是不能变长的,(C语言中)数组也是不能变长的。 - 动态的顺序存储结构:手动申请内存空间。现在是坐火...原创 2019-10-26 15:29:19 · 110 阅读 · 0 评论 -
data structure 2 线性表的概念
1)线性表的概念: - 一个数据元素可以由若干个数据项组成,这时,也可以称数据元素为记录。含有大量记录的线性表又称“文件”。用白话说,好比一个学生是一个数据元素,学生的学号、姓名、年龄、性别就是数据项,一个班的学生就是一个文件。 -一个线性表是n个数据元素的有限序列。其实就是一条由一个班的学生组成的队伍,这条队伍就是线性表。 -线性表中的数据元素可以是...原创 2019-10-26 14:02:00 · 162 阅读 · 0 评论 -
数据结构学习总结(C语言)(待更)(待补充)
data structure 1 绪论1)基本概念和术语(理解)2)抽象数据类型(理解)3)算法和算法分析(掌握)(重点)data structure 2 线性表1)线性表的概念2)线性表的顺序表示和实现3)线性表的链式表示和实现4)各种存储类型之比较data structure 3栈和队列1)栈的定义及逻辑特性2)栈的表示和实现3)栈的应用与递归...原创 2019-10-24 20:24:41 · 112 阅读 · 0 评论 -
data structure 1 算法和算法分析
1)算法的基本概念 - 简单的说就是解决问题的方法。科学的讲就是对特定问题求解步骤的一种描述,它是指令的有限序列,其中每一条指令表示一个或多个操作。 - 算法的五个特性:有穷性、确定性、可行性、0个或多个输入、1个或多个输出。记忆 - 算法的设计要求:正确性、可读性、健壮性、高效率、低存储。记忆 - 算法与程序的区别:1、程序不一定满足有穷性...原创 2019-10-24 20:15:27 · 154 阅读 · 0 评论 -
data structure 1 抽象数据类型(ADT)
1)ADT定义:是指一个数学模型以及定义在该模型上的一组操作。包括:数据对象、数据关系、基本操作。2)ADT表示:就是要将该类型映射到计算机中,确定存储结构以及该存储结构之上基本操作的函数原型。3)ADT实现:基于特定存储结构之上的基本操作的实现。4)ADT小结:自定义的数据类型、定义一组数据和施与这些数据之上的一组操作,并在模块内部给出它们的表示和实现细节,在模块外部使用的只是抽象的...原创 2019-10-24 18:27:46 · 339 阅读 · 0 评论 -
data structure 1 基本概念和术语
1)数据项(data item) - 一个数据元素由若干个数据项组成,数据项是数据不可分割的最小单位。2)结构(structure) - 组成整体的各部分的关系和关联。 -关系、关联的表示是用序偶表示。3)数据结构( data structure) -数据结构是相互之间存在一种或多种特定关系的数据元素的集合,也可称其为逻辑结构。...原创 2019-10-24 17:53:11 · 414 阅读 · 0 评论 -
栈应用之括号匹配(C语言)
{ ( hey! )[不管是电子表还是劳力士,他们的指针都是一样转动的。] } )宁是否发现了不舒服的地方,oh这种事是无法让强迫症忍受的,没错,这里的括号是不匹配的,就像C语言中,如果你输入的括号不能匹配,那么编译就会出错,如何检测括号是否匹配就是我们今天的任务。先谈谈思路吧,首先是将数据输入,我打算将括号作为字符一个个的存入栈中,那怎样检测括号是否匹配呢?我想这不简单嘛,既然字符都在栈中,...原创 2019-10-23 20:34:20 · 3151 阅读 · 4 评论 -
栈应用之地图染色(C语言)
题目描述:四色定理告诉我们,在地图上用四种不同的颜色给不同的行政区域染色,就能使得相邻的行政区域的颜色不同,现给你一张地图,请你给按照上述要求给地图染色。解决思路:①首先考虑的是如何将地图存储,我们只关心图与图之间的相邻关系,所以我们选择图的邻接矩阵来存储图,如果i区域和j区域相邻,那么我们就对[i][j]和[j][i]赋值为1,不相邻的区域赋值为0。那么邻接矩阵如下: { 0, 1,...原创 2019-08-27 17:44:47 · 2411 阅读 · 1 评论 -
栈的基本操作(C语言)
#include<stdio.h>#include<stdlib.h>#define STACK_INIT_SIZE 20//初始内存单元个数#define STACK_DILA_SIZE 10//扩容需增加的内存单元个数typedef double elemtype;//方便改动数据类型typedef struct//栈的结构体{ elemtype ...原创 2019-08-28 13:09:45 · 1011 阅读 · 0 评论 -
栈应用之逆波兰计算器(C语言)
逆波兰计算器就是用来计算逆波兰表达式的计算器。先谈一谈逆波兰表达式(RPN)吧,逆波兰表达式就是平常说的后缀表达式,即类似数字在前,符号在后的形式。例如:a+b —> a,b,+a+(b-c) —> a,b,c,-,+a+(b-c)d —> a,b,c,-,d,,+a+d*(b-c)—>a,d,b,c,-,*,+a=1+3 —> a,1,3,+,=正常的式...原创 2019-09-01 12:03:07 · 600 阅读 · 0 评论 -
栈应用之中缀表达式转后缀表达式(C语言)
我从网上摘取了几个思路,这里的思路在优先级的比较上大致相同,方法多变,这里不再一一详解。———————————————————————————————————1、数字直接输出2、遇到左括号直接入栈,遇到右括号将栈中左括号之后入栈的运算符全部弹栈输出,同时左括号出栈但是不输出。3、遇到乘号和除号直接入栈,直到遇到优先级比它更低的运算符,依次弹栈。4、遇到加号和减号,如果此时栈空,则直接入栈...原创 2019-09-03 00:07:37 · 1331 阅读 · 1 评论 -
链队列的基本操作(C语言)
队列的特点就是先进先出,链队列就是用链表生成的队列,它的特殊之处就是有头尾标志(front和rear),且front作为头节点,rear是存储数据的节点,队列没有尾节点。#include<stdio.h>#include<stdlib.h>typedef int elemtype;typedef struct Queuenode{ elemtype data...原创 2019-09-03 19:37:22 · 752 阅读 · 0 评论 -
循环队列的基本操作(C语言)
要点:循环队列在创建时就要规定有多少块连续的存储单元。在队尾添加元素,在队头删除元素。以front和rear标志队头队尾,初始时front和rear都为0,入队rear加一,出队front加一。且rear的位置指向队尾元素的下一个单元。如果向队列添加元素时队列已满,那么就将第一个元素出队,新元素添加到原来第一个元素所在位置。但这个操作过程中rear的指向问题如何解决?...原创 2019-09-04 23:26:15 · 3084 阅读 · 0 评论 -
顺序线性表的操作(C语言)(转载)
delcaration.h#ifndef DECLARATION_H_INCLUDED#define DECLARATION_H_INCLUDED#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE -1#define OVERFLOW -2#define ElemType intt...转载 2019-09-14 16:23:04 · 296 阅读 · 0 评论 -
循环队列应用之杨辉三角(C语言)
杨辉三角是什么不多赘述。直接上代码。只用到四个函数:init、inset、delete、get。这一部分是老套路。#include<stdio.h>#include<stdlib.h>#define MAXQSIZE 100typedef int elemtype;typedef struct Queue{ elemtype Queue[MAXQS...原创 2019-09-25 00:55:05 · 2217 阅读 · 2 评论 -
单链表基本操作(C语言)
如果您对于单链表不是很熟悉,请看单链表的简单介绍#include <stdio.h>#include <stdlib.h>#define Status int //状态#define OVERFLOW -1 //溢出#define OK 1 //正确#define ERROR ...原创 2019-09-25 10:16:20 · 220 阅读 · 0 评论 -
栈应用之进制转换(C语言)
通过入栈和出栈实现二进制与十进制的相互转换二进制转十进制的步骤:100110 = 0×20 + 1×21 + 1×22 + 0×23 + 0×24 + 1×25 = 38我们在键盘敲入100110时,就要把每一个数字进行入栈:这样再将栈中的元素出栈,再进行数学运算即可。需要注意的是,二进制数字是以字符型传入,若以int型传入,则100110成为了一个整体,无法将每一位分开。#inclu...原创 2019-08-19 13:22:30 · 4165 阅读 · 0 评论