首页 > 其他分享 >数据结构——第1章 绪论

数据结构——第1章 绪论

时间:2024-02-08 17:11:45浏览次数:31  
标签:存储 绪论 复杂度 元素 算法 抽象数据类型 数据结构 数据

目录

1.1 数据结构的研究内容

1.2 基本概念和术语

1.2.1 数据、··元素、··项和··对象

数据:是客观事物的符号表示,是所有能输入到计算机中并被计算机程序处理的符号的总称。

数据元素:是数据的基本单位,也称元素/记录,用于完整地描述一个对象。如学生表中的一名学生。

数据项:是组成数据元素的、有独立含义的、不可分割的最小单位。如学生基本信息表中的学号、姓名、性别等。

数据对象:是性质相同的数据元素的集合,是数据的一个子集。如整数数据对象、字母字符数据对象、由多个数据项组成的复合数据元素。

1.2.2 数据结构

数据结构是带“结构”的数据元素的集合,“结构”就是指数据元素之间存在的关系,包括逻辑结构和存储结构。

一、逻辑结构

从逻辑关系上描述数据,与数据的存储无关,独立于计算机,数据元素和关系两要素

  1. 集合结构

数据元素之间只有“属于同一集合”的关系。
如确定一名学生是否为班级成员,只需将班级看作一个集合结构。

  1. 线性结构

数据元素之间存在一对一的关系。
如将学生信息数据按照其入学报道的时间先后顺序进行排列。

  1. 树结构

数据元素之间存在一对多的关系。
如在班级的管理体系中,班长管理多个组长,每位组长管理多名组员。

  1. 图结构或网状结构

数据元素之间存在多对多的关系。
如多位同学之间的朋友关系,任何两位同学都可以是朋友。

总结
image

二、存储结构

数据对象在计算机中的存储表示,也称物理结构。把数据对象存储到计算机时,通常既要存储各数据元素的数据,又要存储数据元素之间的逻辑关系。

  1. 顺序存储结构

借助元素在存储器中的相对位置来表示数据元素之间的逻辑关系,要求所有的元素依次存放在一片连续的存储空间中,数据从低地址向高地址方向储存,通常借助数组类型来描述。

  1. 链式存储结构

无需占用一整块存储空间,但为了表示数据元素(结点)之间的关系,需要给每个结点附加指针字段,用于存放后继元素的存储地址,通常借助指针类型来描述。每个结点占用两个连续的存储单元。

1.2.3 数据类型和抽象数据类型

  1. 数据类型

在程序设计语言中,每一个数据都属于某种数据类型。类型规定了数据的取值范围、存储方式以及允许进行的运算,数据类型是一个值的集合和定义在这个值集上的一组操作的总称。

如C语言中的整型变量,其值集为某个区间上的整数,定义在其上的操作为加减乘除和取模等算术运算。

  1. 抽象数据类型

就是指由用户定义的、表示应用问题的数学模型,以及定义在这个模型上的一组操作的总称,具体包括...三部分(如下)

定义格式:

ADT 抽象数据类型名
{
    数据对象:<定义>
    数据关系:<定义>//采用数学符号和自然语言描述
    基本操作:<定义>
}ADT 抽象数据类型名

基本操作的定义格式:

基本操作名(参数表)
//赋值参数只为操作提供输入值,以“&”开头,除此之外还将返回操作结果
	初始条件:<描述>//操作执行之前数据结构和参数应满足的条件,为空则省略
	操作结果:<描述>//操作完成后,数据结构的变化状况和应返回的结果

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

运用抽象数据类型描述数据结构,有助于在设计一个软件系统时,不必首先考虑其中包含的数据对象,以及操作在不同处理器中的表示和实现细节,而是在构成软件系统的每个相对独立的模块上定义一组数据和相应的操作,把这些数据的表示和操作细节留在模块内部解决,在更高的层次上进行软件的分析和设计,从而提高软件的整体性能和利用率。

在C++中,用类的声明表示抽象数据类型,用类的实现来实现抽象数据类型。因此,C++中实现的类相当于数据的存储结构以及在存储结构上实现的对数据的操作。

(有在尽量缩减篇幅了其实,觉得这些很有助于理解就保留了)

以复数为例,

//定义部分
ADT Complex
{
    数据对象:D={e1,e2|e1,e2∈R,R是AXT实数集}
    数据关系:S={<e1,e2>|e1是复数的实部,e2是复数的虚部}
    基本操作:
        Create(&C,x,y)
          操作结果:构造复数C,其实部和虚部分别被赋以参数x和y的值。
        Add(C1,C2)
          初始条件:C1,C2是复数。
          操作结果:返回两个复数C1和C2的和。
}ADT Complex

//表示部分
typedef struct      //复数类型
{
    float Realpart; //实部
    float Imagepart;//虚部
}Complex;

//实现部分
void Create(&Complex C,float x,float y)
{
    //构造一个复数
    C.Realpart=x;
    C.Imagepart=y;
}

Complex Add(Complex C1,Complex C2)
{
    //求两个复数C1和C2的和
    Complex sum;
    sum.Realpart=C1.Realpart+C2.Realpart;
    sum.Imagepart=C1.Imagepart+C2.Imagepart;
    return sum;
}

1.4 算法和算法分析

1.4.1 算法的定义与特性

算法是为了解决某类问题而规定的一个有限长的操作序列。
有穷性、确定性、可行性、输入和输出。

1.4.2 算法的时间复杂度

描述的是算法执行时间开销和问题规模n之间的关系。包含最好、平均和最坏时间复杂度。时间复杂度通常包括:常量阶、线性阶、平方阶、对数阶等。

求下面语句的执行次数:

for(i=1;i<=n;i++)//n+1
for(i=1;i<=n;i++)
  求这一句x++;//n
for(i=1;i<=n;i++)
  这一句for(j=1;j<=n;j++)//n(n+1)
for(i=1;i<=n;i++)
  for(j=1;j<=n;j++)
    这一句x++;//n²
for(i=1;i<=n;i++)
  for(j=1;j<=n;j++)
    for(k=1;k<=n;k++)
      这一句x++;

结果是这个\(\sum_1^n\) * \(\sum_1^i\) * j

for(i=1;i<=n;i=i*2)
{
  x++;
  s=0;
}

结果是这个\(log_2n\)

相应的,整个程序的时间复杂度就取决于最大阶,如:

for(i=1;i<=n;i++)//n+1
  for(j=1;j<=n;j++)//n(n+1)

n+1+n(n+1)=n+1+n²+n ---- O(n²)

1.4.3 算法的空间复杂度

程序执行时,除了需要寄存本身所有指令、常数、变量和输入的数据外(取决于问题本身),还需要一些对数据进行操作的辅助存储空间。空间复杂度考虑的就是在算法实现中考虑的辅助空间大小。

1.5 小结

1)数据结构是一门研究非数值计算程序设计中操作对象,以及这些对象之间的关系和操作的学科。

2)数据结构包括两个方面的内容:数据的逻辑结构和存储结构。同一逻辑结构采用不同的存储方法,可以得到不同的存储结构。

  1. 逻辑结构是从具体问题抽象出来的数学模型,从逻辑关系上描述数据,它与数据的存储无关。根据数据元素之间关系的不同特性,通常有四类基本逻辑结构:集合、线性、树形、图状结构。
  2. 存储结构是逻辑结构在计算机中的存储表示,分为顺序和链式两类。

3)抽象数据类型是指由用户定义的、表示应用问题的数学模型,以及定义在这个模型上的一组操作的总称,包括数据对象、数据关系、基本操作三部分。

4)算法是为了解决某类问题而规定的一个有限长的操作序列。算法有五个特性:有穷性、确定性、可行性、输入和输出。一个算法的优劣应从正确性、可读性、健壮性和高效性四个方面来评价。

5)算法分析的两个主要方面是分析算法的时间复杂度和空间复杂度,以考察算法的时间和空间效率。一般情况下,将算法的时间复杂度作为分析的重点。算法执行时间的数量级称为算法的渐近时间复杂度,T(n)=O(f(n)),它表示随着问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,简称时间复杂度。

标签:存储,绪论,复杂度,元素,算法,抽象数据类型,数据结构,数据
From: https://www.cnblogs.com/vicky-han/p/18008443

相关文章

  • 学习 Redis 基础数据结构,不讲虚的。
    学习Redis基础数据结构,不讲虚的。一个群友给我发消息,“该学的都学了,怎么就找不到心意的工作,太难了”。很多在近期找过工作的同学一定都知道了,背诵八股文已经不是找工作的绝对王牌。企业最终要的是可以创造价值,或者首先需要干活的人,所以实战很重要。今天这篇文章就是给大家分享......
  • [数据结构] 队列
    队列的基本概念队列(Queue),是一种操作受限的线性表,只允许在表的一端进行插入,而在表的另一端进行删除。向队列中插入元素称为入队,删除元素称为出队。其操作特性是先进先出队列的常见操作:函数名功能InitQueue(*Q)初始化队列,构造一个空队列QQueueEmpty(Q)判断队列空......
  • [数据结构] 数组与特殊矩阵
    写在前面偷懒,先写了数组,列表要画图,所以今天就先不写了数组的定义数组是由n个相同类型的数据元素构成的有限序列。每个数据元素被称为一个数组元素,每个元素在n个线性关系中的序号称为该元素的下标,下标的取值范围称为数组的维界。数组与线性表的关系:数组是线性表的推广。一维数......
  • Java 中的哈希表数据结构
    哈希表数据结构HashMap集合:在JDK8之后,如果单向链表中的元素超过8个,单向链表数据结构就会变成红黑树数据结构,当红黑树上的节点数量小于6时,会重新把红黑树变成单向链表数据结构。HashMap集合底层是哈希表/散列表的数据结构哈希表是一个怎样的数据结构?哈希表是一个数组和单向链......
  • [数据结构] 栈
    栈的定义及特点栈(Stack)是只允许在一端进行插入或删除操作的线性表,如图所示:栈顶(top):线性表允许进行插入、删除的一端;栈底(bottom):不允许进行插入和删除的一端;空栈:不含任何元素的空表。如上图所示,设某个栈\(S=(a_1,a_2,a_3,a_4,a_5)\),则\(a_1\)为栈底元素,\(a_5\)为栈顶元素。......
  • 经典数据结构题目-图
    图200.岛屿数量思路遍历二维数组,遇到等于1的进行计算。同时修改同岛的位置为0,避免重复计算遍历同岛的位置,可以采用dfs深度优先搜索代码char[][]g;publicintnumIslands(char[][]grid){intsum=0;g=grid;for(inti=0;......
  • 有关各种数据结构模板
    FHQ-Treap模板题-普通平衡树#include<bits/stdc++.h>#definelstr[u].l#definerstr[u].rusingnamespacestd;constintN=3e5+10;structNode{intl,r;intkey,v;intsize;}tr[N];introot,idx;intn,m;voidpushup(intu){tr[u].size......
  • 2.1 不会有人数据结构比我还菜吧?
    记录三道自己菜死了的与根号有关的题。其中每道题都有polylog解法。题目名称太长了,就不放了。CF1017GTheTree根号做法:考虑操作分块,然后建虚树。建出虚树之后我们就发现很好处理了。同样的,处理每一个块结束后的真实形态,也可以借助这个虚树。总的来说,需要暴力维护一下每个虚......
  • 数据结构(一)单链表---以题为例
    实现一个单链表,链表初始为空,支持三种操作:向链表头插入一个数;删除第 k 个插入的数后面的数;在第 k 个插入的数后插入一个数。现在要对该链表进行 M 次操作,进行完所有操作后,从头到尾输出整个链表。注意:题目中第 k 个插入的数并不是指当前链表的第 k 个数。例如操作......
  • 数据结构之——数组
    数组数据结构的基本类型之一,它可以构成其他数据结构,如栈、队列、哈希表、树、图、堆、矩阵、张量。数组在内存中的存储方式为一片连续的内存空间,其基本操作与其他数据结构一致,即所谓的增删改查。废话不多说,上代码加以理解。Java类型实现classarray{publicstaticvoid......