数据结构学习笔记

参考教材:数据结构C语言版(严蔚敏,杨伟民编著)

参考课程:青岛大学王卓老师:数据结构与算法基础

思维导图:XMind、幕布         

正在备考,结合自身空闲时间,不定时更新,会在里面加入一些真题帮助理解数据结构

第一章:绪论

1.1基本概念和术语

数据(data):

什么是数据?

1.数据是信息的载体,是对客观事物的符号表示。

2.能输入到计算机并被计算机程序处理的符号的总称(能被计算机识别、存储和加工)。

数值型数据:整数、实数。

非数值型数据:图像、声音、文字等。

数据元素(data element):

定义

数据元素是组成数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理。

数据元素也称元素、记录、结点、顶点。

数据元素与数据的关系

数据元素是集合(数据)的个体。

数据项

一个数据元素可由若干个数据项组成。数据项是构成数据元素不可分割的最小单位。

数据对象(data object):

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

数据对象与数据的关系

数据对象是集合(数据)的子集

数据、数据对象、数据元素、数据项四者关系:

数据 ≥ 数据对象 > 数据元素 > 数据项

数据是由数据元素组成,数据元素是由数据项组成

数据结构(data structure):

定义

Data Structure=(D,S):D是数据元素的有限集,S是D上关系的有限集

(2015中国石油大学)数据结构的定义为(D,S),其中D是(数据元素)的集合。

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

结构:数据元素之间的关系 

(2013中科大)数据结构是具有结构的数据对象(X)

解析:这个说法有些模糊,通常数据结构是计算机存储、组织数据的方式,它不仅仅是一个“具有结构的数据对象”,还涉及到数据的运算和操作。数据结构包括数据的逻辑结构数据的物理存储结构以及数据上定义的操作。所以,仅仅说数据结构“数据结构是具有结构的数据对象”是不全面的。

数据结构的三要素

一、逻辑结构

数据的逻辑结构:数据元素之间的逻辑关系(2013中科大)。逻辑结构独立于计算机,与数据的存储无关。

(2019广东工业大学)与数据元素本身的形式、相对位置和个数无关的是数据逻辑结构

解析:所谓数据的逻辑结构,是指反映数据元素之间逻辑关系的数据结构;

所谓数据的存储结构,是指数据的逻辑结构在计算机存储空间中的存放形式,与数据元素本身的形式、相对位置和个数有关,逻辑结构与物理存储无关

逻辑结构的种类

(一)线性结构:线性表,栈,队列,双队列,串(一维数组)

一对一:结构中的数据元素之之间存在一个对一个的关系,有且仅有一个开始和一个终端点。

第一个元素外,其他元素有且只有一个前趋

最后一个元素外,其他元素有且只有一个后继

(二)非线性结构:树形结构、图状结构(网状结构)、二叉树

一个结点可能有多个直接前趋和直接后继

①树形结构:一对多

结构中的数据元素之间存在一个对多个的关系。

②图状结构(网状结构):多对多

结构中的数据元素之间存在多个对多个的关系。

(三)其他结构:集合

①集合:也可用其他结构来表示

​  

结构中的数据元素之间除了“同属于一个集合”的关系外,别无其他关系

(2013中科大)数据的逻辑结构与数据元素本身的内容和形式无关

数据的逻辑结构只关心数据之间的逻辑关系,而不关心数据元素本身的内容和形式。 

二、物理结构(存储结构)

数据元素及其关系(数据结构)在计算机中的表示(又称映象)称为数据的物理结构或存储结构

四种基本的存储结构

(一)顺序存储结构(重点

用一组地址连续的存储单元依次存储线性表的各个数据元素,数据元素之间的逻辑关系由元素的存储位置来表示

C语言中用数组来实现顺序存储结构

优点:节省存储空间。
缺点:不便于修改,对结点的插入、删除运算时,可能要移动一系列的结点。

(二)链式存储结构(重点

用一组任意的存储单元存储线性表的数据元素,各个元素之间的关系用指针来表示(这组存储单元可以是连续的,也可以是不连续的)。指针————地址

(三)索引存储结构(了解

在存储结点信息的同时,还建立附加的索引表。索引——index

索引表的每一项都是索引项

索引项的一般形式是:(关键字、地址

关键字:可以区分不同数据元素的数据项

例:下方的通讯录就是一个索引表

(四)散列存储结构(哈希存储)(了解

根据元素的关键字直接计算出该元素的存储地址,也称哈希(Hash)存储

三、逻辑结构与存储结构的关系 

1.存储结构是逻辑关系的映象与元素本身的映象。

2.逻辑结构是数据结构的抽象,存储结构是数据结构的实现。

3.两者综合建立了数据元素之间的结构关系

四、数据的运算和实现

施加在

运算:针对逻辑结构,指出运算的功能

运算的实现:针对存储结构,指出运算的具体操作步骤。

针对不同的存储结构,对应的运算实现方式也不一样。

数据类型:

数据类型就是一组性质相同的值的集合以及定义于这个值集合上的一组操作的总称。

数据类型=值的集合+值集合上的一组操作

C语言中基本数据类型:

整型:int    长整型:long int        短整型:short int      

浮点型(单精度):float   浮点型(双精度):double   字符型:char  布尔型:bool

不同类型的变量,其所能取的值的范围不同,所能进行的操作不同。

例如:bool类型的值为:true、false。可进行的操作:与、或、非...

作用:

约束变量或常量的取值范围;约束变量或常量的操作

抽象数据类型(ADT):

抽象数据类型是指一个数学模型以及定义在此数学模型上的一组操作。与其在计算机内部如何表示无关,即不论其内部结构如何变化,只要它的数学特性不变,都不影响其外部的使用。

抽象数据类型的形式定义

用三元组表示(D,S,P):D是数据对象S是D上的关系集P是对D的基本操作集

定义抽象数据类型:

ADT抽象数据类型名{数据对象:<数据对象的定义>数据关系:<数据关系的定义>基本操作:<基本操作的定义>
}ADT抽象数据类型

数据对象和数据关系的定义用伪码(伪代码)描述。

基本操作的定义格式为:

基本操作名(参数表)初始条件:<初始条件描述>操作结果:<操作结果描述>

赋值参数只为操作提供输入值

引用参数&打头,除了可以提供输入值,还将返回操作结果。

1.2算法与算法分析

1.2.1算法(algorithm)

算法就是对特定问题求解步方法和步骤的一种描述,是指令的有限序列,其中每一条指令表示一个或多个操作。

说白了算法就是解决问题的方法和步骤,第一步要怎么做,第二步要怎么做,第三部要怎么做......
然后列出指令的这样一个序列。
例如:
step1:xxx
step2:xxx
step3:xxx
....    ...

1.2.2算法的描述

自然语言:英文、中文

流程图:传统流程图、NS流程图

伪代码:类语言:类C语言(与C语言类似,但缺少了一些必要的语法细节)

程序代码:C语言程序、Java程序......

举例:

自然语言:

举例:用算法求一元二次方程的根
1.输入方程的系数a、b、c
2.判断a是否等于0,如果等于0,则提示不是一元二次方程;不等于0执行第三步
3.计算△=b²-4ac
4.判断△,如果△=0,计算并输出两个相等实根;如果△<0,输出没有实根;如果△>0,输出不等实根
5.结束

传统流程图:

NS流程图:

1.2.3算法与程序 

 算法是解决问题的一种方法或一个过程,考虑如何将输入转换成输出,一个问题可以有多种算法   程序是用某种程序设计语言对算法的具体实现。

程序  =  数据结构  +  算法

数据结构通过算法来实现操作,算法根据数据结构设计程序。

1.2.4算法的5个重要特征

(1)有穷性

一个算法必须总是(对任何合法的输入值)在执行有穷步之后结束,且每一步都可在有穷时间内完成。(不能是无穷)

(2)确定性

算法中的每一条指令都必须有确切的含义,无二义性。任何条件下,算法只有唯一的一条执行路径,对于相同的输入只能得出相同的输出。

(3)可行性

一个算法是能行的,可以执行的。算法中描述的操作都可以通过已经实现的基本运算执行有限次来实现的。

(4)输入

一个算法有零个(因为有时候本身自带了输入)或多个的输入,这些输入取自于某个特定的对象的集合。

(5)输出

一个算法有一个多个的输出,这些输出是同输入有着某些特定关系的量。

1.2.5算法设计的要求

(1)正确性(Correctness)

算法应当满足具体问题的需求。程序对于精心选择的典型苛刻而带有刁难性的几组输入数据能够得出满足规格说明要求的结果。

(2)可读性(Readability)

可读性好有助于人对算法的理解,算法主要是为了人的阅读与交流,如果算法晦涩难懂,乱七八糟,很难理解,往往会隐藏很多错误,难以调试与修改

(3)健壮性(Robustness)

输出数据非法时,算法也能适当的做出反应或进行处理,而不会产生莫名其妙的输出结果。处理出错的方法,不应该是打印错误信息或异常,并中止程序的执行,而是返回一个表示错误或错误性质的值

所以,我们要事先预料到可能会出现的问题和错误,事先进行判断,如果有事先处理错误的判断,那么这样的算法就是健壮性好的

(4)效率与低存储量需求(高效率Efficiency)

花尽量少的时间和尽量低的存储需求

效率:算法执行的时间。        存储量需求:算法执行过程中所需的最大存储空间。

对于同一个问题如果有多个算法可以解决,执行时间短的算法效率高。

一个好的算法首先要具备正确性,然后是健壮性,可读性,在这几个方面都满足的情况下,主要考虑算法的效率,通过算法的效率高低来评判不同算法的优劣程度 。

算法的效率:时间效率、空间效率

时间效率算法所耗的时间        空间效率:算法执行过程中所耗的存储空间

时间效率和空间效率有时是矛盾的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/341089.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Three.js的阴影技术,创建逼真效果的必备!

three.js是一个流行的用于创建和展示3D图形的JavaScript库&#xff0c;它提供了多种阴影技术来增强3D场景的真实感和视觉效果。 一、常用阴影技术 1. 基于光线的阴影&#xff08;Raytraced Shadows&#xff09;&#xff1a;通过跟踪光线的路径来计算阴影&#xff0c;产生非常…

大数据之CDH对Hdfs做Balance数据均衡/数据平衡/数据倾斜

问题的来源: 由于在hive工具运行sql,出现sql卡顿的情况,去cdh上查看yarn资源的分布情况,发现了整个cdh平台中hdfs和yarn资源分布不均匀,大量的爆红显示: 以下 DataNode 数据目录 位于小于其可用空间 10.0 吉字节 的文件系统中。 /data1/dfs/dn&#xff08;可用&#xff1a;7.2 …

Python爬虫协程批量下载图片

import aiofiles import aiohttp import asyncio import requests from lxml import etree from aiohttp import TCPConnectorclass Spider:def __init__(self, value):# 起始urlself.start_url value# 下载单个图片staticmethodasync def download_one(url):name url[0].spl…

SpringCloud 微服务中网关如何记录请求响应日志?

在基于SpringCloud开发的微服务中&#xff0c;我们一般会选择在网关层记录请求和响应日志&#xff0c;并将其收集到ELK中用作查询和分析。 今天我们就来看看如何实现此功能。 日志实体类 首先我们在网关中定义一个日志实体&#xff0c;用于组装日志对象 Data public class …

第九十七节 Java面向对象设计 - Java Object.Finalize方法

Java面向对象设计 - Java Object.Finalize方法 Java提供了一种在对象即将被销毁时执行资源释放的方法。 在Java中&#xff0c;我们创建对象&#xff0c;但是我们不能销毁对象。 JVM运行一个称为垃圾收集器的低优先级特殊任务来销毁不再引用的所有对象。 垃圾回收器给我们一个…

函数计数和跟踪 --- console的count和trace方法

新学到一个小方法&#xff0c;分享一下哦。 使用 console 对象的 trace ⽅法在控制台上输出当前的调用栈&#xff0c;可以追踪⼀个函数的执⾏过程。 当我们想要了解一个函数是如何被其他函数调用的&#xff0c;或者想要查看调用栈中的其他信息时&#xff0c;这个方法非常有用…

Cadence Virtuoso IC617 系统内存清理

1、清空simelation和垃圾箱下的文件 2、在虚拟机磁盘路径下&#xff0c;例如/home下面输入 cat /dev/zero > zero.fill;sync;sleep 1;sync;rm -f zero.fill 3、在windows下winR ->cmd 找到VMware安装目录和系统存放目录 Microsoft Windows [版本 10.0.19045.4412] (c…

/etc/fstab、/etc/mtab 文件详解及永久挂载(文件系统、ISO镜像、文件网络共享)

/etc/mtab /etc/mtab 是当前的分区挂载情况&#xff0c;记录的是当前系统已挂载的分区。每次挂载/卸载分区时会更新 /etc/mtab 文件中的信息&#xff08;执行 mount 命令会改变 /etc/mtab 的信息&#xff09;。 文件样例 /etc/fstab 系统开机时会主动读取 /etc/fstab 这个文…

网络服务ftp实验

网络服务之ftp vsftpd的安装和配置 rpm -qc vsftpd #检查vsftpd安装包是否存在&#xff0c;存在即不需要安装 yum install -y vsftpd #yum 安装vsftpdcd /etc/vsftpd ls #切换到安装好vsftpd目录下查看文件cp vsftpd.conf vsftpd.conf.bak.20240604 #将vsftpd的…

数据库开发-Mysql03

目录 1. 多表查询 1.1 概述 1.1.1 数据准备 1.1.2 介绍 1.1.3 分类 1.2 内连接 1.3 外连接 1.4 子查询 1.4.1 介绍 1.4.2 标量子查询 1.4.3 列子查询 1.4.4 行子查询 1.4.5 表子查询 1.5 案例 2. 事务 2.1 介绍 2.2 操作 2.3 四大特性 3. 索引 3.1 介绍 3…

算法人生(18):从神经网络的“剪枝策略”看“怎么找回时间”

IT人的工作和生活难平衡这事&#xff0c;到底要怎么解决呢&#xff0c;让我们从神经网络的“剪枝策略”中找点灵感吧&#xff01; 剪枝策略是指训练和优化深度神经网络时采取的一种技术&#xff0c;从名字就知道&#xff0c;它就像修剪树木一样&#xff0c;去除不必要的枝叶&a…

《平渊》· 捌 —— 「庄子」山木篇中的 “空船效应”

《平渊》 捌 "若能虚己以游世&#xff0c;其孰能害之&#xff1f;" "方舟而济于河&#xff0c;有虚船来触舟&#xff0c;虽有惼心之人而不怒&#xff1b;有一人子其上&#xff0c;则呼张歙之&#xff1b;一呼而不闻&#xff0c;再呼而不闻&#xff0c;于是三呼邪…

Linux C语言学习:数据类型

一、 为什么要引入数据类型 • 计算机中每个字节都有一个地址&#xff08;类似门牌号&#xff09; • CPU通过 地址 来访问这个字节的空间 0x20001103 1 0 0 1 0 0 1 1 0x20001102 1 1 1 0 1 1 1 0 0x20001101 1 1 1 1 0 1 0 1 0x20001100 0 …

STM32 MDK Keil5软件调试功能使用(无需连接硬件)

MDK Keil5 在线仿真STM32&#xff08;无需连接硬件&#xff09; 首先点击工具栏的魔术棒配置一下&#xff1a;&#xff08;记得选择自己的STM32芯片类型&#xff09; 开启调试 使用逻辑分析仪查看IO输出 会打开这个界面&#xff0c;点击左边的setup按钮 会打开这个窗口&am…

Golang | Leetcode Golang题解之第119题杨辉三角II

题目&#xff1a; 题解&#xff1a; func getRow(rowIndex int) []int {row : make([]int, rowIndex1)row[0] 1for i : 1; i < rowIndex; i {row[i] row[i-1] * (rowIndex - i 1) / i}return row }

npm install pubsub-js报错的解决汇总

我在练习谷粒商城P83时&#xff0c;选择分类时触发向后端请求选择分类catId绑定的品牌数据&#xff0c;发现前端控制台报错&#xff1a; "PubSub is not definded",找不到pubsub。 因为缺少pubsub包&#xff0c;所以开始安装此包。 于是在网上一顿搜索猛如虎&…

理解NSCopying协议

NSCopying 协议用于让对象能够被复制。实现这个协议的类需要定义如何创建该对象的副本。这个副本是独立的&#xff0c;不会与原对象共享内存地址。 为什么需要 NSCopying 协议&#xff1f; 当你需要复制对象时&#xff0c;例如将对象存储到一个集合&#xff08;如数组、字典&…

如何规避亚马逊测评的风险?

国外的真实刷手和服务商的账号风险主要是表现在以下几点&#xff1a; 1. 账号资源的重复利用&#xff0c;下单的产品上一秒高端品牌&#xff0c;下一秒地摊货&#xff0c;对账号的标签定位不清晰 2. 留Review的时间周期长 3. 账号的质量会参差不齐&#xff0c;有的上不了评价…

INT202 例题

算法复杂度 O(n)&#xff1a;表示算法的渐进上界。如果一个算法的运行时间是O(n)&#xff0c;那么它的运行时间最多与输入规模n成正比。换句话说&#xff0c;当输入规模n增加时&#xff0c;算法的运行时间不会超过某个常数倍的n。比如&#xff0c;如果一个算法的时间复杂度是O(…

CHATGPT升级plus(已有账号前提下)

注册wildcard(虚拟卡) 注册号账号后先进行充值&#xff0c;充值后选择CHATGPT一键升级按照他的流程来即可 Wildcard网址&#xff1a;Wildcard跳转注册 填写邀请码充值时少两美金合计14&#xffe5; 邀请码&#xff1a;OL3QXTRH