数据结构详解①——诸论

目录

前言

引入:

基本概念和术语

数据

数据元素

数据项

数据对象

数据结构

逻辑结构

物理结构

数据类型

为什么要设计出来数据类型呢?

数据类型的分类

抽象数据类型

数据结构与算法的关系

算法

定义

特性

设计要求

效率度量方法

事后统计方法

事前统计方法

示例:

函数的渐进增长

时间复杂度

定义:

常数阶

线性阶

对数阶

平方阶

效率比较

最坏情况与平均情况

空间复杂度

总结


前言

本片文章主要介绍数据结构的引入的诸论知识,也很重要属于整个数据结构的基础,希望对大家有所帮助(●'◡'●)

引入:

早期人们以为计算机是计算的,把它当作一个数值运算工具,而计算机解决问题的方式是——先从具体问题中抽象出一个合适的数据模型,设计一个解决这个数据模型的算法,接着编写程序,然后得出结构

而数据结构是一门研究非数值计算的程序问题中的操作对象,以及它们之间的关系和操作等相关问题的学科。

而要想进一步了解数据结构到底是什么,就要先谈谈它相关基本知识的一些概念。

👇

基本概念和术语

数据

数据是指描述客观事物的符号,可以在计算机中操作的对象

数据分为非数值类型数值类型,数值类型就是像平常中的小数阿、整数等,有具体数值的数,而非数值类型是包含字符和声音、图像、视频

例如,MP3音频就是指数据——声音数据

而任何一个符号都可以成为数据吗?

当然不是,符号要满足一定的条件才可以成为数据

  • 可以输入到计算机中
  • 可以被计算机程序处理

数据元素

是组成数据的、有一定意义的基本单位,在计算机中通常作为整体处理,也被称为记录

数据往下分类可以分为数据元素,这里举个例子吧——人类这个数据中的数据元素就是人

数据项

数据对象再往下分就是数据项了,它是数据不可分割的最小单位。

例如人再次细分——可以分为它的姓名阿、年龄、学校等数据项

虽然它是最小单位但是对于研究一个数据——通常研究的是数据元素。

数据对象

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

这个相同性质指得是——数据元素有相同类型和数量的数据项

数据结构

这时候终于绕回主题了,数据结构顾名思义讲的就是数据元素之间的关系,而数据结构从两种角度分析可以分为两种——

  • 1.逻辑结构
  • 2.物理结构(存储结构)

逻辑结构

这里的逻辑结构讲的是数据之间的逻辑关系——这里的逻辑关系(结构)分为四种

集合结构

 

线性结构

树形结构

图形结构

物理结构

物理结构又称为存储结构——指得是数据的逻辑结构在存储器中存储的方式,这里的存储器主要是指内存,而硬盘、U盘等为外部存储器

这里也分为两类结果

  • 顺序存储结构
  • 链式存储结构

顺序存储结构是指——像数组一样,排列在一起,把数据存放在一个连续的区域内,就像排队一样,一个人挨着另一个人

链式存储结构——就是不把数据存放到一块地方,而是放在不同的地方,但是这样就无法体现逻辑结构了,因此这个链式存储的每一个数据的存储空间要加上一个指针,指向下一个位置

数据类型

数据类型想必大家已经很熟悉了吧,它的概念是——性质相同的值的集合及定义在此集合的一些操作的总称

那为什么要设计出来数据类型呢?

因为在计算中对于不同类型的值,它们的内存占用不同,计算方式也有所差异,因此,计算机的研究者考虑,对数据进行分类,然后分出多种数据类型

数据类型的分类

分为原子类型结构类型

是不可分解的基本类型——整型、实型、字符型等

有若干个类型组合而成,可以再分解,例如结构体和数组,对于数组而言它是由若港人相同类型数据组成的

抽象数据类型

对于高级语言程序员来说,所有的问题,我们只需要编写一个程序就可以,不需要考虑它在计算机里是如何转化的,如何运行的,因此对于很多问题而言,我们可以只把问题的本质抽象出来解决即可。那么这里就引出了一个概念——抽象数据类型(ADT)

一个数据模型及定义在该模型上的一组操作

其中的抽象是指把问题的本质给保留,而非本质的东西舍去,意义在于数据类型的数学操作特性

抽象数据类型包含一个数据对象,数据对象中各数据元素之间的关系在数据元素上进行的一系列操作

ADT 抽象数据类型名
Data 
    数据元素之间楼及关系的定义
Operator
    操作1
        初始条件
        操作结果描述
    操作2
        ……
endADT

抽象数据类型体现了问题分解、抽象、信息隐藏的特性

数据结构与算法的关系

我们经常可以看到所谓的数据结构和算法放到一起讲,但是算法和数据结构明明是两个概念?

为什么经常把他们放到一起呢?

——因为他们密不可分

数据结构与算法的关系就像——电影里的罗密欧与朱丽叶,当电影只讲其中的一个人的时候这个电影或许就没这么好看了,但是它们一旦结合到一起去讲,这个电影就完整了。

类比到数据结构——专讲数据结构那么结果会导致你不知道它到底创造出来是干嘛用的,但是当结合算法后你就会明白创造出这个概念的人真是很厉害。

数据结构是一个问题的抽象出来的形式,而算法是通过这个数据结构来解决这个问题。

但是一般来说大学中算法和数据结构往往分开讲解,算法是为了更好的理解数据结构

算法

定义

算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或者多个操作

特性

可行性

就是算法的每一步都是可行的

有穷性

算法在执行有限的步骤后自动结束,而不是陷入死循环

确定性

算法的每一条都必须有确定的含义,不能有二义性

输入输出

算法有0或者多个输入,但是必须至少有1个输出——因为如果一个算法不输出的话,这个算法干嘛用的?

设计要求

正确性

代码设计肯定现要求正确阿

可读性

这个代码不光是你自己看,要让其他的看你代码的人可以理解,这就是可读性

健壮性

如果输入了一些奇怪的数据,算法也要有相应的措施

时间效率高且存储量低

算法设计要时间的效率高,假如一个算法需要运行几天,那不是要命,而且要求存储量低,也就是数据占有的空间少,最好的是花最少的时间,用最少的存储空间

效率度量方法

既然在算法的设计要求里有效率高这一要求,(这里的效率是指算法的运行时间)那么效率该怎么去衡量呢?

事后统计方法

通过设计好的测试程序和数据,利用计算机的计时器对不同算法编制的程序运行时间比较,从而确定算法效率的高低。

在刚开始,是利用事后统计方法计算的效率,而这种方式就是让程序先运行一遍,然后在使用计算机中的计时器去计算这个程序所运行的时间,来由此估量效率

而这种方法会存在几个坏处

1.算法的测试数据困难——对于一些程序而言,它们可能更适合大量的数据,这时候输入的少量数据,反而会导致判断整个的效率低,而我们无法把每一种测试可能都测试一遍,所以设计测试数据比较困难

2.必须先依据算法事先编写好程序,但是这个往往需要大量时间,假如这个算法很烂,那么完全是在浪费时间

3.时间的比较往往依赖于计算机的硬件和软件等因素。

事前统计方法

因此针对于事后统计的坏处,一些人设计了一种在程序运行之前就可以计算它效率的方案——事前统计方法,利用统计方法来计算代码的运行次数,来因此判断其效率的大小

一个用高级程序语言编写的程序在计算机运行所消耗的时间主要取决于

⭐最终在分析程序的运行时间时,最重要的是把程序看成独立于程序设计语言的算法或者一系列步骤 

示例:

 这个算法是计算从0——100的和,这一种算法执行了2n+4次

int sum=0;//执行1次
int n=100;//执行1次
for(int i=0;i<n;i++)//执行n+1次
{
    sum=sum+i;//执行n次
}
printf("%d",sum);//执行1次

这个程序运行了n*n+2次

int sum=0,n=100,x=0;//执行1次
for(int i=1;i<=n;i++)
{
    for(int j=1;j<=n;j++)
    {
        x++;
        sum=sum+x;//执行n*n次
    }
}
printf("%d",sum);//执行1次

 

函数的渐进增长

对于函数f(n)和g(n)来说,总是存在n>N,使得f(n)<g(N),这样就说明g(n)的增长渐进大于f(n)

那么根据这个定义我们可以引出两个规则——在这个算法效率度量时,可以把加法常数给忽略,把最高此项的系数常数给忽略。 

因为它们在n的不断增加,它们的作用几乎没有,其实本质上算出来的算法效率——只看最高次项的指数。它越大那么函数随着n的增长也会增长很快。

这也就是事前统计方法的理论依据

时间复杂度

时间复杂度就是指算法的时间效率的估算。

定义:

在进行算法分析时,语句总的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随n的变化情况并确定T(n)的数量级,算法的时间复杂度,也就是算法的时间度量,记作:T(n)=O(f(n))。表示随问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐进时间复杂度,简称为时间复杂度,f(n)为问题规模n的某个函数

时间复杂度的计算方法通常称为——大O记法

一般来说,T(n)随着n增长增长速度最慢的算法为最优算法

这个方法的步骤如下:

  1. 把所有的加法常数变为1
  2. 把除最高次项以外的项舍去
  3. 如果最高次项有系数,那么除于这个系数
  4. 得出结果

下面介绍几个常见的时间复杂度

常数阶

O(1)

从大O记法来说,所有的常数阶,不论这个常数为多少,都记作O(1)

也就是说程序运行时间与问题的大小——即n的大小无关,称为常数阶

例如:

int i=1,sum=0;

sum=sum+i;

sum=sum+i;

这段代码就是一个典型的常数阶

线性阶

O(n)

线性阶的循环结构会比较复杂,通过确定莫格特定的语句或者语句段运行的次数来计算某个算法的阶数🔚

也就是说时间复杂度为O(n)的程序,因为其循环体中的代码要执行n次。

很典型的例子就是for循环——

for (int i=0;i<n;i++)
{
    //一行语句,时间复杂度为O(1)
}

对数阶

O(log n)

对数阶主要存在于用while循环的结构

在一个while循环中:

int count =1;
while(count<n)
{
    count=count*2;
}

每次count乘以2,count就离n靠近一点,也就是说当2^m>n时循环结束,m指count乘以2的次数,也是这行代码运行的次数——m=log2n

记为O(logn) 

平方阶

O(n^2)

对于循环嵌套循环的情况下,循环中的语句可能运行次数为n的平方次,记为O(n^2)

典型的案例如下:

for (int i=0;i<n;i++)
{
  for (int j=0;i<n;i++)
{
    //一行语句,时间复杂度为O(1)
}
}

效率比较

 

最坏情况与平均情况

最坏情况运行时间是一种保证,它是最慢的一种情况,考虑这个最坏的情况,那么对于一般的情况不会比这更慢了。

通常我们提到的运行时间都是指最坏情况的运行时间

平均时间情况是期望中的运行时间,所有情况的平均值,也是所有情况中最有意义的。

空间复杂度

算法的空间复杂度通过计算算法所需的存储空间实现,算法空间复杂度的计算公式记作S(n)=O(f(n)),n为问题的规模,f(n)为语句关于n所占的存储空间的函数

空间复杂度的概念是——这个程序在内存中所占用的大小

通常复杂度如果不注明的话——一般是指时间复杂度

总结

🆗到这里这个数据结构的知识就介绍完毕了,下面就开始一些具体的数据结构了——线性表、栈等,欢迎订阅合集,点赞收藏哦✌

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

nodejs版本管理工具nvm安装和环境变量配置

1、下载nvm.exe https://github.com/coreybutler/nvm-windows/releases2、安装 1.在D盘根目录新建一个dev文件夹&#xff0c;在dev里面再新建一个nodejs。 2.双击下载好的nvm.exe 修改文件路径&#xff0c;且路径中不能有中文 3.安装完成后在D:\dev\nvm打开settings.txt&…

网络信息安全:11个常见漏洞类型汇总

一、SQL注入漏洞 SQL注入攻击&#xff08;SQL Injection&#xff09;&#xff0c;简称注入攻击、SQL注入&#xff0c;被广泛用于非法获取网站控制权&#xff0c;是发生在应用程序的数据库层上的安全漏洞。 在设计程序&#xff0c;忽略了对输入字符串中夹带的SQL指令的检查&…

C语言写学生信息管理系统

说明:本博文来自CSDN-问答板块,题主提问。 需要:用C语言设计一个学生信息管理系统(尽量不使用指针),学生信息包括学号,姓名,数学成绩,C语言成绩,英语成绩和每个学生的总成绩这几项。系统要实现如下几个功能:1.添加学生2.删除学生3.修改学生信息4.查询学生信息5进行学…

阿里云服务器ECS u1实例性能怎么样?有用过的吗?

阿里云服务器u1是通用算力型云服务器&#xff0c;CPU采用2.5 GHz主频的Intel(R) Xeon(R) Platinum处理器&#xff0c;通用算力型u1云服务器不适用于游戏和高频交易等需要极致性能的应用场景及对业务性能一致性有强诉求的应用场景(比如业务HA场景主备机需要性能一致)&#xff0c…

自学高效备考2024年AMC10:2000-2023年1250道AMC10真题解析

我们今天继续来随机看5道AMC10真题&#xff0c;以及详细解析&#xff0c;这些题目来自1250道完整的官方历年AMC10真题库。通过系统研究和吃透AMC10的历年真题&#xff0c;参加AMC10的竞赛就能拿到好名次。即使不参加AMC10竞赛&#xff0c;初中和高中数学一定会学得比较轻松、游…

【深度学习应用】基于Bert模型的中文语义相似度匹配算法[离线模式]

1、准备中文离线模型 配置文件夹 文件获取方法&#xff1a; 访问官网&#xff1a;https://huggingface.co/bert-base-chinese/tree/main 下载以下文件 2、测试代码 # -*- coding: utf-8 -*- #pip install transformers -i https://mirrors.aliyun.com/pypi/simple/ #pip …

在整个价值链构建负责任的 AI

在整个价值链构建负责任的 AI&#xff1a;从数据到部署&#xff0c;以合乎伦理道德的方式构建 AI 构建合乎伦理道德的 AI 是所有人工智能企业的责任&#xff0c;这一点再怎么强调都不为过。负责任或合乎伦理道德的 AI 能够做到公正、公平&#xff0c;并能改善AI服务人群的生活…

2024年主攻外贸爆款产品,聚焦10个重要国家

2024年中企出海趋势明显&#xff0c;中小微企业纷纷布局。提供15个国家重点进口产品供参考&#xff0c;助力选品和行业开发。 以下是15个重点国家的爆款产品&#xff1a; 一、美国进口频次前10位 二、俄罗斯进口频次前10位 三、英国进口频次前10位 四、越南进口频次前10位 五…

Claude 3超越GPT-4?Anthropic发布新一代AI模型,Opus在多领域展现行业新水准,你不得不看的全面解析!

Anthropic发布了新一代AI模型——Claude 3。 这个系列包括Haiku、Sonnet和Opus三个模型。 特别是Opus&#xff0c;在多个基准测试中&#xff0c;它的表现都超过了我们熟知的GPT-4和Gemini 1.0 Ultra。 在数学、编程、多语言理解和视觉处理等多个方面&#xff0c;Opus都展现了…

期货开户交易切勿满仓操作

平时我们交易主要是仓位管理风险&#xff0c;切勿不要满仓操作&#xff0c;满仓相当于一锤子买卖&#xff0c;我们做交易要有交易计划&#xff0c;计划中除了开仓点.止损点.止盈点外&#xff0c;还有加仓点&#xff0c;所以我们要留下充足的加仓仓位&#xff0c;有很多投资者是…

如何处理Docker容器占用空间不断变大

在使用Docker容器时&#xff0c;一个常见的问题是容器占用的空间会不断增大&#xff0c;导致磁盘空间的快速耗尽。这种情况可能会给系统带来不必要的负担&#xff0c;因此需要及时处理。本文将介绍一些解决Docker容器占用空间不断增大问题的方法。 首先&#xff0c;我们需要了…

基于vgg16进行迁移学习服装分类

pytorch深度学习项目实战100例 的学习记录 我的环境&#xff1a; 白票大王&#xff1a; google colab 用其他的话&#xff0c;其实实现也行&#xff0c;但是让小白来重环境来开始安装的话&#xff0c;浪费时间 数据集 Clothing dataset 20 个不同类别的 5000 多张图片。 该…

基于springboot+vue实现电子商务平台管理系统项目【项目源码+论文说明】

基于springboot实现电子商务平台管理系统演示 研究的目的和意义 据我国IT行业发布的报告表明&#xff0c;近年来&#xff0c;我国互联网发展呈快速增长趋势&#xff0c;网民的数量已达8700万&#xff0c;逼近世界第一&#xff0c;并且随着宽带的实施及降价&#xff0c;每天约有…

【机器学习】包裹式特征选择之递归特征消除法

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;机器学习 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进…

基于Arduino的智能寻迹小车设计

目 录 摘 要 Ⅰ Abstract Ⅱ 引 言 1 1系统方案设计 3 1.1 方案论证 3 1.2 项目的总体设计 4 2 项目硬件设计 6 2.1 Arduino平台简介 6 2.2 ATmega328P单片机的最小系统 8 2.3 寻迹模块的设计 9 2.4 驱动模块的设计 11 2.5 电源模块的设计 14 2.6 按键电路的设计 15 2.7 蜂鸣器…

c++|内存管理

c|内存管理 C/C内存分布strlen 和 sizeof的区别 c语言动态内存管理方式malloccallocrealloc例题 c管理方式new/delete操作内置类型new/delete操作自定义类型证明 new 和 delete 的底层原理operator new与operator delete函数operator new 和 operator delete的 用法构造函数里面…

独家揭秘:AI大模型的神秘面纱

AI大模型&#xff0c;是当下人工智能领域里备受瞩目的技术&#xff0c;在推动科技进步和社会发展方面发挥着重要作用。然而&#xff0c;AI大模型的神秘面纱始终让人们充满好奇和探究。 首先&#xff0c;让我们来揭开AI大模型的面纱。在人工智能领域中&#xff0c;大模型是指参…

Idea 开启热部署 Devtools

一、背景 当我们在 idea 中修改代码的时候&#xff0c;idea 并不会自动的重启去响应我们修改的内容&#xff0c;而是需要我们手动的重新启动项目才可以生效&#xff0c;这个是非常不方便&#xff0c;但是可以在 idea 中开启这个自动热部署的功能。 我的 idea 版本为 2022.3.3 。…

Mosquitto介绍

一、Mosquitto介绍 Eclipse Mosquitto是一个开源的MQTT消息代理&#xff08;服务器&#xff09;软件。提供轻量级的&#xff0c;支持可发布/可订阅的的消息推送模式&#xff0c;使设备对设备之间的短消息通信变得简单&#xff0c;比如现在应用广泛的低功耗传感器&#xff0c;手…

怎么将电脑excel文档内的数据转换为图片形式

你平时在办公室会遇到格式转换的问题吗&#xff1f;比如PDF转Word&#xff0c;WPS转PDF&#xff0c;PDF转TXT&#xff0c;图片转PDF等。边肖最近在工作过程中遇到了类似的问题。为了更方便的查看表格&#xff0c;需要将Excel表格转换成图片格式。遇到这样的问题&#xff0c;很多…