当前位置: 首页 > backend >正文

数据结构与算法Day3:绪论第三节抽象数据类型、算法及其描述

        各位亲爱的读者,大家好!今天博主给大家带来的内容是C语言数据结构与算法当中抽象数据类型、算法及其分析的相关知识。

一.抽象数据类型

        抽象数据类型:指的是用户进行软件系统设计时从问题的数据模型中抽象出来的逻辑数据结构和逻辑数据结构上的运算。而不考虑计算机的具体存储结构和运算的具体实现算法。

        一个抽象数据类型可以用一个三元组(D,R,P)来表示,其中D是数据对象,R是D上的关系集,P是D中数据运算的基本运算集,基本描述格式如下:

ADT抽象数据类型名

{数据对象:数据对象的声明;

 数据关系:数据关系的声明;

 基本运算:基本运算的声明;

}

 其中,基本运算的声明格式为:

基本运算名(参数表):运算功能描述;

基本运算有两种参数:值参数只为运算提供输入值,引用参数以&打头,除了可以提供输入值外,还将返回运算结果。

抽象数据类型有两个重要特征:数据抽象和数据封装。

数据抽象:指用ADT描述程序处理的数据的特征、其所能完成的功能以及它和外部用户的接口(即外界使用它的方法)。

数据封装:指将程序的外部特征和其内部实现细节分离,并且对外部用户隐藏其内部实现细节。 

抽象数据类型由数据的逻辑结构和运算定义两部分组成,需要通过基本数据类型来实现。

二.算法及其描述

1.算法的定义

        算法是对特定问题求解步骤的一种描述,它是指令的有限序列。应具有以下5个重要的特性

有穷性,确定性,可行性,有输入,有输出 

 注意:算法和程序是有区别的,程序是指使用某种计算机语言对一个算法的具体实现,即具体怎么做,而算法侧重于对解决问题的方法描述,即要做什么。

2.算法设计的目标

        算法设计应该满足以下几个目标:

正确性,可使用性,可读性,健壮性,高效率与低存储量需求

 其中健壮性要求算法具有很好的容错性,即提供异常处理,能够对不合理的数据进行检查,不经常出现中断或者死机现象。

3.算法的描述

        在使用C/C++来描述算法的时候,一般格式如下

返回值  算法对应的函数名(形参列表)

{

        临时变量的定义

        实现由输入参数到输出参数的操作

        .......

}

其中花括号内的部分被称为函数体 

设计算法的一般步骤如下:

(1)分析算法的功能

(2)确定算法有哪些输入,将这些输入设计成输入型参数;确定算法有哪些输出,将这些输出设计为输出型参数

(3)设计函数体,完成从输入到输出的操作过程

 而在设计输出型参数的时候,我们会常常用到一种引用运算符“&”,当引用建立时,程序用另一个已定义的变量(目标变量)的名字对其初始化,此时引用变量作为目标变量的别名使用,对引用变量的改动实际上是对目标变量的改动,我们可以用以下代码来进行理解

void swap(int &x,int &y)
{int tmp=x;x=y;y=tmp;    
}
int &x=a;
int &y=b;//执行上述语句后,形参与实参的匹配如下
int &x=a;//x为a的引用
int &y=b;//y为b的引用

这样子,a与x共享存储空间,b与y共享存储空间,因此执行函数后a和b的值都发生了交换。

学以致用,我们可以用这种办法来设计一个算法,求一元二次方程的根

int solution(double a,double b,double c,double &x1,double &x2)
{double d;d=b*b-4*a*c;if(d>0){x1=(-b+sqrt(d))/(2*a);x2=(-b-sqrt(d))/(2*a);return 2;}else if(d==0){x1=(-b)/(2*a);return 1;}elsereturn 0;
}

三.今日总结

        在今天的学习中,博主给大家带来了C语言数据结构与算法中的抽象数据类型与算法描述的相关知识,在下一次的学习中,博主将会给大家带来算法分析的相关知识,在这里感谢大家的关注与支持!欢迎在评论区分享属于你的看法与见解,博主看到后会第一时间回复!

http://www.xdnf.cn/news/9290.html

相关文章:

  • 图论回溯
  • Linux基本指令篇 —— touch指令
  • SOC-ESP32S3部分:16-I2C
  • java常用工具类:生成唯一id
  • 对称二叉树
  • STM32F407VET6学习笔记5:STM32CubeMX配置串口工程_HAL库
  • 互联网大厂Java求职面试:从Spring到微服务的技术探讨
  • go tour方法和接口
  • 解决Linux下C++智能指针编译错误:`_Lock_policy`未定义问题
  • 高光谱成像相机应用:纸质文物“狐斑”无损检测
  • 华为HCIP-Cloud-Service认证H13-821V2.0-002
  • Qtc++开发遇到的问题-按钮点击不管用?
  • “以光惠算”走进校园,湖北大学用F5G-A全光网赋能智慧校园
  • 服务发现Nacos
  • 以少学习:通过无标签数据从大型语言模型进行知识蒸馏
  • HTTP/2与HTTP/3特性详解:为你的Nginx/Apache服务器开启下一代Web协议
  • Unity 游戏优化(持续更新中...)
  • React从基础入门到高级实战:React 核心技术 - 动画与过渡效果:提升 UI 交互体验
  • 前端八股之HTML
  • mobaxterm通过ssh登录docker无图形界面
  • 自然语言处理入门及文本预处理
  • 华为云Flexus+DeepSeek征文|ModelArts Studio开通DeepSeek-V3与R1商用服务实践与体验
  • 速通《Sklearn 与 TensorFlow 机器学习实用指南》
  • PyTorch入门-torchvision
  • 零基础远程连接课题组Linux服务器,安装anaconda,配置python环境(换源),在服务器上运行python代码【3/3 适合小白,步骤详细!!!】
  • 【R语言编程绘图-折线图】
  • Redis C语言连接教程
  • Linux 环境下C、C++、Go语言编译环境搭建秘籍
  • 常见编码小结
  • 常见JDK安装配置