当前位置: 首页 > news >正文

数据结构之“初窥门径”

目录

前言:

一,数据结构起源

二,基本概念和术语

2.1数据

2.2数据元素

2.3数据项

2.4数据对象

2.5数据结构

三,逻辑结构与物理结构

3.1逻辑结构

3.1.1集合结构

3.1.2线性结构

3.1.3树形结构

3.1.4图形结构

3.2物理结构

3.2.1顺序存储结构

3.2.2链式存储结构

四,数据类型

4.1数据类型的定义

4.2抽象数据类型


前言:

在计算机科学中,数据结构是一种用于组织和存储数据的方式。它是计算机程序设计的基础,对于解决问题和提高代码效率至关重要。数据结构可以看作是一种容器,它可以存储和操作数据。不同的数据结构有不同的特点和应用场景。

学习数据结构的目的是为了更好的理解和处理数据,通过选择合适的数据结构我们可以提高程序的运行效率,并实现更高效的算法。同时,数据结构也是算法设计和分析的基础,它们相互依存,相互影响。

很喜欢《大话数据结构》这本书的开场白:“如果你交给某人一个程序,你将折磨他一整天;如果你教某人如何编写程序,你将折磨他一辈子”,哈哈哈。


一,数据结构起源

早期人们都把计算机理解为数值计算工具,就是感觉计算机当然是用来计算的,所以计算机解决问题,应该是先从具体问题中抽象出一个适当的数据模型,设计出一个解此数据模型的算法,然后再编写程序,得到一个实际的软件。

可现实中,我们更多的不是解决数值计算的问题,而是需要一些更科学更有效的手段(比如表,树和图等数据结构)的帮助,才能更好的处理问题。所以:

数据结构是一门研究非数值计算的程序设计问题中的操作对象,以及它们之间的关系和操作等相关问题的学科。

1968年,美国的高德纳 (Donald E. Knuth)教授在其所写的 《计算机程序设计艺术》第一卷《基本算法》中,较系统地阐述了数据的逻辑结构和存储结构及其操作,开创了数据结构的课程体系。同年,“数据结构〞作为一门独立的课程,在计算机科学的学位课程中开始出现。也就是说,那之后计算机相关专业的学生开始接受 “数据结构”的“折磨”——其实应该是享受才对。

之后,20世纪70年代初,出现了大型程序,软件也开始相对独立,结构程序设计成为程序设计方法学的主要内容,人们越来越重视“数据结构”,认为程序设计的实质是对确定的问题选择一种好的结构,加上设计一种好的算法。可见,数据结构在程序设计当中占据了重要的地位。

二,基本概念和术语

说到数据结构,我们得先来谈谈什么叫数据

正所谓“巧妇难为无米之炊”,这个“米”就是数据。

2.1数据

数据是描述客观事物的符号,是计算机中可以操作的对象,是能被计算机识别,并输入给计算机处理的符号集合。数据不仅仅包括整形,实型等数据类型,还包括字符及声音,图像,视频等非数值类型。

比如我们现在常用的搜索引擎,一般会有网页,图片,音频,视频等分类。图片是图像数据,音频当然就是声音数据,视频就不用说了,而网页其实指的就是全部数据的搜索,包括最重要的数字和字符等文字数据。

也就是说,我们这里说的数据,其实就是符号,而且这些符号必须具备两个前提:

  • 可以输入到计算机中。
  • 能被计算机程序处理。

对于整型,实型等数值类型,可以进行数值计算。

对于字符数据类型,就需要进行非数值的处理。而声音,图像,视频等其实是可以通过编码的手段变成字符数据来处理的。

2.2数据元素

数据元素是组成数据的,有一定意义的基本单位,在计算机中通常作为整体处理,也被称为记录。

比如,在人类中,什么是数据元素呀?当然是人了。

畜禽类呢?牛,马,羊,猪,鸡,鸭等动物当然就是畜禽类的数据元素。

2.3数据项

数据项:一个数据元素可以由若干个数据项组成。

比如人这样的数据元素,可以由眼睛,耳朵,嘴巴,鼻子,手,脚这些数据项,也可以由姓名,年龄,性别,家庭地址,联系电话,邮政编码等数据项,具体有哪些数据项,要由你做的系统来决定。

数据项是数据不可分割的最小单位。

之所以将数据项定义为最小单位,是因为这样有助于帮我们更好的解决问题。但真正讨论问题时,数据元素才是数据结构中建立数据模型的着眼点,就像我们讨论一部电影时,是讨论这部电影角色这样的“数据元素”,而不是针对这个角色的姓名或者年龄这样的“数据项”去研究分析。

2.4数据对象

数据对象是性质相同的数据元素的集合,是数据的子集。

什么叫性质相同呢,是指数据元素具有相同数量和类型的数据项,比如,人都有姓名,生日,性别等相同的数据项。

2.5数据结构

结构,简单的理解就是关系,比如分子结构,就是说组成分子的原子之间的排列方式。严格点说,结构是指各个组成部分相互搭配和排列的方式。在现实世界中,不同数据元素之间不是独立的,而是存在特定的关系,我们将这些关系称为结构。那数据结构是什么?

🍂数据结构:是相互之间存在一种或多种特定关系的数据元素的集合。

三,逻辑结构与物理结构

按照视点的不同,我们把数据结构分为逻辑结构和物理结构。

3.1逻辑结构

逻辑结构是指数据对象中数据元素之间的相互关系

🍂它分为以下四种:

3.1.1集合结构

集合结构:集合结构中的数据元素除了同属于一个集合外,它们之间没有其他关系。各个数据元素是“平等”的,它们的共同属性是“同属于一个集合”。数据结构中的集合关系就类似于数学中的集合。

3.1.2线性结构

线性结构:线性结构中的数据元素之间是一对一的关系。

3.1.3树形结构

树形结构:树形结构中的数据元素之间存在一种一对多的层次关系。

3.1.4图形结构

图形结构:图形结构的数据元素是多对多的关系。

我们在用示意图表示数据的逻辑结构时,要注意两点:

  • 将每一个数据元素看作一个结点,用圆圈表示。
  • 元素之间的逻辑关系用结点之间的连线表示,如果这个关系是有方向的,那么用带箭头的连线表示。 

3.2物理结构

物理结构:是指数据的逻辑结构在计算机中的存储形式。

数据是数据元素的集合,那么根据物理结构的定义,实际上就是如何把数据元素存储到计算机的存储器中。存储器主要是针对内存而言的,像硬盘,软盘,光盘等外部存储器的数据组织通常用文件结构来描述。

🍂数据结构的存储结构形式有以下两种: 

3.2.1顺序存储结构

顺序存储结构:是把元素存放在地址连续的存储单元里,其数据间的逻辑关系和物理关系是一致的。

这种存储结构其实很简单,说白了,就是排队占位。大家都按顺序排好,每个人占一小段空间,大家谁也别插谁的队。我们之前学计算机语言时,数组就是这样的顺序存储结构。当你告诉计算机,你要建立一个有9个整型数据的数组时,计算机就在内存中找了片空地,按照一个整型所占位置的大小乘以9,开辟一段连续的空间,于是第一个数组数据就放在第一个位置,第二个数据放在第二个位置,这样依次摆放。如下图所示。

 

3.2.2链式存储结构

如果就是这么简单和有规律,一切就好办了。可实际上,总会有人插队,也会有人要上网所、有人会放弃排队。所以这个队伍当中会添加新成员,也有可能会去掉老元素,整个结构时刻都处于变化中。显然,面对这样要时常变化的结构,顺序存储是不科学的。那怎么办呢?

现在如银行、医院等地方,设置了排队系统,也就是每个人去了,先领一个号,等着叫号,叫到时去办理业务或看病。在等待的时候,你爱在哪在哪,可以坐着、站着或者走动,甚至出去逛一圈,只要及时回来就行。你关注的是前一个号有没有被叫到,叫到了,下一个就轮到你了。

链式存储结构:是把数据元素存放在任意的存储单元里,这组存储单元可以是连续的,也可以是不
连续的。
数据元素的存储关系并不能反映其逻辑关系,因此需要用一个指针存放数据元素的地址,这样通过地址就可以找到相关联数据元素的位置。如图所示。
显然,链式存储就灵活多了,数据存在哪里不重要,只要有一个指针存放了相应的地址就能找到它了。

逻辑结构是面向问题的,而物理结构就是面向计算机的,其基本的目标就是将数据及其逻辑关系存储到计算机的内存中。 

四,数据类型

数据类型:是指一组性质相同的值的集合及定义在此集合上的一些操作的总称。

4.1数据类型的定义

数据类型是按照值的不同进行划分的。在高级语言中,每个变量、常量和表达式都有各自的取值范围。类型就用来说明变量或表达式的取值范国和所能进行的操作。

🍂当年那些设计计算机语言的人,为什么会考虑到数据类型呢?

比如,大家都需要有房子住,也都希望房子越大越好。但显然,没有钱,考虑房子是没啥意义的。于是商品房就出现了各种各样的房型,有别墅的,有错层的,有单间的;有一百多平米的,也有几十平米的,甚至还有胶囊公寓----只有两平米的房间⋯这样就满足了不同人的需要。

同样,在计算机中,内存也不是无限大的,你要计算一个如1+1=2、3+5=8这样的整型数字的加减乘除运算,显然不需要开辟很大的适合小数甚至字符运算的内存空间。于是计算机的研究者们就考虑,要对数据进行分类,分出来多种数据类型。

🍂在C语言中,按照取值的不同,数据类型可以分为两类:

 

比如,在C语言中变量声明int a,b,这就意味着,在给变量a和b赋值时不能超出int的取值范围,变量a和b之问的运算只能是int类型所允许的运算。

因为不同的计算机有不同的硬件系统,这就要求程序语言最终通过编译器或解释器转换成底层语言,如汇编语言甚至是通过机器语言的数据类型来实现的。可事实上,高级语言的编程者不管最终程序运行在什么计算机上,他的目的就是为了实现两个整型数字的运算,如a+6、a-6、axb和a/b等,他才不关心整数在计算机内部是如何表示的,也不想知道CPU为了实现1+2进行几次开关操作,这些操作是如何实现的,对高级语言开发者来讲根本不重要。于是我们就会考虑,无论什么计算机、什么计算机语言,大都会面临着如整数运算、实数运算、宇符运算等操作,我们可以考虑把它们都抽象出来。

抽象是指抽取出事物具有的普遍性的本质。它是抽出问题的特征而忽略非本质的细节,是对具体事物的一个概括。抽象是一种思考问题的方式,它隐藏了繁杂的细节,只保留实现目标所必需的信息。

4.2抽象数据类型

🍂我们对已有的数据类型进行抽象,就有了抽象数据类型。
抽象数据类型 ( Abstract Data Type, ADT):一个数学模型及定义在该模型上的一组操作。抽象数据类型的定义仅取決于它的一组逻辑特性,而与其在计算机内部如何表示和实现无关。

比如刚才的例子,各个计算机,不管是大型机、小型机、PC、平板电脑、PDA,甚至智能手机都拥有“整数” 类型,也需要整数间的运算,那么整型其实就是一个抽象数据类型,尽管它在上面提到的这些在不同计算机中实现方法上可能不一样,但由于其定义的数学特性相同,在计算机编程者看来,它们都是相同的。因此,“抽象”的意义在于数据类型的数学抽象特性。

而且,抽象数据类型不仅仅指那些已经定义并实现的数据类型,还可以是计算机编程者在设计软件程序时自己定义的数据类型,比如我们编写关于计算机绘图或者地图类的软件系统,经常都会用到坐标。也就是说,总是有成对出现的x和y,在3D系统中还有z出现,既然这三个整型数字是始终在一起出现,我们就定义一个叫point的抽象数据类型,它有x、y、z三个整型变量,这样我们很方便地操作—个point数据变量就能知道这一点的坐标了。

根据抽象数据类型的定义,它还包括定义在该模型上的一组操作。

实际上,抽象数据类型体现了程序设计中问题分解、抽象和信息隐藏的特性。抽象数据类型把实际生活中的问题分解为多个规模小且容易处理的问题,然后建立一个计算机能处理的数据模型,并把每个功能模块的实现细节作为一个独立的单元,从而使具体实现过程隐藏起来。

相关文章:

数据结构之“初窥门径”

目录 前言: 一,数据结构起源 二,基本概念和术语 2.1数据 2.2数据元素 2.3数据项 2.4数据对象 2.5数据结构 三,逻辑结构与物理结构 3.1逻辑结构 3.1.1集合结构 3.1.2线性结构 3.1.3树形结构 3.1.4图形结构 3.2物理结…...

css:transform实现平移、旋转、缩放、倾斜元素

目录 文档语法示例旋转元素 transform-rotate旋转过渡旋转动画 参考文章 文档 https://developer.mozilla.org/zh-CN/docs/Web/CSS/transform 语法 /* Keyword values */ transform: none;/* Function values */ transform: matrix(1, 2, 3, 4, 5, 6); transform: translate…...

如何理解AutoGPT

AutoGPT和GPT-4都是OpenAI公司的产品。AutoGPT是一个实验性开源应用程序,展示了GPT-4语言模型的能力。GPT-4是OpenAI研发的人工智能语言模型。 AutoGPT在GitHub主页上有151k星(151k星代表了151,000个用户点赞了该项目),AutoGPT获…...

【网络知识必知必会】聊聊网络层IP协议

文章目录 前言IP 协议格式总结 前言 在之前的博文中, 我们聊过了传输层中的两个重点协议 TCP 和 UDP, 本文我们再来聊聊网络层中的一个协议IP, 简单认识一下 IP 协议格式. IP 协议与 TCP 协议的复杂度也不妨多让, 不过我们在这里只是简单的聊一聊 IP 协议的报文格式就行, 毕竟…...

66. 加一

给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。 最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。 你可以假设除了整数 0 之外,这个整数不会以零开头。 示例 1: 输入: digits …...

逻辑(css3)_强制不换行

需求 如上图做一个跑马灯数据,时间、地点、姓名、提示文本字数都不是固定的。 逻辑思想 个人想法是给四个文本均设置宽度,不然会出现不能左对齐的现象。 此时四个文本均左对齐, 垂直排列样式也比较好看,但是出现一个缺点&#…...

营收净利双降、股价下跌四成,敷尔佳带伤闯关“双11”

今年双11预售已经开启,敷尔佳在天猫、抖音等电商平台火热营销;营销热业绩冷,敷尔佳的三季报不及预期。 10月23日,哈尔滨敷尔佳科技发展有限公司(下称“敷尔佳”,301371SZ)公布2023年三季报,其三季度营收净…...

C语言KR圣经笔记 2.8自增和自减 2.9位运算 2.10赋值

2.8 自增和自减操作符 C提供了两个不同寻常的操作符,用于对变量进行自增和自减。自增操作符对操作数加上1,而自减操作符 -- 对操作数减去1。我们已经频繁使用 对变量进行自增,如: if (c \n)nl; 不寻常之处在于 和 -- 既能用作…...

PHP的Excel导出与导入

下载地址(注意php版本大于7.3可能会报错) GitHub - PHPOffice/PHPExcel: ARCHIVED 解压 1、导出 Excel $data[[name>a,age>11],[name>b,age>22],[name>d,age>33], ]; $fileds["name">"名称","age"…...

Ubuntu自建git服务器

Ubuntu 安装 gitlab-ce sudo apt-get update sudo apt-get install gitlab-ce 安装成功 sudo apt-get install gitlab-ce 正在读取软件包列表... 完成 正在分析软件包的依赖关系树 正在读取状态信息... 完成 下列【新】软件包将被安装:gitlab-ce 升…...

【面试专题】并发编程篇①

📃个人主页:个人主页 🔥系列专栏:Java面试专题 1.线程和进程的区别 线程和进程都是操作系统中的概念,它们的主要区别如下: 资源分配:进程是操作系统中的资源分配的基本单位,每个进程…...

Linux Centos7安装后,无法查询到IP地址,无ens0,只有lo和ens33的解决方案

文章目录 前言1 查看network-scripts目录2 创建并配置 ifcfg-ens33 文件3 禁用NetworkManager4 重新启动网络服务总结 前言 在VMware中,安装Linux centos7操作系统后,想查询本机的IP地址,执行ifconfig命令 ifconfig结果如下: 结…...

行为型模式-访问者模式

在访问者模式中,我们使用了一个访问者类,它改变了元素类的执行算法。通过这种方式,元素的执行算法可以随着访问者改变而改变。这种类型的设计模式属于行为型模式。根据模式,元素对象已接受访问者对象,这样访问者对象就…...

go-kit中如何开启websocket服务

在Go-Kit中,可以使用github.com/go-kit/kit/transport/http包来开启WebSocket服务。以下是一个简单的示例代码,演示了如何在Go-Kit中开启WebSocket服务: package mainimport ("context""fmt""net/http""…...

私有网络的安全保障,WorkPlus Meet内网视频会议助力企业高效会议

在企业内部沟通与协作中,视频会议成为了一种必不可少的沟通方式。然而,传统的互联网视频会议往往受制于网络不稳定因素,给企业带来不便与困扰。WorkPlus Meet作为一款专注内网视频会议的软件,致力于为企业打造高效、稳定的内网视频…...

国际权威媒体聚焦:孙宇晨和波场TRON在迪拜荣获加密行业重磅奖项

近日,在迪拜举行的区块链生态大会(Blockchain Life Conference)上,波场TRON创始人、火币HTX全球顾问委员会委员孙宇晨斩获“年度加密企业家”称号,波场TRON荣膺“年度最佳 Layer 1”大奖。这一消息迅速得到彭博社、雅虎财经、美联社和法国最大媒体之一Le Figaro等国际权威媒体的…...

新闻详情。

<!DOCTYPE html> <html><head><title>新闻</title><meta http-equiv"content-type" content"text/html; charsetutf-8"/><meta name"apple-mobile-web-app-capable" content"yes"/><lin…...

Java面试题-Redis-第二天(Redis持久化、过期键删除策略、内存淘汰策略)

目录 一、Redis持久化机制 二、Redis过期键删除策略 三、Redis内存淘汰策略 一、Redis持久化机制 为了能重用Redis数据&#xff0c;防止系统故障造成数据丢失&#xff0c;我们就需要将Redis中的数据写入到磁盘中&#xff0c;也就是持久化 1. 有哪些方式 有rdb和aof两种方式…...

ElasticSearch快速入门实战

全文检索 什么是全文检索 全文检索是一种通过对文本内容进行全面索引和搜索的技术。它可以快速地在大量文本数据中查找包含特定关键词或短语的文档&#xff0c;并返回相关的搜索结果。全文检索广泛应用于各种信息管理系统和应用中&#xff0c;如搜索引擎、文档管理系统、电子…...

揭秘MySQL数据同步至Elasticsearch的最佳方案与技巧

本文介绍下当前常见的场景之一&#xff1a;Mysql数据同步Elasticsearch的实现方案&#xff0c;这里以电商为例&#xff0c;其实所有相关搜索内容都可以使用此方案。 对于搜索&#xff0c;应该是所有APP必备的基础功能&#xff0c;不同时期有不同的解决方案&#xff0c;本次重点…...

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周&#xff0c;有很多同学在写期末Java web作业时&#xff0c;运行tomcat出现乱码问题&#xff0c;经过多次解决与研究&#xff0c;我做了如下整理&#xff1a; 原因&#xff1a; IDEA本身编码与tomcat的编码与Windows编码不同导致&#xff0c;Windows 系统控制台…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查

在对接支付宝API的时候&#xff0c;遇到了一些问题&#xff0c;记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

golang循环变量捕获问题​​

在 Go 语言中&#xff0c;当在循环中启动协程&#xff08;goroutine&#xff09;时&#xff0c;如果在协程闭包中直接引用循环变量&#xff0c;可能会遇到一个常见的陷阱 - ​​循环变量捕获问题​​。让我详细解释一下&#xff1a; 问题背景 看这个代码片段&#xff1a; fo…...

Xshell远程连接Kali(默认 | 私钥)Note版

前言:xshell远程连接&#xff0c;私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

3.3.1_1 检错编码(奇偶校验码)

从这节课开始&#xff0c;我们会探讨数据链路层的差错控制功能&#xff0c;差错控制功能的主要目标是要发现并且解决一个帧内部的位错误&#xff0c;我们需要使用特殊的编码技术去发现帧内部的位错误&#xff0c;当我们发现位错误之后&#xff0c;通常来说有两种解决方案。第一…...

CMake基础:构建流程详解

目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

大语言模型如何处理长文本?常用文本分割技术详解

为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

Python实现prophet 理论及参数优化

文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候&#xff0c;写过一篇简单实现&#xff0c;后期随着对该模型的深入研究&#xff0c;本次记录涉及到prophet 的公式以及参数调优&#xff0c;从公式可以更直观…...

Android15默认授权浮窗权限

我们经常有那种需求&#xff0c;客户需要定制的apk集成在ROM中&#xff0c;并且默认授予其【显示在其他应用的上层】权限&#xff0c;也就是我们常说的浮窗权限&#xff0c;那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...