数据结构

《数据结构_稀疏数组》

被刻印的时光 ゝ 提交于 2020-03-14 12:18:01
一、概念     (概念转自博客: https://blog.csdn.net/iteye_15605/article/details/82678731 )     所谓稀疏数组就是数组中大部分的内容值都未被使用(或都为零),在数组中仅有少部分的空间使用。因此造成内存空间的浪费,为了节省内存空间,并且不影响数组中原有的内容值,我们可以采用一种压缩的方式来表示稀疏数组的内容        假设有一个9*7的数组,其内容如下:                      在此数组中,共有63个空间,但却只使用了5个元素,造成58个元素空间的浪费。以下我们就使用稀疏数组重新来定义这个数组:           其中在稀疏数组中第一部分所记录的是原数组的列数和行数以及元素使用的个数、第二部分所记录的是原数组中元素的位置和内容。   需要说明,第二部分的元素列数是指数组下标的列数,跟第一部分的实际列数不相同   其中在稀疏数组中第一部分所记录的是原数组的列数和行数以及元素使用的个数、第二部分所记录的是原数组中元素的位置和内容。   例如第二部分内容可以表达为,假设数组为array[][], array[1][1]=3,array[3][0]=1...等等     经过压缩之后,原来需要声明大小为63的数组,而使用压缩后,只需要声明大小为6*3的数组,仅需18个存储空间。 二、Java代码实现

ArrayList,LinkedList,Vector区别.TreeSet,TreeSet,LinkedHashSet区别

流过昼夜 提交于 2020-03-14 11:51:41
ArrayList:   基于数组的数据结构,地址连续,一旦数据保存好了,查询效率比较高,但是因为其地址连续,所以增删数据需要移动数据,影响速度   内部数组长度默认为10,当需要扩容时,数组长度按1.5倍增长(old+(old>>1)),移除时长度-1;数组是被transient修饰,ArrayList通过readObject,writeObject方法实现序列化 LinkedList:   基于双向链表的数据结构,地址是任意的,对于增删比较快,查找比较慢(内部保存了Node类,通过不停的node.next()来比对值) Vector:   基于数组的数据结构,线程安全,方法上加了synchronized。 --------------------------------------------------------------------------------------------------------------------------------------------------------- HashSet:   内部是一个HashMap保存数据(Hash表实现),可以保存null TreeSet:   通过二叉树实现,TreeSet为排序准备的 LinkedHashSet:   根据hashCode排序,同时使用了链表结构(LinkHashMap)

数据结构常用头文件之类型定义

落花浮王杯 提交于 2020-03-14 11:15:30
header.h // 顺序表的结构定义 #define Maxsize 100 //const int Maxsize = 100; // 预先定义一个足够大的常数 typedef struct { int data[Maxsize]; // 存放数组的数组 int length; // 顺序表的实际长度 }SeqList; // 顺序表类型名为SeqList // SeqList L 定义L为一个顺序表 Linear.h // 单链表的类型定义 typedef struct node { int data; // 数据域 struct node *next; // 指针域 }Node, *LinkList; // 双向循环链表的类型定义 struct dbnode { int data; struct dbnode *prior, *next; } typedef struct dbnode *dbpointer; typedef dbpointer DLinkList; Seqstack.h #define maxsize 6 //const int maxsize = 6; // 顺序栈 typedef struct seqstack { int data[maxsize]; int top; // 标志栈顶位置的变量 }SeqStk; Lkstack.h // 链栈的定义

来自于2016.2.24的flag

怎甘沉沦 提交于 2020-03-14 06:16:57
今天又做了一套xj模拟题-------打比赛这种事情变得越来越无聊了------既影响自己的计划(虽然看起来很难完成的样子),又扰乱心情.而且题目大都是学习算法之类的,与计划不接轨就非常没有兴趣.   然而今天题目中有一道撞鸭DP...这种类型以往都是都是看一眼题目大概有方程就不想写了----怕麻烦.但是今天的撞鸭就让我调得想撞墙.这类的题目啊...唉.不知道从何而来的自卑与负罪感.   还是得把计划写一下----貌似写出来才能发现内容之多时间紧迫......   按顺序但是没有时间...-----这就是纠结的地方啊...时间啊..时间啊...   1.数据结构:到嵌套数据结构,可持久化数据结构为止.   2.字符串:到后缀自动机为止,包括..包括...kmp...exkmp...ac自动机...mannachar...后缀数组balabala...   3.图论:网络流,以及各种乱七八糟balabala   4.数学:计算几何\数论\组合\期望\FFT   还有DP什么的必须要好好练练----------你说不到一个月来得及么0.0   好好打好好打...不枉此生 来源: https://www.cnblogs.com/YCuangWhen/p/5212554.html

数据结构之学习大纲

拥有回忆 提交于 2020-03-14 05:44:18
数据结构 一、集合 二、线性结构(重点) 元素与元素之间存在一对一的关系 存储方式: 顺序存储(顺序表) 链式存储(链表:单链表、单向循环链表、双链表、双向循环链表、内核链表) 特殊的线性结构 栈 只允许在表的同一端进行插入删除,插入称为入栈,删除称为 出栈(弹栈),允许操作的一端称栈顶,另一端称栈底。 后进先出-----》LIFO 队列 允许在表的一端进行插入,另一端进行删除。 插入称作入队,删除称作出队。入队一端称队尾,出队的一端称对头. 三、树形结构 元素与元素之间存在一对多的关系 1.树的基本概念 2.树的遍历 3.二叉排序树 哈希表 四、图形结构 元素与元素之间存在多对多的关系 来源: https://www.cnblogs.com/axjlxy/p/5859946.html

java数据结构:堆栈

可紊 提交于 2020-03-14 05:43:45
堆栈的数据结构只允许数据从有序列表的一端做输入输出操作。 堆栈数据结构的特点是先进入的数据后处理,后进入的数据先处理,就比如子弹入弹匣一下,先压入弹匣的子弹后面发射出,后压入的子弹先发射。 下面是用数组模拟堆栈:ArrayOfStack.java package Stack; /** * @author zh * 数组实现堆栈 */ public class ArrayOfStack { private Object[] stack = null; private int size; private int top; //默认初始化一个栈堆,大小为100 public ArrayOfStack(){ this.size = 100; this.top = -1; this.stack = new Object[size]; } //初始化一个自定义大小的栈堆 public ArrayOfStack(int size){ this.size = size; this.top = -1; this.stack = new Object[size]; } //判断堆栈是否为空 public boolean isEmpty(){ if(top == -1){ return true; }else return false; } //判断栈堆是否已满 public boolean

数据结构与算法之美——散列表

核能气质少年 提交于 2020-03-14 05:06:11
1.1 散列思想 ​ 将数据以散列函数的方式(键值对)存储 1.2 散列函数 ​ 形如hash(key)的键值对函数叫散列函数,hash(key)是值,key是键。 1.3 散列函数设计的基本要求 散列函数计算值应该是非负整数 如果散列函数的键相等,则函数一定相等 如果键不相等,则值也一定不相等 ​ 但是在真实的情况下第三个条件很难满足,这种不满足的情况叫它 散列冲突 。 1.4 散列冲突的解决办法 ​ 散列冲突有两类解决办法:开放寻址法、链表法。 开放寻址法 ​ 开放寻址法的思想是如果出现了散列冲突,就向后探测空闲位置,将其插入。列举下比较简单的方法,比如: 线性探测法 。 删除操作不能直接将其值赋为null,否则会使寻址法失效,如果一定用的话,可以用个表示来标记要删除的元素,寻址时发现此标识就向后寻找。 ​ 其实,线性探测法有很多的问题,比如:当空闲的位置越来越少的时候,寻找时间越来越久,性能会下降很多,最坏的情况下会达到O(n)。除了线性探测,还有 二次探测 、 双重散列 等方法可以解决。 ​ 不过,不管哪一种方法,空闲位置不多时,性能都会下降很多。一般情况,都会使空闲位置与散列表的长度处于一个健康的比值,这个比值叫 装载因子 。 链表法 ​ 链表法是相比寻址法较好的解决散列冲突的解决办法。他会根据键值的不同来划分不同的‘桶’,每一个桶都会对应一条链表

长连接和短链接的区别

折月煮酒 提交于 2020-03-14 03:29:09
TCP/IP TCP/IP是个协议组,可分为三个层次:网络层、传输层和应用层。 在网络层有IP协议、ICMP协议、ARP协议、RARP协议和BOOTP协议。 在传输层中有TCP协议与UDP协议。 在应用层有:TCP包括FTP、HTTP、TELNET、SMTP等协议 UDP包括DNS、TFTP等协议 短连接 连接->传输数据->关闭连接 HTTP是无状态的,浏览器和服务器每进行一次HTTP操作,就建立一次连接,但任务结束就中断连接。 也可以这样说:短连接是指SOCKET连接后发送后接收完数据后马上断开连接。 长连接 连接->传输数据->保持连接 -> 传输数据-> 。。。 ->关闭连接。 长连接指建立SOCKET连接后不管是否使用都保持连接,但安全性较差。 http的长连接 HTTP也可以建立长连接的,使用Connection:keep-alive,HTTP 1.1默认进行持久连接。HTTP1.1和HTTP1.0相比较而言,最大的区别就是增加了持久连接支持(貌似最新的 http1.0 可以显示的指定 keep-alive),但还是无状态的,或者说是不可以信任的。 什么时候用长连接,短连接? 长连接多用于操作频繁,点对点的通讯,而且连接数不能太多情况,。每个TCP连接都需要三步握手,这需要时间,如果每个操作都是先连接,再操作的话那么处理速度会降低很多,所以每个操作完后都不断开

数据结构与算法之比较排序算法总结

喜欢而已 提交于 2020-03-13 14:53:32
介绍: 比较算法大致可以分为两种,一种为比较算法,另一种为非比较算法。 比较算法有:冒泡排序,选择排序,插入排序,归并排序,堆排序,快速排序,希尔排序。 非比较算法有:计数排序,基数排序,桶排序。 https://gitee.com/linqiankun/Utils/tree/v3.0/ 时间复杂度: 排序方法 最好情况 平均情况 最差情况 辅助空间 稳定性 冒泡排序 n n^2 n^2 1 yes 选择排序 n^2 n^2 n^2 1 no 插入排序 n n^2 n^2 1 yes 归并排序 nlogn nlogn nlogn n yes 堆排序 nlogn nlogn nlogn 1 no 快速排序 nlogn nlogn n^2 1 no 希尔排序 n^1.3 nlogn~n^2 n^2 logn~n no 比较算法: 冒泡排序 普通冒泡排序 冒泡排序是一种极为简单的排序算法。通过循环反复的遍历数组中的元素,依次比较相邻的两个元素。如果不满足排序规则,就进行位置交换,直到没有元素需要交换位置,排序完成。 这个算法会慢慢的使元素按照需要的顺序浮出来。 时间复杂度为:O(n)~O(n^2)~O(n^2) 冒泡排序运行顺序: 比较相邻元素,按照排序规则进行位置交换。 对每一对相邻元素进行第一步的操作,操作完之后,队伍最后会是满足条件的数。循环体的内层循环走完一圈。

数据结构实验

扶醉桌前 提交于 2020-03-13 12:34:54
实验1: 答题: #include"sqlist.cpp" void main() { SqList *L; ElemType e; InitList(L); ListInsert(L,1,'a'); ListInsert(L,2,'b'); ListInsert(L,3,'c'); ListInsert(L,4,'d'); ListInsert(L,5,'e'); printf("顺序表为:");DispList(L); printf("顺序表长度为:%d\n",ListLength(L)); ListEmpty(L); if(ListEmpty(L)) printf("顺序表为空\n"); else printf("顺序表为非空\n"); GetElem(L,3,e); printf("顺序表的第3个元素为:%c\n",e); printf("元素a的位置为:%d\n",LocateElem(L,'a')); ListInsert(L,4,'f'); printf("插入第4个元素后顺序表为:");DispList(L); ListDelete(L,3,e); printf("删除第三个元素后顺序表为:");DispList(L); DestroyList(L); } 运行结果: 参考答案: 实验2: 答题: #include"linklist.cpp" void main()