数据结构笔记-第一章 绪论

第一章 绪论

1、基本概念和术语:

1.1 数据、数据元素、数据项和数据对象:

  1. 数据(Data)是客观事物的符号表示,是所有能输入到计算机中并能被计算机程序处理的符号的总称(集合)。是信息的载体;是对客观事物的符号化表示;可以被计算机识别、存储和加工。数据不仅仅包含整型、实型等数值类型,还包含图形、图像、声音、视频及动画等非数值类型
    对于整型、实型等数值类型,可以进行数值计算
    对于字符数据类型,就需要进行非数值的处理。而声音、图像、视频等其实是可以通过编码的手段变成字符数据来处理的。
  2. 数据元素(DataElement)是数据的基本单位,在计算机中通常作为一个整体进行考虑和处理。在某些情况下,数据元素也称为元素、记录、节点、顶点等。
  3. 数据项(Data Item)是组成数据元素的、有独立含义的、不可分割的最小单位。例如,学生基本信息表中的学号、姓名、性别等都是数据项。【数据项是数据的最小单位。但真正讨论问题时,数据元素才是数据结构中建立数据模型的着眼点。就像我们讨论一部电影时,是讨论这部电影角色这样的数据元素”,而不是针对这个角色的姓名或者年龄这样的“数据项”去研究分析。】
    数据项和数据元素
  4. 数据对象(DataObject)是性质相同的数据元素的集合,是数据的一个子集。例如:整数数据对象是集合N={0, ±1,±2,…}, 字母字符数据对象是集合C={‘A’,‘B’, …‘Z’,‘a’,‘b’, …, ‘z’}, 学生基本信息表也可以是一个数据对象。由此可以看出,不论数据元素集合是无限集(如整数集),或是有限集(如字母字符集),还是由多个数据项组成的复合数据元素(如学生表)的集合,只要集合内元素的性质均相同,都可称之为一个数据对象。

1.2 数据结构

数据结构(Data Structure)是相互之间存在一种或多种特定关系的数据元素的集合。换句话说,数据结构是带”结构“的数据元素的集合,“结构”就是指数据元素之间存在的关系
数据结构包括逻辑结构和存储结构两个层次。

1.2.1 逻辑结构

数据的逻辑结构是从逻辑关系上描述数据,它与数据的存储无关,是独立千计算机的。因此,数据的逻辑结构可以看作是从具体问题抽象出来的数学模型
数据的逻辑结构有两个要素: 一是数据元素;二是关系。数据元素的含义如前所述,关系是指数据元素间的逻辑关系。根据数据元素之间关系的不同特性, 通常有四类基本结构, 如图所示。它们的复杂程度依次递进。
在这里插入图片描述
下面四种结构中所举的示例是以某班级学生作为数据对象(数据元素是学生的学籍档案记录),来分别考察数据元素之间的关系。

  1. 集合结构
    数据元素之间除了“属于同一集合” 的关系外, 别无其他关系。例如, 确定一名学生是否为班级成员, 只需将班级看做一个集合结构。
  2. 线性结构
    数据元素之间存在一对一的关系。例如, 将学生信息数据按照其入学报到的时间先后顺序进行排列,将组成一个线性结构。
  3. 树结构
    数据元素之间存在一对多的关系。例如, 在班级的管理体系中,班长管理多个组长, 每位组长管理多名组员, 从而构成树形结构。
  4. ** 图结构或网状结构**
    数据元素之间存在多对多的关系。例如,多位同学之间的朋友关系, 任何两位同学都可以是朋友,从而构成图状结构或网状结构。
    其中集合结构、树结构和图结构都属千非线性结构。
    在这里插入图片描述
1.2.2 存储结构

数据对象在计算机中的存储表示称为数据的存储结构,也称为物理结构。把数据对象存储到计算机时,通常要求既要存储各数据元素的数据, 又要存储数据元素之间的逻辑关系,数据元素在计算机内用一个结点来表示。数据元素在计算机中有两种基本的存储结构,分别是顺序存储结构链式存储结构

  1. ** 顺序存储结构**
    顺序存储结构是借助元素在存储器中的相对位置来表示数据元素之间的逻辑关系,通常借助程序设计语言的数组类型来描述。
    在这里插入图片描述

  2. 链式存储结构
    顺序存储结构要求所有的元素依次存放在一片连续的存储空间中, 而链式存储结构,无需占用一整块存储空间。但为了表示结点之间的关系, 需要给每个结点附加指针字段,用千存放后继元素的存储地址。所以链式存储结构通常借助于程序设计语言的指针类型来描述。
    在这里插入图片描述

1.3 数据类型和抽象数据类型

1.3.1 数据类型

数据类型(Data Type) 是高级程序设计语言中的一个基本概念。类型明显或隐含地规定了数据的取值范围存储方式以及允许进行的运算,数据类型是一个值的集合和定义在这个值集上的一组操作的总称。

1.3.2 抽象数据类型

抽象就是抽取出实际问题的本质。在高级语言中,则给出更高一级的数据抽象,出现了数据类型,如整型、实型、字
符型等,可以进一步利用这些类型构造出线性表、栈、队列、树、图等复杂的抽象数据类型。
抽象数据类型(Abstract Data Type, ADT) 一般指由用户定义的、表示应用问题的数学模型,以及定义在这个模型上的一组操作的总称,具体包括三部分:数据对象、数据对象上关系的集合以及对数据对象的基本操作的集合。
在这里插入图片描述

2、抽象数据类型的表示与实现

抽象数据类型的概念与面向对象方法的思想是一致的。抽象数据类型独立于具体实现,将数据和操作封装在一起,使得用户程序只能通过抽象数据类型定义的某些操作来访问其中的数据,从而实现了信息隐藏。在C++中,我们可以用类的声明表示抽象数据类型,用类的实现来实现抽象数据类型。因此,C++中实现的类相当于数据的存储结构及其在存储结构上实现的对数据的操作。

3、算法和算法分析

3.1 算法的定义及特性

算法(Algorithm) 是为了解决某类问题而规定的一个有限长的操作序列。
一个算法必须满足以下五个重要特性。

  1. **有穷性。**一个算法必须总是在执行有穷步后结束,且每一步都必须在有穷时间内完成。
  2. **确定性。**对千每种情况下所应执行的操作,在算法中都有确切的规定,不会产生二义性,使算法的执行者或阅读者都能明确其含义及如何执行。
  3. **可行性。**算法中的所有操作都可以通过已经实现的基本操作运算执行有限次来实现。
  4. **输入。**一个算法有零个或多个输入。当用函数描述算法时,输入往往是通过形参表示的,在它们被调用时,从主调函数获得输入值。
  5. **输出。**一个算法有一个或多个输出,它们是算法进行信息加工后得到的结果,无输出的算法没有任何意义。当用函数描述算法时,输出多用返回值或引用类型的形参表示。

3.2 评价算法优劣的基本标准

一个算法的优劣应该从以下几方面来评价。

  1. **正确性。**在合理的数据输入下,能够在有限的运行时间内得到正确的结果。
  2. **可读性。**一个好的算法,首先应便千人们理解和相互交流, 其次才是机器可执行性。可读性强的算法有助于人们对算法的理解,而难懂的算法易千隐藏错误,且难千调试和修改。
  3. **健壮性。**当输入的数据非法时,好的算法能适当地做出正确反应或进行相应处理,而不会产生一些莫名其妙的输出结果。
  4. 高效性。高效性包括时间和空间两个方面。时间高效是指算法设计合理,执行效率高,可以用时间复杂度来度量;空间高效是指算法占用存储容量合理,可以用空间复杂度来度量。时间复杂度空间复杂度是衡量算法的两个主要指标。

3.3 算法的时间复杂度

衡量算法效率的方法主要有两类:事后统计法事前分析估算法。事后统计法需要先将算法实现,然后测算其时间和空间开销。这种方法的缺陷很显然,一是必须把算法转换成可执行的程序,二是时空开销的测算结果依赖于计算机的软硬件等环境因素,这容易掩盖算法本身的优劣。所以我们通常采用事前分析估算法,通过计算算法的渐近复杂度来衡量算法的效率。

  1. 问题规模和语句频度
  • 不考虑计算机的软硬件等环境因素,影响算法时间代价的最主要因素是问题规模。问题规模是算法求解问题输入量的多少,是问题大小的本质表示,一般用整数n表示。显然,n越大算法的执行时间越长
  • 一个算法的执行时间大致上等千其所有语句执行时间的总和, 而语句的执行时间则为该条语句的重复执行次数和执行一次所需时间的乘积。
  • 一条语句的重复执行次数称作语句频度(FrequencyCount)
  1. 算法的时间复杂度定义
  • 通常, 算法的执行时间是随问题规模增长而增长的, 因此对算法的评价通常只需考虑其随问题规模增长的趋势。这种情况下, 我们只需要考虑当问题规模充分大时, 算法中基本语句的执行次数在渐近意义下的阶。我们用"O"来表示数量级,记作T(n)= O(fn(n))。
  • 一般情况下, 算法中基本语句重复执行的次数是问题规模n的某个函数j(n), 算法的时间量度记作
    在这里插入图片描述
    它 表示随问题规模n的增大, 算法执行时间的增长率 和 f(n)的增长率相同, 称做算法的渐近时间复杂度, 简称时间复杂度(TimeComplexity)
  1. 算法的时间复杂度分析举例
    在这里插入图片描述
  • 常量阶
  • 线性阶
  • 平方阶
  • 立方阶
  • 对数阶

3.4 算法的空间复杂度

关千算法的存储空间需求,类似于算法的时间复杂度,我们采用渐近空间复杂度(Space Complexity)作为算法所需存储空间的量度,简称空间复杂度,它也是问题规模n的函数,记作:
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
R语言实战笔记第九章介绍了方差分析的内容。方差分析是一种用于比较两个或多个组之间差异的统计方法。在R语言中,可以使用lm函数进行方差分析的回归拟合。lm函数的基本用法是: myfit <- lm(I(Y^(a))~x I(x^2) I(log(x)) var ... [-1],data=dataframe 其中,Y代表因变量,x代表自变量,a代表指数,var代表其他可能对模型有影响的变量。lm函数可以拟合回归模型并提供相关分析结果。 在方差分析中,还需要进行数据诊断,以确保模型的可靠性。其中几个重要的诊断包括异常观测值、离群点和高杠杆值点。异常观测值对于回归分析来说非常重要,可以通过Q-Q图和outlierTest函数来检测。离群点在Q-Q图中表示落在置信区间之外的点,需要删除后重新拟合并再次进行显著性检验。高杠杆值点是指在自变量因子空间中的离群点,可以通过帽子统计量来识别。一般来说,帽子统计量高于均值的2到3倍即可标记为高杠杆值点。 此外,方差分析还需要关注正态性。可以使用car包的qqplot函数绘制Q-Q图,并通过线的位置来判断数据是否服从正态分布。落在置信区间内为优,落在置信区间之外为异常点,需要进行处理。还可以通过绘制学生化残差的直方图和密度图来评估正态性。 综上所述,R语言实战第九章介绍了方差分析及其相关的数据诊断方法,包括异常观测值、离群点、高杠杆值点和正态性检验。这些方法可以用于分析数据的可靠性和模型的适应性。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [R语言实战笔记--第八章 OLS回归分析](https://blog.csdn.net/gdyflxw/article/details/53870535)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值