• 数据结构(二)基本概念和术语


    😀前言
    本人是根据bi站王卓老师视频学习并且做了相关笔记希望可以帮助到大家

    🏠个人主页尘觉主页

    在这里插入图片描述

    🧑个人简介:大家好,我是尘觉,希望我的文章可以帮助到大家,您的满意是我的动力😉

    在csdn获奖荣誉: 🏆csdn城市之星2名
    ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ 💓Java全栈群星计划top前5
    ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ 🤗 端午大礼包获得者
    ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ 🥰阿里云专家博主
    ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ 😉亚马逊DyamoDB结营

    💕欢迎大家:这里是CSDN,我总结知识的地方,欢迎来到我的博客,感谢大家的观看🥰
    如果文章有什么需要改进的地方还请大佬不吝赐教 先在次感谢啦😊

    数据结构(二)基本概念和术语

    基本概念和术语

    1. 数据(Data)是客观事物的符号表示,是所有能输入到计算机****中被计算机程序处理的符号的总称(集合)。是信息的载体;是对客观事物的符号化表示;可以被计算机识别、存储和加工。数据不仅仅包含整型、实型等数值类型,还包含图形、图像、声音、视频及动画等非数值类型
      对于整型、实型等数值类型,可以进行数值计算
      对于字符数据类型,就需要进行非数值的处理。而声音、图像、视频等其实是可以通过编码的手段变成字符数据来处理的。

    2. 数据元素(DataElement)是数据的基本单位,在计算机中通常作为一个整体进行考虑和处理。在有些情况下,数据元素也称为元素、记录、节点、顶点等。如前一节示例中的一名学生记录,树中棋盘的一个格局(状态),以及图中的一个顶点等。

    3. 数据项(Data Item)是组成数据元素的、有独立含义的、不可分割的最小单位。例如,学生基本信息表中的学号、姓名、性别等都是数据项。【数据项是“数据的最小单位。但真正讨论问题时,数据元素才是数据结构中建立数据模型的着眼点。就像我们讨论一部电影时,是讨论这部电影角色这样的数据元素”,而不是针对这个角色的姓名或者年龄这样的“数据项”去研究分析。】

    img

    1. 数据对象(DataObject)是性质相同的数据元素的集合,是数据的一个子集。例如:整数数据对象是集合N={0, ±1,±2,…}, 字母字符数据对象是集合C={‘A’,‘B’, …‘Z’,‘a’,‘b’, …, ‘z’}, 学生基本信息表也可以是一个数据对象。由此可以看出,不论数据元素集合是无限集(如整数集),或是有限集(如字母字符集),还是由多个数据项组成的复合数据元素(如学生表)的集合,只要集合内元素的性质均相同,都可称之为一个数据对象。

    说了数据结构中的数据那数据结构中的结构又是什么呢?

    数据结构

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

    数据结构(Data Structure)**是相互之间存在一种或多种特定关系的数据元素的集合。**换句话说,数据结构是带”结构"的数据元素的集合,“结构”就是指数据元素之间存在的关系。

    逻辑结构和物理结构

    • 逻辑结构

      数据的逻辑结构是从逻辑关系上描述数据,它与数据的存储无关,是独立于计算机的。因此,数据的逻辑结构可以看作是从具体问题抽象出来的数学模型。数据的逻辑结构有两个要素:一是数据元素;二是关系

    下面四种结构中所举的示例是以某班级学生作为数据对象(数据元素是学生的学籍档案记录),来分别考察数据元素之间的关系。

    (1)集合结构

    数据元素之间除了“属于同一集合”的关系外,别无其他关系。例如,确定一名学生是否为班级成员,只需将班级看做一个集合结构。

    (2)线性结构

    数据元素之间存在一对一的关系。例如,将学生信息数据按照其人学报到的时间先后顺序进行排列,将组成一个线性结构。

    (3)树结构

    数据元素之间存在一对多的关系。例如,在班级的管理体系中,班长管理多个组长,每位组长管理多名组员,从而构成树形结构。

    (4)图结构或网状结构

    数据元素之间存在多对多的关系。例如,多位同学之间的朋友关系,任何两位同学都可以是朋友,从而构成图状结构或网状结构。

    数据结构及算法总结(概述) - 知乎

    img

    物理结构/存储结构

    物理结构:数据的逻辑结构在计算机中(内存)的存储形式。分为顺序存储结构、链式存储结构、索引存储结构、散列存储结构。

    1. 顺序存储结构
      顺序存储结构是把数据元素存放在连续的存储单元里,数据元素之间的逻辑关系是通过数据元素的位置。(在前面的数据元素就存在前面;在后面的数据元素就存在后面)C语言用数组来实现顺序存储结构

    img

    1. 链式存储结构
      用一组任意的存储单元存储数据元素(可能连续也可能不连续),数据元素之间的逻辑关系用指针来表示(用指针存放后继元素的存储地址)
      C语言中用指针来实现链式存储结构

    img

    img

    1. 索引存储结构

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

    image-20230911211939989

    • 在存储节点信息的同时,还建立附加索引
    • 索引表中的每一项称为一个索引项,
    • 索引项的一般形式是:(关键字,地址)
    • 关键字是能唯一标识一个结点的那些数据项。
    • 若每个结点在索引表中都有一个索引项,则该索引表称之为稠密索引(Dense Index)。
    • 若一组结点在索引表中只对应一个索引项,则该索引表称之为稀疏索引(Sparse Index)。
    1. 散列存储结构

    img

    数据类型

    ​ 说到数据类型其实我们并不陌生,在使用高级程序设计语言编写程序时,必须对程序中出现的每个变量、常量或表达式、C语言中函数的参数、返回值,明确说明它们所属的数据类型。

    ​ C语言中:提供int,char,float,double等基本数据类型;数组、结构、共用体、枚举等构造数据类型;还有指针、空(void)类型,用户也可用typedef自己定义数据类型。而另一些常用的数据结构,如栈、队列、树、图等,不能直接用数据类型来表示。
    在C语言中,数据类型可以分为两类

    • 原子类型:是不可以再分解的基本类型,包括整型、实型、字符型等
    • 结构类型:由若干个类型组合而成,是可以再分解的。例如,整型姿型数据组成的数组。

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

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

    类型明显或隐含地规定了程序执行期间变量或表达式的取值范围、存储方式以及允许进行的运算。

    ​ 例如,C语言中定义变量i为int类型,就表示是[min,max]范围的整数,[-32768~32767,16位计算机上]

    在这个整数集上可以进行+、-、*、/、%的操作,而不能进行其他数据类型比如字符串的一些操作,而实型变量也有自己的取值范围和相应运算,比如取模运算是不能用于实型变量的。

    数据类型是一个值的集合和定义在这个值集上的一组操作的总称。

    抽象

    image-20230911214153680

    你在这幅图中看到了什么?相信大多数人会说看到的圆,其实这就是抽象。我们看到了他的本质,而去掉了一些非本质的东西,比如大小颜色,线条的粗细,空心还是实心。

    那什么是圆呢?
    圆是到某个点距离相等的点的集合这个定点就是圆心,距离就是半径,我们就可以描述这个圆的一些相关信息了

    运算:构造圆、求面积、求周长

    抽象数据类型

    抽象数据类型(Abstract Data Type, ADT)一般指由用户定义的、表示应用问题的数学模型,以及定义在这个模型上的一组操作的总称,具体包括三部分:数据对象、数据对象上关系的集合以及对数据对象的基本操作的集合。

    • 由用户定义,从问题抽象出数据模型(逻辑结构)
    • 还包括定义在数据模型上的一组抽象运算(相关操作)
    • 不考虑计算机内的具体存储结构与运算的具体实现算法
    抽象数据类型的形式定义

    抽象数据类型可用(D,S,P)三元组表示【离散数学上的概念】其中:

    • D是数据对象;
    • S是D上的关系集;数据对象之间的关系构成的集合,(数据对象与数据对象之间可能有多种关系构成了这个集合)
    • P是对D的基本操作集。
    抽象数据类型的定义格式如下:
    
    
    ADT 抽象数据类型名{
    				数据对象:(数据对象的定义)
    				数据关系:(数据关系的定义)
    				基本操作:<基本操作的定义)
    
    }ADT 抽象数据类型名
    
    其中,数据对象和数据关系的定义采用数学符号和自然语言描述,基本操作的定义格式为:
    	基本操作名(参数表)
    			初始条件:<初始条件描述>
    			操作结果:<操作结果描述>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    说明

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

    • 比如求圆的面积的操作area(操作的名字)®(操作的参数)对图形进行一个缩放n倍scale(G(被操作的图形),n)对图形进行缩放,
    • 它当然也会返回一个图形 G’=scale(G,n) 返回值要赋值给G 写成scale(**&**G,n)
    • 引用参数以"&"打头,除可提供输入值外,还将返回操作结果。
    • ”初始条件”描述了操作执行之前数据结构和参数应满足的条件,若初始条件为空,则省略。”
    • 操作结果”说明了操作正常完成之后,数据结构的变化状况和应返回的结果。

    img

    Summary

    image-20230911215926038

    要想达到解决问题的目的,就要把抽象的,在计算机上用已有的数据类型进行实现

    #include
    
    typedef struct Complex {
        /**typedef起别名的。
            定义一个整型变量int a;定义一个结构体变量struct[结构体名]结构体变量名;
            用 typedef关键字把 struct Complex起了个名字叫complex
         **/
        float realpart;
        float imagepart;
    } complex;
    
    complex assign(float real, float image) {//类似于Jaua的构造方法
        //构造一个复数
        complex c;
        c.realpart = real;
        c.imagepart = image;
        return c;
    }
    
    float GetReal(complex C) {//类似于get方法
        // 取复数C=x+yi的实部
        return C.realpart;
    
    }
    
    float Getimage(complex C) {
        //取复数C=x+yi的虚部
        return C.imagepart;
    }
    
    complex Add(complex C1, complex C2) {
        //求两个复数c1和c2的和sum
        complex sum;
        sum.realpart = C1.realpart + C2.realpart;
        sum.imagepart = C1.imagepart + C2.imagepart;
        return sum;
    }
    
    complex Differ(complex C1, complex C2) {
        //求两个复数c1和c2的差difference
        complex differ;
        differ.realpart = C1.realpart * C2.realpart - C1.imagepart * C2.imagepart;
        differ.imagepart = C1.imagepart * C2.realpart + C1.realpart * C2.imagepart;
        return differ;
    }
    
    int main(void) {
        complex c1, c2, c3, c4;
        c1 = assign(1.0, 2.0);
        c2 = assign(3.0, 4.0);
        c3 = Add(c1, c2);
        c4 = Differ(c1, c2);
        printf("c1+c2的和:%.1f+%.1fi\n", c3.realpart, c3.imagepart);
        printf("c1+c2的乘积:%.1f+%.1fi\n", c4.realpart, c4.imagepart);
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56

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

    😁热门专栏推荐
    想学习vue的可以看看这个

    java基础合集

    数据库合集

    redis合集

    nginx合集

    linux合集

    手写机制

    微服务组件

    spring_尘觉

    springMVC

    mybits

    等等等还有许多优秀的合集在主页等着大家的光顾感谢大家的支持

    🤔欢迎大家加入我的社区 尘觉社区

    文章到这里就结束了,如果有什么疑问的地方请指出,诸佬们一起来评论区一起讨论😁
    希望能和诸佬们一起努力,今后我们一起观看感谢您的阅读🍻
    如果帮助到您不妨3连支持一下,创造不易您们的支持是我的动力🤞

  • 相关阅读:
    数据类型扩展02
    【PCB专题】如何在嘉立创8月1日起的新规则下免费打样
    CPU是海王?聊聊 主/子线程 和 同/异步 的关系
    需求设计文档和产品经理的角色改变
    CMD 命令和 ENTRYPOINT 命令的区别
    【基于Arduino的仿生蚂蚁机器人】
    java rsa生成公钥和私钥与C++生成的rsa
    chatgpt赋能python:Python选择函数
    Swift学习笔记三(Dictionary 篇)
    未来的大模型发展
  • 原文地址:https://blog.csdn.net/apple_67445472/article/details/134391723