当前位置: 首页 > 编程日记 > 正文

数据结构|-常见数据结构整理

归纳总结了一下数据机构的常用类型,个人理解常用的数据机构可以分为线性表、栈、队列、树,线性表包括顺序表和链表,栈和队列应当属于特殊的线性表,有几个概念和误区需要先说一下

顺序表和线性表的关系:

    • 线性表是逻辑概念,只要所有的数据在逻辑上是一维的便算是线性表,线性表中数据元素之间的关系是一对一的关系(每个元素首尾相接),比如数组和链表,都是数据一个接一个的线性表。与线性表对应的是树、堆等。
    • 顺序表是空间概念,是线性表的顺序存储结构,指的是数据在存储空间上顺序排列,比如数组,数组便是划分一块连续的内存区域用于存储,与顺序表相对应的是链表。

队列、栈和线性表的关系:

    • 线性表可以在表中任意位置进行插入、删除等操作。
    • 是一种特殊的线性表,其逻辑结构和线性表相同,但也有差别,栈被限定为只能在其一端进行插入删除的操作。
    • 队列也是一种特殊的线性表,逻辑结构与线性表相同,但操作上有限制,队列限制在表的一端进行插入,在表的另一端进行删除。


数组、链表、栈、队列、哈希表、树、图、堆


数组

数组是可以在内存中连续存储多个元素的结构,在内存中的分配也是连续的,数组中的元素通过数组下标进行访问,数组下标从0开始。

优点:

    • 按照索引查询元素速度快
    • 按照索引遍历数组方便

缺点:

    • 数组的大小固定后就无法扩容了
    • 数组只能存储一种类型的数据
    • 添加,删除的操作慢,因为要移动其他的元素。

适用场景:
频繁查询,对存储空间要求不大,很少增加和删除的情况。


链表

链表是物理存储单元上非连续的、非顺序的存储结构,数据元素的逻辑顺序是通过链表的指针地址实现,每个元素包含两个结点,一个是存储元素的数据域 (内存空间),另一个是指向下一个结点地址的指针域。根据指针的指向,链表能形成不同的结构,例如单链表,双向链表,循环链表等。

链表的优点:

    • 链表是很常用的一种数据结构,不需要初始化容量,可以任意加减元素;
    • 添加或者删除元素时只需要改变前后两个元素结点的指针域指向地址即可,所以添加,删除很快;

缺点:

    • 因为含有大量的指针域,占用空间较大;
    • 查找元素需要遍历链表来查找,非常耗时。

适用场景:
数据量较小,需要频繁增加,删除操作的场景

PS:C#中没有链表,根本原因是 .net 框架中出于安全考虑取消了指针类型,因此也就没有链表了。而事实上,数组和哈希表的组合在各方面都不输链表,链表也就没有存在空间了。


栈是一种特殊的线性表,仅能在线性表的一端操作,栈顶允许操作,栈底不允许操作。 栈的特点是:先进后出,或者说是后进先出,从栈顶放入元素的操作叫入栈,取出元素叫出栈。

栈的结构就像一个集装箱,越先放进去的东西越晚才能拿出来,所以,栈常应用于实现递归功能方面的场景,例如斐波那契数列。


队列

队列与栈一样,也是一种线性表,不同的是,队列可以在一端添加元素,在另一端取出元素,也就是:先进先出。从一端放入元素的操作称为入队,取出元素为出队,示例图如下:

使用场景:因为队列先进先出的特点,在多线程阻塞队列管理中非常适用。


哈希表

散列表,也叫哈希表,是根据关键码和值 (key和value) 直接进行访问的数据结构,通过key和value来映射到集合中的一个位置,这样就可以很快找到集合中的对应元素。

记录的存储位置=f(key)

从图中可以看出,左边很明显是个数组,数组的每个成员包括一个指针,指向一个链表的头,当然这个链表可能为空,也可能元素很多。我们根据元素的一些特征把元素分配到不同的链表中去,也是根据这些特征,找到正确的链表,再从链表中找出这个元素。

可以看作是数组和链表的组合。


这里仅讨论二叉树,以图加深印象

相关性质

    • 二叉树的每个结点至多只有2棵子树(不存在度大于2的结点),二叉树的子树有左右之分,次序不能颠倒。
    • 二叉树的第i层至多有2^(i-1)个结点;深度为k的二叉树至多有2^k-1个结点
    • 一棵深度为k,且有2^k-1个节点的二叉树称之为 满二叉树 
    • 深度为k,有n个节点的二叉树,当且仅当其每一个节点都与深度为k的满二叉树中,序号为1至n的节点对应时,称之为 完全二叉树 (简单来理解就是依次从左子树一直排过去,有任何一个结点只有右子没左子便不是完全二叉树)

三种遍历(三种遍历很容易搞混,其实只需要顾名思义,先序中序后序就是指的父结点遍历的先后次序,先序:先根后左再右,中序:左根右,后序:左右根)下面的图多跟着走几遍就理解透彻了


未完待续……


未完待续……


参考来源:https://blog.csdn.net/yeyazhishang/article/details/82353846、https://www.cnblogs.com/wanghuaijun/p/7302303.html

转载于:https://www.cnblogs.com/wq-KingStrong/p/10278303.html

相关文章:

数据结构课程上机参考代码

SqList #include <iostream>using namespace std;#include <malloc.h>#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE -1#define OVERFLOW -2typedef int Status; /* int是函数的类型,其值是函数结果状态代码&#xff0c;如OK等 */…

我的路子 - 发现游戏为模型的软件架构方式

总觉得如果一个内容被深刻地理解了&#xff0c;那么当在他口中说出来的时候&#xff0c;应该是很简单才对。 所以一直觉得&#xff0c;编程里那些不容易理解的&#xff0c;需要记住很多内容的东西都是有缺陷的。自己又比较自我认可强&#xff0c;看不到别人的角度&#xff0c;表…

Vim对中文编码的支持[转]

Vim对中文编码的支持[转] Vim对中文编码的支持 1、支持中文编码的基础 Vim要更好地支持中文编码需要两个特性&#xff1a;multi_byte和iconv&#xff0c;可以用|:version|命令检查当前使用的Vim是否支持&#xff0c;否则的话需要重新编译。 2、影响中文编码的设置项 Vim中有几个…

C/C++中extern关键字详解

1 基本解释 &#xff1a;extern可以置于变量或者函数 前&#xff0c;以标示变量或者函数的定义在别的文件中 &#xff0c;提示编译器遇到此变量和函数时在其他模块中寻找其定义 。此外extern也可用来进行链接指定。 也就是说extern有两个作用&#xff0c;第一个,当它与"C&…

关于WPF的ComboBox中Items太多而导致加载过慢的问题

【WFP疑难】关于WPF的ComboBox中Items太多而导致加载过慢的问题 周银辉我的一个同事在加载字体列表时遇到了一个让人崩溃的问题&#xff1a;由于系统字体可能较多&#xff08;可能有好几百项&#xff09;&#xff0c;导致使…

什么是3G通信

现在“3G通信”快要成为人们嘴上的口头禅了&#xff0c;那么您知道到底什么是3G通信吗&#xff1f;所谓3G&#xff0c;其实它的全称为3rd Generation&#xff0c;中文含义就是指第三代数字通信。1995年问世的第一代数字手机只能进行语音通话&#xff1b;而1996到1997年出现的第…

springMVC入门截图

mvc在bs系统下的应用 ---------------------------------------------------- 在web.xml中配置前端控制器&#xff08;系统提供的一个servlet类 只需配置即可 无需程序员开发 &#xff09; -------------------------------------------------------------- ----------------…

Linux环境下的网络编程

本文介绍了在Linux环境下的socket编程常用函数用法及socket编程的一般规则和客户/服务器模型的编程应注意的事项和常遇问题的解决方法&#xff0c;并举了具体代 码实例。要理解本文所谈的技术问题需要读者具有一定C语言的编程经验和TCP/IP方面的基本知识。要实习本文的示例&am…

WEBSHELL恶意代码批量提取清除工具

场景 使用D盾扫描到WEBSHELL后可以导出有路径的文本文件。 最后手动去把WEBSHELL复制到桌面然后以文件路径命名&#xff0c;挨个删除。 D盾界面是这样的。 手动一个个找WEBSHELL并且改名效率太低&#xff0c;使用MFC写一个小工具方便去现场以后查WEBSHELL的工作。 技术思路 D盾…

判定两棵二叉树是否相似以及左右子树交换、层次编号

#include <iostream> using namespace std; #include <malloc.h> #include <stdio.h> #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define OVERFLOW -2#define MAX_TREE_SIZE 100//二叉树的最大结点数 typedef cha…

[Tracking] KCF + KalmanFilter目标跟踪

基于KCF和MobileNet V2以及KalmanFilter的摄像头监测系统 简介 这是一次作业。Tracking这一块落后Detection很多年了&#xff0c;一般认为Detection做好了&#xff0c;那么只要能够做的足够快&#xff0c;就能达到Tracking的效果了&#xff0c;实则不然&#xff0c;现在最快的我…

.net wap强制输出WML

强制输出WML:在web.config添加下面内容<system.web>下<browserCaps><result type"System.Web.Mobile.MobileCapabilities, System.Web.Mobile, Version1.0.5000.0, Cultureneutral, PublicKeyTokenb03f5f7f11d50a3a"/><use var"HTTP_USER_…

Tomcat在Linux上的安装与配置

1.安装好linux系统&#xff0c;下载适合的 Tomcat(jdk)下载JDK与Tomcatjdk 下载Tomcat 下载参考地址&#xff1a;jdk下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.htmltomcat下载地址:http://tomcat.apache.org /download-70.cgi…

上机实践 1 初识 Java

实验 1 一个简单的 Java 应用程序 一、实验目的 掌握开发 Java 应用程序的 3 个步骤&#xff1a;编写源文件、编译源文件和运行应用程序。 二、实验要求 1. 参照教材中的指导&#xff0c;使用网络课程中提供的链接下载并安装 JKD 并配置环境变量。 2. 编写一个简单的 Java…

论COSPLAY / 谨以此文纪念我暂短的Cos生涯

COSPLAY是什么COSPLAY这一名词是是英文Costume Play&#xff08;服饰扮演&#xff09;的缩写&#xff0c;从事COSPLAY相关活动的人员一般被称为COSPLAYER。目前流行的COSPLAY活动内容主要集中于通过服装、道具、饰品等扮演动漫作品中的人物角色&#xff0c;而从宽泛的意义上来说…

python 3下对stm32串口数据做解析

1、最近有个想做一个传感器数据实时显示的上位机&#xff0c;常规的数据打印太频繁了&#xff0c;无法直观的看出数据的变化。 python下的上位机实现起来简单一点&#xff0c;网上找了一些python界面Tkinter相关资料和python串口的demo.测试实现了简单的数据显示。 Mark 一下问…

《深入理解计算机系统》第八章——异常控制流知识点总结

课本习题&#xff1a; 8.11 #include <unistd.h> #include <stdio.h>int main(){int i;for(i0;i<2;i) fork();printf("hello\n");exit(0);}/** Result:* hello* hello* hello* hello*/ 8.12 #include <stdio.h> #include <unistd.h>vo…

vs2003复制一个web窗体,没有更改指向同一个cs 文件,引发大问题

今天我在原来的考试系统的出题模块中,input模块,因为增加的一个web窗体编译有问题,于是就复制了原来的启动项页面input,再改了名字为set1,然后在set1页面上删除了控件和代码,再把set1设置为启动项,谁知道问题出来了:因为两个aspx文件都是指向同一个CS文件&#xff0c;从他们的H…

8.29 对象?数组?

今天发现我的filter函数有问题&#xff0c;翻不了页&#xff0c;一直报错&#xff1a; 这是一个封装好的Array原型扩展函数。 /* Array 原型方法扩展 */(function() {$.extend(Array.prototype, {// 添加内容&#xff0c;比push多一个检查相同内容部分add: function(item) {if …

Nginx的作用

1、Nginx简介&#xff1a; 2、简介&#xff1a; Nginx是一个高性能的HTTP和反向代理服务器。 支持的操作系统众多&#xff0c;windows、linux、MacOSX 可实现负载均衡 Rewrite功能强大 电商架构大部分都采用NginxTomcat的架构 3、命令行使用&#xff1a; 三个命令&#xff1a;(…

(转)TabContainer要实现服务器端回传

TabContainer要实现服务器端回传,出来在后台实现 OnActiveTabChanged 事件外, 还需要在前台实现 OnClientActiveTabChanged 事件&#xff0c;这是关键。 <asp:UpdatePanel ID"UpdatePanel1"runat"server"ChildrenAsTriggers"true"><con…

python 获取脚本所在目录

pythonsys.path__file__abspathrealpath 平时写python经常会想获得脚本所在的目录&#xff0c;例如有个文件跟脚本文件放在一个相对的目录位置&#xff0c;那就可以通过脚本文件的目录找到对应的文件&#xff0c;即使以后脚本文件移到其他地方&#xff0c;脚本也基本不需要改动…

《深入理解计算机系统》第十章——系统级I/0

目录 10.1Unix I/O 10.2文件 10.3打开和关闭文件 10.4读和写文件 10.5用RIO包建壮地读写 10.6读取文件元数据 10.7读取目录内容 10.8共享文件 10.9 I/O重定向 10.10 标准I/O 10.1Unix I/O 在Linux中&#xff0c;一切皆为文件。 文件I/O函数-------打开文件、读文件…

终于完成了“微软”化

整整忙活了一个下午&#xff0c;基本上我的笔记本完成了可怕的“微软”化进程&#xff01;是的&#xff0c;当我完成FOXMAIL中邮件向OUTLOOK2007的迁移后&#xff0c;在办公层面&#xff0c;已经完成“微软”化了。其实真的不想这样&#xff0c;但是想MS在独霸桌面后&#xff0…

C#创建Windows服务

利用VS.NET创建C# Windows服务在很多应用中需要做windows服务来操作数据库等操作&#xff0c;比如 &#xff08;1&#xff09;一些非常慢的数据库操作&#xff0c;不想一次性去做&#xff0c;想慢慢的通过服务定时去做&#xff0c;比如定时为数据库备份等 &#xff08;2&#x…

《深入理解计算机系统》第七章——链接知识点总结

目录 7.1编译器驱动程序 7.2静态链接 7.3目标文件 7.4可重定位目标文件 7.5符号和符号表 7.6符号解析 • 静态库(.a archive files) 7.1编译器驱动程序 7.2静态链接 7.3目标文件 7.4可重定位目标文件 使用readelf -S查看hello.o 一个典型的ELF可重定位目标文件包含以下…

排序算法之直接插入排序

1、基本思想&#xff1a; 已知待排序列r[1...n],先将序列中的第一个记录看成是一个有序的子序列&#xff0c;然后从第二个记录起逐个进行插入&#xff0c;直至整个序列变成关键字非递减有序序列为止。 具体操作如下&#xff1a; &#xff08;1&#xff09;查找出r[i]在有序序列…

【代码片段】如何使用CSS来快速定义多彩光标

对于web开发中&#xff0c;我们经常都看得到需要输入内容的组件和元素&#xff0c;比如&#xff0c;textarea&#xff0c;或者可编辑的DIV(contenteditable) &#xff0c;如果你也曾思考过使用相关方式修改一下光标颜色的&#xff0c;那么这篇技术小分享&#xff0c;你绝对不应…

如何划分155MSDH带宽

我们单位拟计划租用运营商155MSDH电路&#xff0c;由于我们单位应用业务较多&#xff0c;为了避免各业务之间相互影响&#xff0c;更好地分享带宽&#xff0c;根据各业务数据量的大小&#xff0c;分别赋予一定的带宽&#xff0c;使各业务在自己的带宽内传输&#xff0c;但不知选…

慕课袁春风老师《计算机系统基础》一二三部分练习题

2.2 1、下列几种存储器中&#xff0c;&#xff08; A &#xff09;是易失性存储器。 A. cache B. EPROM C. Flash Memory D. CD-ROM 2、下面有关半导体存储器组织的叙述中&#xff0c;错误的是&#xff08; D &#xff09;。 A. 存储器的核心部分是存储阵列&#xff0c;…