数据结构(一)—— 数据结构简介

news2024/10/5 5:07:53

文章目录

    • 一、基本概念和术语?
      • 1.1、数据
      • 1.2、数据元素
      • 1.3、数据项(属性、字段)
      • 1.4、数据对象
      • 1.5、数据结构
    • 二、逻辑结构和物理结构(存储结构)
      • 2.1、逻辑结构
        • 1、定义
        • 2、分类(线性结构和非线性结构)
      • 2、物理结构
        • 1)定义
        • 2)顺序存储和链式存储
        • 3)其他存储方式
    • 三、算法和抽象数据类型简介
      • 3.1 抽象数据类型定义
      • 3.2 算法定义
      • 1、算法的特性
      • 2、算法效率的度量
        • 2.1 事后统计法
        • 2.2 事前分析统计
      • 3、算法的复杂度
      • 4、算法实例

一、基本概念和术语?

1.1、数据

数据是描述客观事物的符号,是计算机可以操作的对象,是能被计算机识别,并输入到计算机处理的符号集合。

(数据不仅仅包括整型、实型等数值型,还有字符、声音、图像、视频等非数值类型)

1.2、数据元素

数据元素是组成数据的、有一定意义的基本单位,在计算机中通常作为整体处理,也称为记录(元组、结点、顶点)。

1.3、数据项(属性、字段)

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

1.4、数据对象

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

1.5、数据结构

  • 在现实世界中,不同数据元素之间不是独立的,而是存在特定的关系,这些关系称为结构。
  • 数据结构是相互之间存在一种或多种特定关系的数据元素的集合。
  • 数据结构包括三方面的内容:逻辑结构、存储结构和数据的运算。数据的逻辑结构和存储结构是密不可分的两个方面,一个算法的设计取决于所选定的逻辑结构,而算法的实现依赖于所采用的存储结构。

二、逻辑结构和物理结构(存储结构)

数据结构是相互间存在特定关系的数据的集合,分为逻辑结构和物理结构。

2.1、逻辑结构

1、定义

逻辑结构是指数据对象中数据元素之间相互关系(逻辑关系),即从逻辑关系上描述数据。它与数据的存储无关,是独立于计算机存储器的。

2、分类(线性结构和非线性结构)

根据数据元素之间关系的不同特征,通常有下列4类基本结构,复杂程度依次递进。

1image.png

  • 集合:结构中的数据元素之间除了同属于一个集合外,没有其他的关系。

  • 线性结构:线性结构中的数据元素之间是一对一的关系。

  • 树形结构:树形结构中的数据元素之间是一对多的关系。

  • 图状结构或网状结构:结构中的元素之间是多对多的关系。

2、物理结构

image.png

1)定义

数据的物理结构是指数据的逻辑结构在计算机中的存储方式。又称存储结构。

它研究的是数据结构在计算机中的实现方法,包括数据元素的表示和元素之间的关系。

数据元素的存储结构形式主要有两种:顺序存储和链式存储

2)顺序存储和链式存储

1. 顺序存储结构

  • 是利用数据元素在存储器中的相对位置来表示数据元素之间的逻辑顺序。
  • 顺序存储结构是把数据元素放在地址连续的存储单元中,程序设计中使用数组类型来实现。(逻辑相邻物理相邻)

2. 链式存储结构

  • 利用结点中指针来表示数据元素之间的关系。
  • 把数据元素存储在任意的存储单元里,这组存储单元可以是连续的,也可以是连续的,程序设计中使用指针类型来实现。(逻辑相邻物理不一定相邻)
3)其他存储方式
  • 索引存储:类似于目录,以后可以联系操作系统的文件系统章节来理解。

  • 散列存储:通过关键字直接计算出元素的物理地址。

三、算法和抽象数据类型简介

3.1 抽象数据类型定义

  1. 数据类型:是指一组性质相同的值的集合及定义在此集合上的一些操作的总称。

例如:C语言中数据类型分为基本类型和构造类型

基本类型:整型、浮点型、字符型等

构造类型:数组、结构、联合、指针、枚举型、自定义类型等

  1. 抽象数据类型(abstract data type,ADT):是指一个数学模型及定义在该模型上的一组操作。

3.2 算法定义

算法是特定问题求解步骤的描述,是独立存在的一种解决问题的方法和思想。

1、算法的特性

  • 输入:有0个或多个输入
  • 输出:至少有1个或多个输出
  • 有穷性:算法在有限的步骤后应该自动结束而不会无限循环。
  • 确定性:算法中的每个步骤都有确定的含义,不会出现二义性
  • 可行性:算法的每一步都是可行的
  • 正确性:算法对于合法数据能够得到满足要求的结果,能够处理非法输入,并得到合理的结果。
  • 可读性:算法要便于阅读、理解和交流
  • 健壮性:算法不应该得到莫名其妙的结果
  • 性价比:利用最少的资源得到满足要求的结果

2、算法效率的度量

效率评估是工程中算法最重要的附加特性。

2.1 事后统计法

比较不同算法对同一组输入数据的运行处理时间。

缺点:

A、为了获得不同算法的运行处理时间必须编写相应程序

B、运行处理时间严重依赖硬件以及运行时环境

C、算法的测试数据选取困难

2.2 事前分析统计

依据统计的方法对算法效率进行评估

影响算法效率的主要因素:

A、算法采用的策略和方法

B、问题的输入规模

C、编译器产生的代码

D、计算机的执行速度

算法效率的简单估算:

image.png

image.png

image.png

三种求和算法的关键部分的操作数量分别为2n,n,1。随着问题规模的增大,操作数量的差异会越来越大,效率差异也会越来越大。

image.png

不同算法操作数量的对比

算法操作数量对比的实例一:

image.png

n<=3时,算法B优于算法A。随着n的规模增大,算法A优势比较明显。

算法操作数量对比的实例二:

image.png

n=1时,算法C与算法D效率相同。随着n规模的增大,算法C优势明显优于算法D。

判断算法的效率时,操作数量中的常数项和其他次阶项常常可以忽略,只需要关注最高阶项。

3、算法的复杂度

(1)算法的时间复杂度

算法时间复杂度是算法运行后对时间需求量的定性描述。

由于主要关注算法的效率问题,因此主要讨论算法的时间复杂度。

O表示法

算法的效率严重依赖于操作(Operations)数量,操作数量的估算可以作为时间复杂度的估算,在判断时首先关注操作数量的最高阶项。

O(2)==>O(1)

O(3n+3)> O(3n)>O(n)

O(3n2+n+4)==>O(n2)

常见的时间复杂度:
image.png

image.png

image.png

image.png

(2)算法的空间复杂度

算法空间复杂度是算法运行后对空间需求量的定性描述。

通常使用S(n)表示算法的空间复杂度。使用时间复杂度的推导方法推导空间复杂度。

当算法所需的内存空间大小为常数时,算法的空间复杂度为S(1)。

通常情况下,算法的时间复杂度更受关注。可以通过增加额外空间降低时间复杂度。

算法是解决具体问题的步骤,数据结构是算法解决问题的载体。

4、算法实例

一个数组中存储着1——1000的数字,每个数字可能出现多次或者不出现,找出出现次数最多的数字。
void search(int array[], int len)
{

  //总计可能出现1000种可能值

  int sp[1000] = {0};

  int max = 0;

  for(int i = 0; i < len; i++)
  {
      //遍历数组,数组中某个数组出现一次增加统计1次
      sp[array[i] - 1]++;
  }

  for(int i = 0; i < 1000; i++)
  {
      if(max < sp[i])
      {
          max = sp[i];
      }
  }

  for(int i = 0; i< 1000; i++)
  {
      if(max == sp[i])
      {
          cout << "Number:" << i + 1 << endl;
          cout << "Count:" << max << endl;
      }
  }
}

使用空间换时间,算法的时间效率为O(n)。

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

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

相关文章

机器学习 Q-Learning

对马尔可夫奖励的理解 看的这个教程 公式&#xff1a;V(s) R(s) γ * V(s’) V(s) 代表当前状态 s 的价值。 R(s) 代表从状态 s 到下一个状态 s’ 执行某个动作后所获得的即时奖励。 γ 是折扣因子&#xff0c;它表示未来奖励的重要性&#xff0c;通常取值在 0 到 1 之间。…

程序员个性终端指南(cmder、powershell、window terminal)

序言 工欲善其事&#xff0c;必先利其器。对于 IT 从业者&#xff0c;命令行终端是一道绕不过的坎&#xff0c;日常开发、服务运维都要用到这个工具。 这里我介绍下从业多年来用过的 windwos 平台下终端工具。 CMD/命令行提示符 这个是 windows 自带的工具&#xff0c;平平无…

10.12按键中断

设置按键中断&#xff0c;按键1按下&#xff0c;LED亮&#xff0c;再按一次&#xff0c;灭 按键2按下&#xff0c;蜂鸣器响。再按一次&#xff0c;不响 按键3按下&#xff0c;风扇转&#xff0c;再按一次&#xff0c;风扇停 keyit.h: #ifndef __KEYIT_H__ #define __KEYIT_…

speech recognization

目标&#xff0c;在播放声音的时候&#xff0c;禁用掉麦克风 新建立一个文件夹&#xff0c;然后拖入vscode中 然后创建虚拟环境&#xff0c;vscode会自动帮我们创建虚拟环境&#xff0c;手动激活虚拟环境 source venv/bin/activate import speech_recognition as sr import …

免费使用Salesforce Data Cloud!详细操作步骤来啦

Data Cloud是Salesforce向市场推出的增长最快的产品&#xff0c;这对Salesforce来说是一个重要竞争优势。 近期&#xff0c;Salesforce宣布客户可以免费使用Data Cloud。这就是所谓的零美元SKU&#xff0c;换句话说&#xff0c;这是一条不会产生任何成本的Salesforce产品线。 …

云原生Kubernetes:K8S集群版本升级(v1.20.15 - v1.22.14)

目录 一、理论 1.K8S集群升级 2.集群概况 3.升级集群&#xff08;v1.21.14&#xff09; 4.验证集群&#xff08;v1.21.14&#xff09; 5.升级集群&#xff08;v1.22.14&#xff09; 6.验证集群 (v1.22.14) 二、实验 1.升级集群&#xff08;v1.21.14&#xff09; 2.验…

03在命令行环境中创建Maven版的Java工程,了解Java工程的目录结构并编写代码,执行Maven的构建命令

创建Maven版的Java工程 Maven工程的坐标 数学中使用x、y、z三个向量可以在空间中唯一的定位一个点, Maven中也可以使用groupId,artifactId,version三个向量在Maven的仓库中唯一的定位到一个jar包 groupId: 公司或组织域名的倒序, 通常也会加上项目名称代表公司或组织开发的一…

Pygame中将鼠标形状设置为图片2-1

在Pygame中利用Sprite类的派生类将鼠标形状设置为图片&#xff0c;其原理就是将Sprite类的派生类对应图片的位置设置为鼠标的当前位置即可。其效果如图1所示。 图1 将鼠标设置为图片 从图1可以看出&#xff0c;鼠标的形状变为红色的&#xff0c;该红色的随着鼠标的移动而移动&…

SQL:left join、right join 究竟什么区别?

1、SQL join 分三种 1&#xff09;inner join&#xff08;内连接&#xff0c;也叫等值连接&#xff09; 显示两个表中有联系的所有数据&#xff0c;是默认方式。 2&#xff09;cross join&#xff08;交叉连接&#xff09; 两个表格做笛卡尔积&#xff0c;显示的数据行数是…

LeetCode416 分割等和子集

题目&#xff1a; 、 分析&#xff1a; 因为分割的子数组&#xff0c;不连续&#xff1b;所以双指针、栈&#xff0c;一般不适用&#xff0c;分析起来很像是DP问题。 思路&#xff1a; https://www.imooc.com/article/300277 代码&#xff1a; //TODO 这题有难度

基于spring boot的多维分类的知识管理系统的设计与实现

目录 前言 一、技术栈 二、系统功能介绍 管理员功能实现 用户管理 知识分类管理 知识信息管理 知识信息添加 用户功能实现 首页 知识信息 个人中心 我的收藏 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 前言 随着国内市场经济这几十年来的蓬勃发展&…

Docker网络管理和数据管理

目录 Docker网络 Docker 网络实现原理 为容器创建端口映射 查看容器的输出和日志信息 Docker 的网络模式 查看docker网络列表 指定容器网络模式 网络模式详解 host模式 container模式 none模式 bridge模式 自定义网络 Docker数据管理 数据卷 数据卷容器 容器互联 Do…

【Leetcode】 406. 根据身高重建队列

假设有打乱顺序的一群人站成一个队列&#xff0c;数组 people 表示队列中一些人的属性&#xff08;不一定按顺序&#xff09;。每个 people[i] [hi, ki] 表示第 i 个人的身高为 hi &#xff0c;前面 正好 有 ki 个身高大于或等于 hi 的人。 请你重新构造并返回输入数组 peopl…

TCP/IP(十三)滑动窗口

一 滑动窗口 通信双方要读懂对方的反馈信息,并进行调整 TCP滑动窗口原理终于清楚了 TCP Window Full 和 TCP Zero Window "特殊的场景" 1、TCP Window Full 是站在发送端角度说的特点&#xff1a; 表示发送端不能再发数据给对方,除非发送的数据包得到ACK响应2、…

求二叉树第K层的节点个数——递归

int BinaryTreeLevelKSize(BTNode* root, int k) {assert(k > 0);if (root NULL){return 0;}if (k 1){return 1;}return BinaryTreeLevelKSize(root->left, k - 1) BinaryTreeLevelKSize(root->right, k - 1); }

数据中心布线数字孪生管理技术

以往&#xff0c;数据中心布线管理模式表格图纸 第一步&#xff1a;进行现场变更实施&#xff1b; 第二步&#xff1a;为了后续的变更&#xff0c;需要准确了解已经做了什么&#xff0c;我们用EXCEL或CAD图纸记录变更文档。 这种方式看似正确&#xff0c;然而&#xff0c;随着…

机器人制作开源方案 | 双轮提升搬运小车

1. 功能描述 双轮提升搬运小车是一种用于搬运和移动物体的机械设备&#xff0c;它通常采用双轮驱动和提升装置。一般具备以下特点&#xff1a; ① 双轮驱动&#xff1a;该小车配备两个驱动轮&#xff0c;通过电动机或其它动力源驱动&#xff0c;提供足够的动力和扭矩&#xff0…

使用eXtplorer打造简单实用的在线文件管理系统,方便随时随地远程访问文件

文章目录 1. 前言2. eXtplorer网站搭建2.1 eXtplorer下载和安装2.2 eXtplorer网页测试2.3 cpolar的安装和注册 3.本地网页发布3.1.Cpolar云端设置3.2.Cpolar本地设置 4.公网访问测试5.结语 1. 前言 通过互联网传输文件&#xff0c;是互联网最重要的应用之一&#xff0c;无论是…

自主升级nginx-ingress-controller的内置nginx组件

前言 我们由于等保要求或者漏洞扫描&#xff0c;常常会遇到一些漏洞问题。这些漏洞可能不是你直接部署的服务的漏洞。可能是你部署的某个服务的内部组件的漏洞。这时你可能需要单独升级某个服务组件内部的组件。比如升级nginx-ingress-controller的ngix版本这样的需求。 漏洞…

《Node.js+Express+MongoDB+Vue.js全栈开发实战》简介

今天介绍的这本书是《Node.jsExpressMongoDBVue.js全栈开发实战》。该书由清华大学出版社于2023年1月出版 外观 从书名故名思议&#xff0c;就是基于Node.jsExpressMongoDBVue.js来实现企业级应用全栈开发。 封面风格比较简约&#xff0c;插图是一张类似于罗马时代战车形象&…