《数据结构》(C语言版)第1章 绪论(下)

第1章 绪论

  • 1.3 抽象数据类型的表示与实现
  • 1.4 算法与算法分析

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

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

抽象数据类型(ADTs: Abstract Data Types)

  • 更高层次的数据抽象。
  • 由用户定义,用以表示应用问题的数据模型。
  • 由基本的数据类型组成,并包括一组相关的操作。

抽象数据类型可以用以下的三元组来表示

ADT = (D,S,P)
D:数据对象 S:D上的关系集 P:D上的操作集

ADT常用定义格式

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

信息隐蔽和数据封装,使用与实现相分离
在这里插入图片描述
抽象数据类型的表示与实现

  • 抽象数据类型可以通过固有的数据类型(如整型、实型、字符型等)来表示和实现。
  • 它有些类似C语言中的结构(struct)类型,但增加了相关的操作
  • 教材中用的是类C语言(介于伪码和C语言之间)作为描述工具
  • 但上机时要用具体语言实现,如C或C++等

复数—抽象数据类型的定义

ADT Complex {数据对象:D={e1,e2|e1,e2∈R,R是实数集}数据关系:S={<e1,e2>|e1是复数的实部,e2是复数的虚部}基本操作:Creat(&C,x,y)操作结果:构造复数c,其实部和虚部分别被赋予参数x和y的值。GetReal(C)初始条件:复数c已存在。操作结果:返回复数c的实部值。GetImag(C)初始条件:复数c已存在。操作结果:返回复数c的虚部值。Add(C1,C2)初始条件:C1,C2是复数。操作结果:返回两个复数C1和C2的和。Sub(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;
}
float GetReal(Complex C) 
{//取复数C=x+yi的实部return C.Realpart;
}
float GetImag(Complex C)
{//取复数C=x+yi的虚部return C.Imagepart;
}
Complex Add(Complex C1,Complex C2)
{//求两个复数C1和C2的和sumComplex sum;sum.Realpart=C1.Realpart+C2.Realpart;sum.Imagepart=C1.Imagepart+C2.Imagepart;return sum;
}
Complex Sub(Complex C1,Complex C2)
{//求两个复数C1和C2的差differenceComplex difference;difference.Realpart=C1.Realpart-C2.Realpart; difference.Imagepart=C1.Imagepart-C2.Imagepart; return difference;
}
  1. 预定义常量及类型
//函数结果状态代码
#define OK 1 
#define ERROR 0 
#define OVERFLOW -2 // Status是函数返回值类型,其值是函数结果状态代码。 typedef  int  Status; 
  1. 数据元素被约定为ElemType 类型,用户需要根据具体情况,自行定义该数据类型。
  2. 算法描述为以下的函数形式:
    函数类型 函数名(函数参数表)
    {
    语句序列;
    }
  3. 内存的动态分配与释放
    使用new和delete动态分配和释放内存空间
    分配空间 指针变量=new数据类型;
    释放空间 delete指针变量;
  4. 赋值语句
  5. 选择语句
  6. 循环语句
  7. 使用的结束语句形式有:
    函数结束语句 return
    循环结束语句 break;
    异常结束语句 exit(异常代码);
  8. 输入输出语句形式有:
    输入语句 cin (scanf)
    输出语句 cout (printf)
  9. 扩展函数有:
    求最大值 max
    求最小值 min

1.4 算法与算法分析

算法与算法分析
一个有穷的指令集,这些指令为解决某一特定任务规定了一个运算序列

算法的描述
自然语言、流程图、程序设计语言、伪码

算法的特性
输入 有0个或多个输入
输出 有一个或多个输出(处理结果)
确定性 每步定义都是确切、无歧义的
有穷性 算法应在执行有穷步后结束
有效性 每一条运算应足够基本

算法的评价
正确性、可读性、健壮性、高效性(时间代价、空间代价)

算法的效率的度量
用依据该算法编制的程序在计算机上执行所消耗的时间来度量

事后统计
利用计算机内的计时功能,不同算法的程序可以用一组或多组相同的统计数据区分

缺点
必须先运行依据算法编制的程序
所得时间统计量依赖于硬件、软件等环境因素,掩盖算法本身的优劣

事前分析估计
一个高级语言程序在计算机上运行所消耗的时间取决于:

  • 依据的算法选用何种策略
  • 问题的规模
  • 程序语言
  • 编译程序产生机器代码质量
  • 机器执行指令速度

同一个算法用不同的语言、不同的编译程序、在不同的计算机上运行,效率均不同,——使用绝对时间单位衡量算法效率不合适

时间复杂度的渐进表示法
算法中基本语句重复执行的次数是问题规模n的某个函数f(n),算法的时间量度记作:T(n)=O(f(n)) 。
表示随着n的增大,算法执行的时间的增长率和f(n)的增长率相同,称渐近时间复杂度。
数学符号“O”的定义为:若T(n)和f(n)是定义在正整数集合上的两个函数,则T(n) = O(f(n))表示存在正的常数C和n0,使得当n≥n0时都满足0≤T(n)≤Cf(n)。

算法中重复执行次数和算法的执行时间成正比的语句对算法运行时间的贡献最大
n越大算法的执行时间越长

  • 排序:n为记录数
    矩阵:n为矩阵的阶数
    多项式:n为多项式的项数
    集合:n为元素个数
    树:n为树的结点个数
    图:n为图的顶点数或边数

在这里插入图片描述
n * n阶矩阵加法

for( i = 0; i < n; i++)for( j = 0; j < n; j++)c[i][j] = a[i][j] + b[i][j];

语句的频度(Frequency Count ): 重复执行的次数:n*n;

T(n) = O (n2)

即:矩阵加法的运算量和问题的规模n的平方是同一个量级

分析算法时间复杂度的基本方法
找出语句频度最大的那条语句作为基本语句
计算基本语句的频度得到问题规模n的某个函数f(n)
取其数量级用符号“O”表示

x = 0;  y = 0;
for ( int k = 0; k < n; k ++ )x ++;
for ( int i = 0; i < n; i++ )for ( int j = 0; j < n; j++ )y ++;

T(n) = O(n2)
f(n)=n2

时间复杂度是由嵌套最深层语句的频度决定的

void exam ( float x[ ][ ], int m, int n ) {float sum [ ];for ( int i = 0; i < m; i++ ) { sum[i] = 0.0;                      for ( int j = 0; j < n; j++ ) sum[i] += x[i][j];  }for ( i = 0; i < m; i++ )cout << i <<:<<sum [i] << endl; 
}

T(n) = O(mn)
f(n)=m
n

例1:N×N矩阵相乘

for(i=1;i<=n;i++)for(j=1;j<=n;j++){c[i][j]=0;	for(k=1;k<=n;k++)c[i][j]=c[i][j]+a[i][k]*b[k][j];}	

T(n) = O(n3)
算法中的基本操作语句为c[i][j]=c[i][j]+a[i][k]*b[k][j];
T ( n ) = ∑ i = 1 n ∑ j = 1 n ∑ k = 1 n 1 = ∑ i = 1 n ∑ j = 1 n n = ∑ i = 1 n n 2 = n 3 = O ( n 3 ) T(n)=\sum_{i=1}^{n}\sum_{j=1}^{n}\sum_{k=1}^{n}1=\sum_{i=1}^{n}\sum_{j=1}^{n}n=\sum_{i=1}^{n}n^2=n^3=O(n^3) T(n)=i=1nj=1nk=1n1=i=1nj=1nn=i=1nn2=n3=O(n3)

例2

for( i=1; i<=n; i++) for (j=1; j<=i; j++) for (k=1; k<=j; k++)x=x+1;

定理1.1
若f(n)=amnm+am-1nm-1++a1n+a0是m次多项式,则T(n)=O(nm)。
O(nm)忽略所有低次幂项和最高次幂系数,体现出增长率的含义
语句频度 = ∑ i = 1 n ∑ j = 1 i ∑ k = 1 j = ∑ i = 1 n ∑ j = 1 i j = ∑ i = 1 n i ( i + 1 ) 2 = 1 2 ∑ i = 1 n i 2 + ∑ i = 1 n i = 1 2 ( n ( n + 1 ) ( 2 n + 1 ) 6 + n ( n + 1 ) 2 ) = n ( n + 1 ) ( n + 2 ) 6 语句频度=\sum_{i=1}^{n}\sum_{j=1}^{i}\sum_{k=1}^{j}=\sum_{i=1}^{n}\sum_{j=1}^{i}j=\sum_{i=1}^{n}\frac{i(i+1)}{2}=\frac{1}{2}\sum_{i=1}^{n}i^2+\sum_{i=1}^{n}i=\frac{1}{2}\left( \frac{n(n+1)(2n+1)}{6}+\frac{n(n+1)}{2}\right) =\frac{n(n+1)(n+2)}{6} 语句频度=i=1nj=1ik=1j=i=1nj=1ij=i=1n2i(i+1)=21i=1ni2+i=1ni=21(6n(n+1)(2n+1)+2n(n+1))=6n(n+1)(n+2)

例3:分析以下程序段的时间复杂度

i=1;   //1
while(i<=n)i=i*2;   //2

2f(n)≤n,即f(n)≤log2n,取最大值f(n)=log2n
所以该程序段的时间复杂度T(n) =O(log2n)

有的情况下,算法中基本操作重复执行的次数还随问题的输入数据集不同而不同
例4:顺序查找,在数组a[i]中查找值等于e的元素,返回其所在位置。

for (i=0;i< n;i++)if (a[i]==e) return i+1;return 0;

最好情况:1次;最坏情况:n;平均时间复杂度为:O(n)

当n取得很大时,指数时间算法和多项式时间算法在所需时间上非常悬殊
在这里插入图片描述
时间复杂度T(n)按数量级递增顺序为:
在这里插入图片描述
渐进空间复杂度

空间复杂度;算法所需存储空间的度量,记作: S(n)=O(f(n))
其中n为问题的规模(或大小)

算法要占据的空间;算法本身要占据的空间,输入/输出,指令,常数,变量等;算法要使用的辅助空间

例5:将一维数组a中的n个数逆序存放到原数组中。
【算法1】

for(i=0;i<n/2;i++){   t=a[i];a[i]=a[n-i-1];a[n-i-1]=t;} 

S(n) = O(1) 原地工作

【算法2】

for(i=0;i<n;i++)b[i]=a[n-i-1];
for(i=0;i<n;i++)a[i]=b[i];

S(n) = O(n)

小结

  1. 数据、数据元素、数据项、数据结构等基本概念
  2. 对数据结构的两个层次的理解(逻辑结构、存储结构)
  3. 抽象数据类型的表示方法
  4. 算法、算法的时间复杂度及其分析的简易方法

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

3DM游戏运行库合集离线安装包2024最新版

3DM游戏运行库合集离线安装包是一款由国内最大的游戏玩家论坛社区3DM推出的集成式游戏运行库合集软件&#xff0c;旨在解决玩家在玩游戏时遇到的运行库缺失或错误问题。该软件包含多种常用的系统运行库组件&#xff0c;支持32位和64位操作系统&#xff0c;能够自动识别系统版本…

快速上手AWS cloudfront产品

AWS CloudFront&#xff0c;亚马逊推出的卓越全球内容分发网络服务&#xff0c;专为加速网站内容的极速传输而设计&#xff0c;旨在大幅度削减加载延迟&#xff0c;同时确保内容传递过程中的高度安全性和无懈可击的可靠性。借助CloudFront的强大功能&#xff0c;用户能够轻松实…

腾讯云服务器windows系统如何转linux系统

本人购买了腾讯云服务&#xff0c;进去后发现是windows系统的&#xff0c;有点郁闷&#xff08;使用不习惯&#xff09;&#xff0c;于是就去查查看看能不能将Windows系统转成linux系统&#xff0c;网上也有解决办法&#xff0c;但是貌似跟现在的腾讯云后台不一致&#xff0c;下…

Flink学习之Flink SQL(补)

Flink SQL 1、SQL客户端 1.1 基本使用 启动yarn-session yarn-session.sh -d启动Flink SQL客户端 sql-client.sh--退出客户端 exit;测试 重启SQL客户端之后&#xff0c;需要重新建表 -- 构建Kafka Source -- 无界流 drop table if exists students_kafka_source; CREATE TABL…

软件生命周期(二)

1. 软件生命周期定义 软件生命周期&#xff08;SDLC&#xff09;是软件开始研制到最终废弃不用所经历的各个阶段 – 软件开发模型 2. 瀑布型生命周期模型 瀑布模型规定自上而下&#xff0c;相互衔接的固定次序&#xff0c;如同瀑布流水&#xff0c;逐级下落&#xff0c;具有…

sqli-labs(超详解)——Lass32~Lass38

Lass32&#xff08;宽字节注入&#xff09; 源码 function check_addslashes($string) {$string preg_replace(/. preg_quote(\\) ./, "\\\\\\", $string); //escape any backslash$string preg_replace(/\/i, \\\, $string); …

double类型 精度丢失的问题

前言 精度丢失的问题是在其他计算机语言中也都会出现&#xff0c;float和double类型的数据在执行二进制浮点运算的时候&#xff0c;并没有提供完全精确的结果。产生误差不在于数的大小&#xff0c;而是因为数的精度。 一、double进行运算时,经常出现精度丢失 0.10.2使用计算…

记录一次网关无响应的排查

1. 使用jstack pid > thread.txt 打印进 thread.txt 文件里 去观察线程的状态。 我发现&#xff0c;一个线程在经过 rateliter的prefilter后, 先是调用 consume方法&#xff0c;获取到锁。 接着在执行 jedis的 evalsha命令时 一直卡在socket.read()的状态。 发现jedis官…

软件测试必备技能

在软件测试领域&#xff0c;以下是一些必备的技能和能力&#xff0c;可以帮助你成为一名优秀的软件测试工程师&#xff1a; 1. 测试基础知识&#xff1a; 熟悉软件测试的基本概念、原则和流程&#xff0c;包括不同类型的测试&#xff08;如单元测试、集成测试、系统测试&#…

这几个高级爬虫软件和插件真的强!

亮数据&#xff08;Bright Data&#xff09; 亮数据是一款强大的数据采集工具&#xff0c;以其全球代理IP网络和强大数据采集技术而闻名。它能够轻松采集各种网页数据&#xff0c;包括产品信息、价格、评论和社交媒体数据等。 网站&#xff1a;https://get.brightdata.com/we…

LLM(大语言模型)「Agent」开发教程-LangChain(三)

v1.0官方文档&#xff5c;最新文档 一、LangChain入门开发教程&#xff1a;Model I/O 二、基于LangChain的RAG开发教程 LangChain是一个能够利用大语言模型&#xff08;LLM&#xff0c;Large Language Model&#xff09;能力进行快速应用开发的框架&#xff1a; 高度抽象的组件…

智能仪表板DevExpress Dashboard v24.1 - 新增级联参数过滤

使用DevExpress Analytics Dashboard&#xff0c;再选择合适的UI元素&#xff08;图表、数据透视表、数据卡、计量器、地图和网格&#xff09;&#xff0c;删除相应参数、值和序列的数据字段&#xff0c;就可以轻松地为执行主管和商业用户创建有洞察力、信息丰富的、跨平台和设…

揭秘LoRA:利用深度学习原理在Stable Diffusion中打造完美图像生成的秘密武器

文章目录 引言LoRA的原理LoRA在角色生成中的应用LoRA在风格生成中的应用LoRA在概念生成中的应用LoRA在服装生成中的应用LoRA在物体生成中的应用结论 引言 在生成式人工智能领域&#xff0c;图像生成模型如Stable Diffusion凭借其出色的生成效果和广泛的应用场景&#xff0c;逐…

NVIDIA Triton系列03-开发资源说明

NVIDIA Triton系列03-开发资源说明 大部分要学习 Triton 推理服务器的入门者&#xff0c;都会被搜索引擎或网上文章引导至官方的 https://developer.nvidia.com/nvidia-triton-inference-server 处&#xff08;如下截图&#xff09;&#xff0c;然后从 “Get Started” 直接安…

Google四年推迟两次,Cookie不弃了,但也不藏了

四年两次推迟&#xff0c;这段改变了数字广告生态系统发展的代码&#xff0c;还是被Google保留了下来。2020年&#xff0c;Google第一次提出&#xff0c;将在2022年初结束Cookie的使用&#xff0c;同步推出隐私沙盒计划&#xff1b;2021年6月&#xff0c;Google第一次进行了延迟…

人脸识别Arcface的Tensorrt C++

代码已经上传至github&#xff0c;欢迎使用&#xff0c;不是为了研究人脸识别&#xff0c;而是为了实现Tensorrt部署Arcface模型&#xff0c;推理耗时33ms左右~ GitHub - Broad-sky/face-recognition-arcface-tensort: This project mainly implements the transplantation of…

50etf期权行权采用什么交割方式 ?

50ETF期权是欧式期&#xff0c;要到期日当天才能行权交制&#xff0c;其交割方式是实物交割买卖双方在到期行权日时需要准备一手交钱&#xff0c;一手收货或是一手交&#xff0c;一手收钱&#xff0c;如果持有期权到达到期日之前&#xff0c;投资者认为行权并不划算&#xff0c…

Linux 照片图像编辑器

前言 照片图像编辑器是一种软件程序,它允许用户对数字照片或图像进行各种编辑和修改。以下是一些常见的功能及其解释: 裁剪与旋转 : 裁剪:移除图像的某些部分,以改善构图或符合特定尺寸要求。旋转:改变图像的方向,可以校正歪斜的照片或者为了艺术效果而旋转。调整亮度…

【画流程图工具】

画流程图工具 draw.io draw.io&#xff08;现称为 diagrams.net&#xff09;是一款在线图表绘制工具&#xff0c;可以用于创建各种类型的图表&#xff0c;如流程图、网络图、组织结构图、UML图、思维导图等。以下是关于它的一些优点、应用场景及使用方法&#xff1a; 优点&a…

密码学基础-身份认证

密码学基础-身份认证 概述 书信的亲笔签名&#xff1b;公文、证书的印章起到了核准、认证的功能。 如前文密码学基础-数据加密所述&#xff0c;信息安全少不了身份认证的话题。只有认证了信息的来源&#xff0c;我们才能知道这条信息是否是正确的&#xff0c;合法的&#xff…