数据结构绪论

小郝不负流年
小郝不负流年   + 关注
2020-12-10 19:34:44   阅读576   评论0

1、数据结构起源

早期计算机被理解为数值计算工具,但是我们还有一些非数值的计算,因此需要一些更科学有效的手段(比如表、树、图等数据结构)的帮助来处理问题。所以数据结构是一门研究非数值计算的程序设计问题中的操作对象以及它们之间的关系和操作等相关问题的学科。

2、基本概念和术语

2.1 数据

数据:是描述客观事物的符号,是计算机中可以操作的对象,是能够被计算机识别,并能输入给计算机处理的符号集合。

数据不仅包括整型、实型等数值类型,还包括字符、声音、图像、视频等非数值类型。

我们所说的数据,其实就是符号,但是这个符号需要满足两点:

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

2.2 数据元素

数据元素,也被称为记录。是组成数据的、具有一定意义的基本单位。

比如,在人类中,人就是数据元素。在禽类中,猪狗牛羊等动物就是禽类的数据元素。

2.3 数据项

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

比如 人这个数据元素,就可以有眼、耳、鼻等数据项,也可以有姓名、年龄等数据项。具体有哪些数据项是视你所做的系统来决定。

数据项是数据不可分割的最小单位。但注意真正讨论问题时,数据元素才是数据结构中建立数据模型的着眼点。就像我们讨论一个电影,通常是讨论角色这个“数据元素”,而不是讨论角色的姓名、年龄这些“数据项”。

2.4 数据对象

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

性质相同:是指数据元素具有相同数量和类型的数据项。比如人都有眼、耳、鼻、姓名、年龄等数据项。

2.5 数据结构

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

编写一个好的程序,必须要先分析待处理对象的特性以及各处理对象之间的关系,这也就是研究数据结构的意义所在。

3、逻辑结构和物理结构

3.1 逻辑结构

逻辑结构:是指数据对象中数据元素之间的关系。逻辑结构是针对具体问题的,是为了解决某个问题,在对问题理解的基础上,选择合适的数据结构来表示数据元素之间的逻辑关系,这也是我们今后最需要关注的。逻辑结构分为4种:集合结构、线性结构、树形结构、图形结构。

3.1.1 集合结构

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

数据结构中的集合关系类似数学中的集合,如下图

3.1.2 线性结构

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

3.1.3 树形结构

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

3.1.4 图形结构

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

3.1.5 逻辑结构示意图注意点

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

3.2 物理结构

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

数据的存储结构应正确反映数据元素之间的逻辑关系。

数据元素的存储结构形式有2种:顺序存储结构、链式存储结构。

3.2.1 顺序存储结构

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

我们java语言中的数组,就是这样的顺序存储结构。

3.2.2 链式存储结构

链式存储结构:是把数据元素放到任意的存储单元里面,这组存储单元可以是连续的,也可以是不连续的。数据元素的存储关系并不能反映其逻辑关系,因此需要用一个指针来存放数据元素的地址,这样通过地址就可以找到相关联的数据元素的位置了。

显然,链式存储就很灵活,数据随便存储在哪里都不重要,只要有一个指针存放了相应的地址就能找到它了。

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

4、抽象数据类型

4.1 数据类型

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

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

在Java语言中,数据类型可以分类两类:

  • 基本数据类型:整型、浮点型、字符型(单个字符char)等
  • 引用(复杂)数据类型:类、接口、数组;注意字符串用String表示,它是类,是复杂数据类型,不是基本数据类型。

4.2 抽象数据类型

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

抽象数据类型(Abstract Data Type, ADT):是指一个数学模型及定义在该模型上的一组操作。抽象数据类型的定义仅取决于它的一组逻辑特性,而与其在计算机内部如何表示和实现无关。

抽象数据类型不仅仅指那些已经定义并实现的数据类型,还可以是编程者在软件设计中自己定义的数据类型,比如我们绘图的坐标,x,y,z始终一起出现,我们就可以定义一个叫point的抽象数据类型,它有x,y,z三个整型变量,这样我们可以很方便的操作一个point数据变量就能知道这个一点的坐标了。

一个抽象数据类型定义了:一个数据对象、数据对象中各数据元素之间的关系及对数据元素的操作。

对我有用,我要     转载  
文章分类: 数据结构/算法  
所属标签: 数据结构  
  • 0条评论
  • 只看作者
  • 按时间|按热度
  • 由于本人多次涉及需要打印这个证明,而每次都会忘记入口,在网上各种搜索各种摸索很是浪费时间。故本次将操作流程整理记录下来,以备忘。同时也分享给大家。1、打开湖北政务服务网,地址:http://zwfw.hubei.gov.cn/s/index.html2、切换区域到“武汉市”3、在“特色服务”模块找到“(个人)武汉市社会保险公共服务平台”4、进入“(个人)武汉市社会保险公共服务平台”,登录账号密码<imgsrc="https://cdnstatic.hoscen.cn/blog/article/184053017752895488/img/497065960be44747825acb86a17483c1.png"style=
  • 如何使用postman模拟http发送xml参数报文的POST请求?1、postman工具通过安装软件或使用谷歌插件都可以,这里不再赘述。2、配置postman,选择POST,填写URL;切换到Headers,添加Content-Type:text/xml 3、切换到body,选择raw,XML,下方填写你的请求报文4、点击Send发送请求,如图可以看到响应状态、时间、结果等信息5、讲到这里就结束了,是不是学会了?快去试试吧!
  • 很多时候我们需要Linux服务器定时去运行一个脚本来触发一个操作,比如写缓存数据到硬盘、定时备份、定时重启服务、定期清除日志等。下面就简单讲解一下Linuxcrontab命令如何实现自动循环执行shell脚本。一、准备shell脚本比如我们准备一个hello.shvim/hcn/sh/hello.sh#!/bin/bash  DATETIME=$(date"+%Y%m%d%H%M%S") echo"hello, www.hoscen.cn,时间:${DATETIME}"  通过chmod命令赋予该脚本的执行权限chmod755hello.sh测试正确性二、开启crontab服务 linux应该都有crontab,没有的话可以安装一下:yuminstall vixie-cronyuminstall crontabsvixie-cron软
  • 下载地址:https://adoptopenjdk.net/releases.html?variant=openjdk8&jvmVariant=hotspot选择文件类型:或者,你可以通过我的百度网盘分享直接获取:链接:https://pan.baidu.com/s/1UygOdTh6WNZyS5WP_API6w 提取码:phnh 注意:我这里是下载的32的jdk,你们如果要64位请下载64的。使用:使用上和OracleJDK使用上是没有区别的。区别:1.OracleJDK⼤概每6个⽉发⼀次主要版本,⽽OpenJDK版本⼤概每三个⽉发布⼀次。但这不是固定的,我觉得了解这个没啥⽤处。详情参⻅:https://blogs.oracle.com/java-platform-group/update-and-faq-on-the-java-se-release-cadence。 2.OpenJDK是⼀个参考模型并且是完全开源的,⽽OracleJDK是OpenJDK的⼀个实现,并不是完全开源的; 3.OracleJDK⽐OpenJDK更稳定。OpenJDK和OracleJDK的代码⼏乎相同,但OracleJDK有更多的类和⼀些错误修复。因此,如果您
  • 目录:1、安装node.js环境2、安装cnpm3、安装vue-cli脚手架构建工具4、用vue-cli构建项目5、安装项目所需的依赖6、项目运行7、项目打包1、安装node.js环境下载地址:https://nodejs.org/zh-cn/安装过程没有太多好说的,安装完成后 win+R打开命令行输入node -v , 如图,出现版本号说明安装成功。npm包管理器是集成在node中的 , npm -v可以查看版本2、安装cnpm由于有些npm有些资源被屏蔽或者是国外资源的原因,经常会导致用npm安装依赖包的时
  • 本文讲触发el-dialog前动态修改窗口title的方法。1、el-dialog添加title属性el-dialog :title="titleType+'菜单'" :visible.sync="dialogVisible" width="800px" >el-dialog>  2、初始化变量(titleType,名称自己定义)export&
  • Failedtoloadprojectconfiguration:cannotparsefileF:/xx/.idea/modules.xml:ParseErrorat[row,col]:[1,1]Message:文件提前结束。解决办法:关闭idea,删掉这个文件,重新打开idea
  • 一般我们在使用CDN时都设置有缓存时间,当源站资源发生变更后,如果缓存时间没到,那么用户访问的依旧是变更前的数据,虽说又拍云控制台提供了缓存刷新功能界面,但是每次都手动去刷新显示不太理想,当然又拍云也想到了这一点,提供给我们有API可以调用。本篇文章就是讲解如何接入又拍云缓存刷新API。网站免费接入又拍云CDN的方法,请查看我另外一篇文章,地址: https://www.hoscen.cn/blog/hao/articles/204022774975430656.html又拍云API文档:https://api.upyun.com/doc#/api/guide/overview看完文档,我们会知道又拍云提供有两个缓存刷新接口,一个支持通配符(但次数有限),一个是完整url刷新。同时注意调用接口时将 Token 放入 HTTP Header 中 。那么我们需要3个接口:1、获取token2、URL刷新3、缓存批量刷新详细请求参数和响应值请查看文档。话不多说,我们直接放上核心代码1、获取token2、URL刷新<img src="https://cdnstatic.hoscen.cn/blog/article/
  • 介绍为了支持异步处理,在Servlet3.0中,在ServletRequest上提供了startAsync()方法配置SpringMVC支持异步配置springmvc-servlet.xml:  mvc:annotation-driven>     mvc:async-support default-timeout="5000"/>   mvc:annotation-driven><
  • 建立服务器内网其他IP端口的隧道,可以将远程的服务映射到本地进行访问。finalshell配置隧道方法: