网站首页 > 文章精选 正文
线性结构
- 线性结构作为最常用的数据结构,其特点是数据元之间存在一对一的线性关系
- 线性结构有2种不同的存储结构,即顺序存储结构和链式存储结构
- 顺序存储的线性表称为顺序表,顺序表中的存储元素是连续的(指元素地址是连续的)
- 链式存储线性表称为链表,链表中的存储元素不一定是连续的,元素节点中存放元数据以及相邻元数据的地址信息
- 线性结构常见的有:数组(最经典的一维数组),队列,链表和栈
非线性结构
- 非线性结构包括:二维数组,多维数组,广义表,树结构,图结构
队列
队列是一个有序列表,可以用数组或者链表来实现,遵循先入先出原则(简称FIFO结构),即先存入队列的数据,要先取出来,后存入的数据,要后取出来。在队尾添加元素,在队头删除元素。
队列的相关概念
队头与队尾:允许元素插入的一端称为队尾,允许元素删除的一端称为队头
入队:队列的插入操作
出队:队列的删除操作
入队示意图:
添加元素时,元素只能从队尾一端进入队列,也即是2只能跟在1后面,3只能跟在2后面
出队示意图:
元素只能从队首出队列,出队列的顺序为:1、2、3,与入队时的顺序一致,这就是所谓的“先进先出”
基于数组的循环队列实现
以数组作为底层数据结构时,一般将队列实现为循环队列,这是因为队列在顺序存储上的不足:每次从数组头部删除元素(出队)后,需要将头部以后的所有元素往前移动一个位置,这是一个时间复杂度为O(n)的操作。
队列顺序存储图:
循环队列
所谓的循环队列,可以把数组看作一个首尾相连的圆环,删除元素时将队首标志往后移动,添加元素时若数组尾部已经没有空间,则考虑数组头部的空间是否空闲,如果是,则在数组头部进行插入。
循环队列图:
链表
链表是一种数据结构,和数组同级,Java中我们使用的ArrayList,其实现原理是数组。而LinkedList的实现原理就是链表了。链表在进行循环遍历时效率不高(原因:随机访问数据时,无法像数组那样直接通过下标找到特定的数据项),但是插入和删除时优势明显,(原因:插入和删除操作时,不需要移动数据)。
单向链表
单向链表是一种线性表,实际上是由节点(Node)组成的,一个链表拥有不定数量的节点。其数据在内存中存储是不连续的,它存储的数据分散在内存中,每个结点只能也只有它能知道下一个结点的存储位置。由N各节点(Node)组成单向链表,每一个Node记录本Node的数据及下一个Node。向外暴露的只有一个头节点(Head)。
链表示意图:
head为头节点,它不存放任何的数据,只是充当一个指向链表中真正存放数据的第一个节点的作用,而每个节点中都有一个 next 引用,指向下一个节点,就这样一节一节往下面记录,直到最后一个节点,最后一个节点的next 指向 null。
删除节点示意图:
双向链表
节点类保留上一节点、下一节点的引用。链表类保留头节点、尾节点的引用,可以从尾节点插入和删除
双端链表
节点类保留下一节点的引用。链表类保留头节点、尾节点的引用,可以从尾节点插入,但只能从头节点删除 (双端链表不能删除尾节点原因是只能知道下个节点,不知道上个节点,故无法删除)。
双端链表示意图:
有序链表
递增,递减或者其他满足一定条件的规则,插入数据时,从头结点开始遍历每个节点,在满足规则的地方插入新节点。
栈
栈的概念介绍
栈是一种只允许在一端进行插入或删除的线性表,栈的操作端通常被称为栈顶,另一端被称为栈底,栈的插入操作称为进栈(压栈|push);栈删除操作称为出栈(弹栈|pop)。栈中的元素是“先进后出”的特点。顺序存储的栈称为顺序栈(一般用数组来实现);链式存储的栈称为链式栈。
顺序栈示意图:
链式栈示意图:
递归
递归就是方法自己调用自己,每次调用传递不同参数,递归有助于开发者解决问题,同时代码也很简洁。递归调用规则是当程序调用到一个方法时,在栈中开辟一份独立的方法栈空间,每个空间的数据(局部变量)是独立的。使用递归时,要注意防止死循环。递归的方法调用内存分布图:
排序
排序也称排序算法,是将一组数据根据指定的顺序进行排序。
排序分类:
- 内部排序:将需要处理的所有数据加载到内存进行排序
常见的内部排序算法:
插入排序:直接插入排序,希尔排序
选择排序:简单选择排序,堆排序
交换排序:冒泡排序,快速排序
归并排序
基数排序
- 外部排序:由于数据量太大无法全部加载到内存,需要借助外部存储进行排序
算法的时间复杂度
一个算法花费的时间和算法中语句执行的次数成正比,哪个算法中语句执行的次数多,它花费的时间就多,记为T(n)
猜你喜欢
- 2025-02-04 “故作高深”的让·鲍德里亚、德勒兹,乱用概念有多严重?
- 2025-02-04 计算机二级office | 选择题知识点分享
- 2025-02-04 数据结构——树基本概念及其遍历(数据结构树的层次遍历)
- 2025-02-04 构建强大智慧安全的制造业供应链体系
- 2025-02-04 六种嵌入式编程数据结构(嵌入式要学数据结构算法吗)
- 2025-02-04 今天带大家认识光纤,也就是目前家庭宽带的入户线
- 2025-02-04 中科云谷申请数据处理等专利,实现对非线性结构数据的精准检索
- 2025-02-04 Ansys Workbench工程应用之——结构非线性(上):屈曲(3)
- 2025-02-04 一文带你认识30个重要的数据结构和算法
- 2025-02-04 JAVA中常用的数据结构(java常用数据结构和基本算法)
- 最近发表
- 标签列表
-
- newcoder (56)
- 字符串的长度是指 (45)
- drawcontours()参数说明 (60)
- unsignedshortint (59)
- postman并发请求 (47)
- python列表删除 (50)
- 左程云什么水平 (56)
- 计算机网络的拓扑结构是指() (45)
- 稳压管的稳压区是工作在什么区 (45)
- 编程题 (64)
- postgresql默认端口 (66)
- 数据库的概念模型独立于 (48)
- 产生系统死锁的原因可能是由于 (51)
- 数据库中只存放视图的 (62)
- 在vi中退出不保存的命令是 (53)
- 哪个命令可以将普通用户转换成超级用户 (49)
- noscript标签的作用 (48)
- 联合利华网申 (49)
- swagger和postman (46)
- 结构化程序设计主要强调 (53)
- 172.1 (57)
- apipostwebsocket (47)
- 唯品会后台 (61)
- 简历助手 (56)
- offshow (61)