【数据结构与算法】基本概念

news2024/11/18 3:42:26

数据结构与算法——绪论

文章目录

  • 一.数据结构的研究内容
    • 1.1数值计算
    • 1.2非数值计算
  • 二.基本概念和术语
    • 2.1数据,数据元素,数据项和数据对象
    • 2.2数据结构
      • 2.2.1逻辑结构
      • 2.2.2存储结构(物理结构)
      • 2.2.3运算和实现
  • 三.抽象数据类型的表示和实现
    • 3.1数据类型(Data Type)
    • 3.2抽象数据类型(Abstract Data Type ADT)
      • 3.2.1定义
      • 3.2.2.抽象数据类型的表示和实现

下图是文章小结:

在这里插入图片描述

一.数据结构的研究内容

数据结构的实质

在这里插入图片描述

1.1数值计算

早期,计算机被用于数值计算。

  • 计算数学的研究范畴:首先,分析问题,提取操作对象。然后,找出操作对象之间的关系,用数学语言(数学公式或方程)加以描述,建立相应的数学方程。
  • 特点:数据元素间的关系简单,计算复杂。如图:

1.2非数值计算

随着计算机应用领域的扩展,计算机被越来越多地用于非数值计算。

  1. 例1.学生学籍管理系统

    在这里插入图片描述

    • 操作对象:每位学生的信息(学号,姓名,性别,籍贯,专业…)。
    • 操作算法:查询,插入,修改,删除等。
    • 操作对象之间的关系:线性关系
    • 数据结构:线性数据结构,线性表
  2. 例2.图书管理系统

    • 操作对象:若干行数据记录
    • 操作算法:查询,插入,修改,删除等
    • 操作对象之间的关系:线性关系
    • 数据结构:线性数据结构,线性表
  3. 例3.文件系统的系统结构图

    磁盘跟目录下有很多子目录及文件,每个子目录里又可以包含多个子目录及文件,但每个子目录只有一个父目录,以此类推;本问题是一个典型的蜀兴结构问题,数据与数据成一对多的关系,是一种典型的非线性关系结构——树形结构

  4. 例4.人机对弈问题
    在这里插入图片描述

  5. 例5.地理信息处理
    在这里插入图片描述

    问题:找到图中两点之间的最短路径或最经济路径。

    处理:把地图上地点看成一个个点,一条条路,点点之间连线,然后抽象成一个由线和点构成的抽象结构,分析点与点之间的最短路径,最后得出花费时间最少或最经济的路线。

    操作对象:各地点及路的信息。

    对象之间的关系:非线性关系,网状结构。

综上所述

  • 这些问题的共性都是无法用数学公式和方程来描述,是一些非数值计算的程序问题。
  • 描述非数值计算问题的数学模型不是数学方程,而是诸如表,数和图之类的具有逻辑关系的数据。
  • 数据结构是一门研究非数值计算的程序设计中计算机的操作对象(如表,数和图),以及他们之间的关系和操作的学科。

在这里插入图片描述

二.基本概念和术语

2.1数据,数据元素,数据项和数据对象

  1. 数据(Data)

    • 是能输入计算机且能被计算机处理的各种符号的集合
    • 信息的载体
    • 是对客观事物符号化的表示
    • 能够被计算机识别,存储和加工
    • 包括:
      • 数值型的数据:整数,实数等
      • 非数值型的数据:文字,图像,图形和声音等
  2. 数据对象(Data Object)

    • 性质相同的数据元素的集合,是数据的一个子集。例如:
      1. 整数数据对象是集合N={…-2,-1,0,1,2…}
      2. 字母字符数据对象是集合C={‘A’,‘B’,…,‘Z’}
      3. 学籍表也可看作一个数据对象
  3. 数据元素

    • 是数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理。
    • 也简称为元素,或称为记录,结点或顶点。
    • 一个数据元素可由若干个数据项组成。

    数据元素可以是表中的一行,可以是一个格局是一个结点,可以是导航中的一个地点抽象成的一个点。

  4. 数据项

    • 构成数据元素的不可分割的最小单位

    数据,数据元素,数据对象,数据项之间的关系:

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

2.2数据结构

  • 数据元素不是孤立存在的,他们之间存在着某种关系,数据元素相互之间的关系称为结构(Structure)。
  • 是指相互之间存在一种或多种特定关系的数据元素集合。
  • 或者说,数据结构是带结构的数据元素的集合。

数据结构包括以下三个方面:

2.2.1逻辑结构

数据元素之间的逻辑关系,也称为逻辑结构。

  • 与数据的存储无关,独立于计算机。
  • 是从具体问题抽象出来的数学模型。

逻辑结构的种类

  • 划分方法一

1)线性结构(一对一)

有且仅有一个开始和一个终端结点,并且所有结点都最多只有一个直接前趋和一个直接后继。例如:线性表,栈,队列,串。

2)非线性结构(多对多)

一个结点可能有多个直接前趋和直接后继。例如:树,图。

  • 划分方式二——四类基本逻辑结构

1)集合结构:结构中的数据元素之间除了同属于一个集合的关系外,无其他任何关系。

2)线性结构:结构中的数据元素之间存在着一对一的线性关系。

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

4)图状结构网状结构:结构中的数据元素之间存在着多对多的任意关系。

在这里插入图片描述

2.2.2存储结构(物理结构)

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

  • 数据元素及其关系在计算机存储器中的结构(存储方式)
  • 是数据结构在计算机中的表示

四种基本的存储结构

  1. 顺序存储结构

    • 用一组连续的存储单元依次存储数据元素,数据元素之间的逻辑关系由元素的存储位置来表示。

    • C语言中用数组来实现顺序结构。例:(bat,cat,eat,…)

      在这里插入图片描述

  2. 链接存储结构

    • 用一组任意的存储单元存储数据元素,数据元素之间的逻辑关系用指针来表示。

    • C语言中用指针来实现链式存储结构。如图所示(bat,cat,eat,…mat):先存储一个元素,同时把一个元素的地址在哪也存上,存一个元素的同时存下一个元素地址,这样就可以通过一个元素访问它的下一个元素了。

      在这里插入图片描述

      在这里插入图片描述

  3. 索引存储结构

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

    如图,通讯录就是索引表,通讯录中的姓就是索引项,例如(M,米)

    在这里插入图片描述

  4. 散列存储结构

    • 根据结点的关键字直接计算出该结点的存储地址。
    Key327570634894253618
    Key%111094846337

    得到的散列表如下:

在这里插入图片描述

2.2.3运算和实现

即对数据元素可以施加的操作以及这些操作在相应的存储结构上的实现。

逻辑结构与存储结构的关系:

  • 逻辑结构是数据结构的抽象,存储结构是数据结构的实现。
  • 存储结构是逻辑关系的映像与元素本身的映像。
  • 两者综合起来建立了数据元素之间的结构关系。

三.抽象数据类型的表示和实现

3.1数据类型(Data Type)

  1. 在使用高级程序设计语言编写程序时,必须对程序中出现的每个变量,常量或表达式,明确说明他们所属的数据类型
  • 例如,C语言中:
    1. 提供int,char,float,double等基本数据类型
    2. 数组,结构,共用体,枚举等构造数据类型
    3. 还有指针,空(void)类型
    4. 用户也可用typedef自己定义数据类型
  • 一些最基本数据结构可以用数据类型来实现,如数组,字符串等
  • 而另一些常用的数据结构,如栈,队列,树,图等,不能直接用数据类型来表示。
  1. 高级语言中的数据类型明显地或隐含地规定了在程序执行期间变量和表达的所有的取值范围,以及在这些数值范围上所允许进行的操作。

    • 例如,C语言中定义变量 i 为int类型,就表示 i 是[-min,max]范围的整数,在这个整数集上可以进行+,-,*,\,%等操作。

    在这里插入图片描述

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

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

3.2抽象数据类型(Abstract Data Type ADT)

3.2.1定义

是指一个数学模型以及定义在此数学模型上的一组操作

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

    抽象数据类型可用(D,S,P)三元组表示。其中:

    D是数据对象

    S是D上的关系集

    P是对D的基本操作集

  2. 定义格式

    一个抽象数据类型的定义格式如下:

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

​ 其中:

  • 数据对象,数据关系的定义用伪代码来描述

  • 基本操作的定义格式为:

    • 基本操作名(参数表)
    • 初始条件:<初始条件描述>
    • 操作结果:<操作结果描述>
  1. 基本操作定义格式说明:
  • 参数表

    赋值参数,只为操作提供输入值;例如power(x,y);

    引用参数,以&打头,除可提供输入值外,还将返回操作的结果。例如:scale(&G,n);表示对图形放大n倍,返回操作以后G仍然用G自身返回。

  • 初始条件:描述操作执行之前数据结构和参数应满足的条件,若不满足,则操作失败,并返回相应的出错信息。若初始条件为空,则省略之。

  • 操作结果:说明操作正常完成之后,数据结构的变化状况和应返回的结果。

抽象数据类型伪代码表示如下:

ADT 抽象数据类型名{
    Data
        数据对象的定义
        数据元素之间逻辑关系的定义
    Operation
        操作1
        	初始条件
        	操作结果描述
        操作2
        ……
        操作n
        ……
}ADT 抽象数据类型名

3.2.2.抽象数据类型的表示和实现

一个问题抽象为一个抽象数据类型,仅是形式上的抽象定义,还没有达到问题解决的目的,要实现这个目标,就要把抽象的变成具体的,即抽象数据类型在计算机上实现,变为一个能用的具体的数据类型。例如,用C语言实现抽象数据类型:用已有数据类型定义描述它的存储结构,再用函数定义描述它的操作,就可以在程序中使用。

把逻辑结构映像到内存,考虑到如何存储,不仅要存储数据结构,还要存储逻辑关系(存储结构)

  1. 实现
  • 抽象数据类型可以通过固有的数据类型(如整型,实型,字符型等)来表示和实现。即利用处理器中已存在的数据类型来说明新的结构,用已经实现的操作来组合新的操作。

    实例1:抽象数据类型“复数”计算z=(z1*z2)/(z1+z2)的实现。在下面的结构中,用已有的float行定义complex复数结构类型。

#include<stdio.h>
//定义常量,定义类型,函数声明等
typedef struct{
    float realpart;     //实部
    float imaqpart;     //虚部
}Complex                //定义复数抽象类型
Void assign(Complex *A,float real,float imag){//赋值
    A->realpart=real;    //实部赋值
    A->imagpart=imag;    //虚部赋值
}                        //End of assign()
void add(Complex *A,float real,float imag);{//A+B
    c->realpart=A.realpart+B.realpart;//实部相加
    c->imagpart=A.imagpart+B.imagpart;//虚部相加
}
//Complex是定义的结构体类型,带*指针变量,它是指向Complex类型的指针;

void main()
//声明变量,定义实数,调用函数等
{
    complex z1,z2,z3,z4,z;
    float RealPart,ImagPart;
    assign(z1,8.0,6.0);   //构造复数z1
    assign(z2,4.0,3.0);   //构造复数2
    add(z1,z2,z3);        //z1,z2相加,结果存放于z3
    multiply(z1,z2,z4)    //两个负数z1,z2相乘,结果存放于z4
    if(divide(z4,z3,z)){  //两个复数相除(去掉分母为0的情况计算)
        GetReal(z,RealPart);
        GetImag(z,ImagPart);
    }
}

在C中,用函数真正实现抽象数据类型定义。如果函数的定义出现在被调用函数后,必须阿紫前面加以声明,所以通常看到数据定义玩之后,对函数的声明。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

安装管理K8S的开源项目KubeClipper介绍

安装管理K8S的开源项目KubeClipper介绍 1. 概述 KubeClipper是九州云开源的一个图形化界面 Kubernetes 多集群管理工具&#xff0c;旨在提供易使用、易运维、极轻量、生产级的 Kubernetes 多集群全生命周期管理服务。让运维工程师从繁复的配置和晦涩的命令行中解放出来&#…

VMware下的ubuntu显示文字太小的自适应显示调整

我的情况 我使用的是4K的32寸显示器&#xff0c;分辨率为 3840 x 2160&#xff0c;ubuntu版本为18.04&#xff0c;默认的情况下系统分辨率为 3466 x 1842。 ​ 此时&#xff0c;显示的文字很小&#xff0c;虽然可以看清&#xff0c;但也比较吃力&#xff0c;在VMware窗口…

深入探索机器学习中的目标分类算法

在当今数据驱动的世界中&#xff0c;机器学习&#xff08;Machine Learning, ML&#xff09;正逐渐成为解决问题的重要工具。在众多机器学习任务中&#xff0c;目标分类&#xff08;Classification&#xff09;算法尤其受到关注。本文将深入探讨目标分类算法的基本概念、常见类…

828华为云征文|部署开源超轻量中文OCR项目 TrWebOCR

828华为云征文&#xff5c;部署开源超轻量中文OCR项目 TrWebOCR 一、Flexus云服务器X实例介绍二、Flexus云服务器X实例配置2.1 重置密码2.2 服务器连接2.3 安全组配置2.4 Docker 环境搭建 三、Flexus云服务器X实例部署 TrWebOCR3.1 TrWebOCR 介绍3.2 TrWebOCR 部署3.3 TrWebOCR…

解压视频素材下载网站推荐

在制作抖音小说推文或其他短视频时&#xff0c;找到合适的解压视频素材非常重要。以下是几个推荐的网站&#xff0c;可以帮助你轻松下载高质量的解压视频素材&#xff1a; 蛙学网 蛙学网是国内顶尖的短视频素材网站&#xff0c;提供大量4K高清无水印的解压视频素材&#xff0c;…

C++:STL(四)之vector的基本介绍与使用方式|容器接口

✨ Blog’s 主页: 白乐天_ξ( ✿&#xff1e;◡❛) &#x1f308; 个人Motto&#xff1a;他强任他强&#xff0c;清风拂山冈&#xff01; &#x1f525; 所属专栏&#xff1a;C深入学习笔记 &#x1f4ab; 欢迎来到我的学习笔记&#xff01; 一、C/C中的字符串 1.1. C语言中的…

【机器学习】——决策树以及随机森林

文章目录 1. 决策树的基本概念与结构1.1 决策树的构建过程 2. 决策树的划分标准2.1 信息增益&#xff08;Information Gain&#xff09;2.2 信息增益比&#xff08;Information Gain Ratio&#xff09;2.3 基尼指数&#xff08;Gini Index&#xff09;2.4 均方误差&#xff08;…

极限基本类型小结

极限基本类型小结 在之前的文章中已经看过了极限的多种基本类型&#xff0c;下面展示一些各种基本类型的代表性的图像&#xff0c;通过观察下面的图像可以帮助我们回顾函数在趋近于某一点时函数值的行为&#xff08;这也叫极限值&#xff09;&#xff0c;也生动的描述了各种极…

老古董Lisp实用主义入门教程(12):白日梦先生的白日梦

白日梦先生的白日梦 白日梦先生已经跟着大家一起学Lisp长达两个月零五天&#xff01; 001 粗鲁先生Lisp再出发002 懒惰先生的Lisp开发流程003 颠倒先生的数学表达式004 完美先生的完美Lisp005 好奇先生用Lisp来探索Lisp006 好奇先生在Lisp的花园里挖呀挖呀挖007 挑剔先生给出…

关于工作虚拟组的一些思考

这是学习笔记的第 2493篇文章 因为各种工作协作&#xff0c;势必要打破组织边界&#xff0c;可能会存在各种形态的虚拟组。 近期沉淀了一些虚拟组的管理方式&#xff0c;在一定时间范围内也有了一些起色&#xff0c;所以在不断沉淀的过程中&#xff0c;也在不断思考。 这三个虚…

企业级版本管理工具(1)----Git

目录 1.Git是什么 2.Git的安装和使用 在Ubuntu下安装命令如下&#xff1a; 使用git --version查看已安装git的版本&#xff1a; 使用git init初始化仓库&#xff1a; 使用tree .git列出目录&#xff1a; 使用git config命令设置姓名和邮箱&#xff1a; 加入--global选项…

WPF MVVM入门系列教程(一、MVVM模式介绍)

前言 还记得早些年刚工作的那会&#xff0c;公司的产品从Delphi转成了WPF&#xff08;再早些年是mfc&#xff09;。当时大家也是处于一个对WPF探索的阶段&#xff0c;所以有很多概念都不是非常清楚。 但是大家都想堆技术&#xff0c;就提出使用MVVM&#xff0c;我那会是第一次…

想做个WPS的自动化代码,参考如下:

&#x1f3c6;本文收录于《全栈Bug调优(实战版)》专栏&#xff0c;主要记录项目实战过程中所遇到的Bug或因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&am…

水仙花数求解-C语言

1.问题&#xff1a; 输出100-1000之间所有的“水仙花数”。 2.解答&#xff1a; “水仙花数”是指一个3位数&#xff0c;其各位数字立方和等于该数本身&#xff0c;逐个位数判断即可&#xff0c;写代码的时候要考虑到每一位。 3.代码&#xff1a; #include<stdio.h>//…

9.28QT基础

widget.cpp widegt.h .pro main.cpp 一个仿QQ登录界面 #include "widget.h"Widget::Widget(QWidget *parent): QWidget(parent) {this->setFixedSize(350,500);this->setStyleSheet("background-color:#e5f0ff;");QLineEdit *edit1 new QLine…

1.2.3 HuggingFists安装说明-MacOS安装

MacOS版安装说明 下载地址 【GitHub】GitHub - Datayoo/HuggingFists4Mac 【百度网盘】https://pan.baidu.com/s/12WxZ-2GgMtbQeP7AcmsyHg?pwd2024 安装说明 环境要求 操作系统&#xff1a;MacOS 硬件环境&#xff1a;至少4核8G 安装步骤 1. 安装Docker环境。若已安装Do…

kali linux 终端复用和界面移动

kali linux 终端复用和界面移动 经验和操作 渗透测试的工具选择考虑 01 能用命令行就不用图形ui 图形ui 容易对细节隐藏&#xff0c;命令行工具的在终端输出的日志相对透明&#xff0c;容易观察和调整 wireshark – tcpdump burpsuit – curl( web 访问相关), wfuzz(模糊测…

带你0到1之QT编程:十七、Http协议实战,实现一个简单服务器和一个客户端进行http协议通信

此为QT编程的第十七谈&#xff01;关注我&#xff0c;带你快速学习QT编程的学习路线&#xff01; 每一篇的技术点都是很很重要&#xff01;很重要&#xff01;很重要&#xff01;但不冗余&#xff01; 我们通常采取总-分-总和生活化的讲解方式来阐述一个知识点&#xff01; …

Python15行代码 tkinter模块 写计算机

之前去备战csp-j了 也有一段时间没更新了 结果白名单没捞着 还差点被我妈打喜 今天闲来无事 写个计算器玩玩 _____________________________________________________________________________ 老规矩 先放代码 from tkinter import *;from math import sqrt;aTk();a.geome…

机械键盘驱动调光DIY--【DAREU】

1 下载键盘对应的驱动&#xff0c;不要装到C盘 达尔优驱动下载中心 2 驱动更改教程 标准模式 键盘功能 鼠标功能 切换灯光 切换配置文件 多媒体 windows快捷键 禁用 Fn 启动程序 文本功能 光标定位 FN模式 灯光效果设置 注意 宏--自定义功能