各位亲爱的读者,大家好!今天博主给大家带来的内容是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.pswp.cn/bicheng/82666.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/82666.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/82666.shtml

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

相关文章

ABC 350

E. Toward 0 从大规模向小规模,用记忆化搜索,只需要分好类,有哪几种搜法。 期望实际上就是把每一种情况的答案答案都算出来,然后取个平均值 ,并不困难。 f ( i ) [ f ( i / 6 ) f ( i / 5 ) f ( i / 4 ) f ( i / 3…

多相电机驱动控制学习(1)——基于双dq坐标系的六相/双三相PMSM驱动控制

1.引言 最近想学习一下多相电机。想从相对简单的开始吧,先学一个基于双dq的六相/双三相PMSM驱动控制(考虑中性点隔离以及不隔离的情况,即考虑是否有零序电流回路),后面有时间再学学基于VSD的六相/双三相PMSM驱动控制。…

笔记: 在WPF中ContentElement 和 UIElement 的主要区别

一、目的:简要姐扫在WPF中ContentElement 和 UIElement 的主要区别 ContentElement 和 UIElement 是 WPF 中的两个基类,它们在功能和用途上有显著的区别。 二、主要区别 ContentElement 主要特点: • 没有视觉表示: ContentElement 本身不直接渲染任…

Android-Glide学习总结

Glide三级缓存​ 面试官 我看你简历里提到熟悉 Glide,能聊聊它的缓存机制吗?比如加载图片的时候,Glide 是怎么决定从内存还是磁盘读取的? ​你​ 哦,Glide 的缓存机制是吧?嗯,这个我之前在做项…

安卓证书的申请(保姆级图文)

目录 确认安装了对应版本的jdk生成证书文件1. -genkey2. -alias test_certalias3. -keyalg RSA4. -keysize 20485. -validity 365006. -keystore test_cert.keystore 查看证书内容总结 欢迎关注 『发现你走远了』 博客,持续更新中 欢迎关注 『发现你走远了』 博客&a…

Unity性能优化

SetPass calls表示在当前摄像机的渲染过程中,Unity切换着色器通道(Shader Pass)来渲染游戏对象的次数。一个着色器(Shader)可以包含多个着色器通道,每个着色器通道可以通过不同的方式来渲染游戏对象。但每次…

Python+AI Agent:解锁MCP Servers的智能潜力

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「storms…

uni-app学习笔记十五-vue3页面生命周期(一)

页面生命周期概览 vue3页面生命周期如下图所示: onLoad 此时页面还未显示,没有开始进入的转场动画,页面dom还不存在。 所以这里不能直接操作dom(可以修改data,因为vue框架会等待dom准备后再更新界面)&am…

【排序算法】快速排序详解--附详细流程代码

快速排序算法 介绍 快速排序(Quick Sort)是一种高效的分治排序算法,由英国计算机科学家 Tony Hoare 于 1960 年提出。它是实际应用中最常用的排序算法之一。快速排序的基本思想是:选择一个"基准"(pivot&am…

【监控】Prometheus中的告警机制介绍

prometheus实战之三:告警规则_验证prometheus告警规则-CSDN博客 Prometheus是一款开源的系统监控和告警工具,其告警功能是保障系统稳定运行的重要部分。以下将从告警的整体架构、核心概念、规则配置以及具体的通知流程等方面对Prometheus中的告警进行介…

53、用例(Use Case)详解

1. 定义与核心概念 用例(Use Case) 是软件工程中用于描述系统功能需求的核心工具,它通过结构化的方式定义系统与外部参与者(用户、其他系统)之间的交互行为,以实现具体的业务目标。用例强调从用户视角出发…

对比Redis与向量数据库(如Milvus)在AI中的应用

对比Redis与向量数据库(如Milvus)在AI中的应用 在AI架构中,缓存系统的设计直接影响响应速度、资源成本以及推理路径是否高效。而面对不同的AI业务诉求,选用什么类型的缓存系统、如何搭配,往往是系统架构设计中必须深入…

Oracle 的 MOVE 操作是否重建表?

Oracle 的 MOVE 操作是否重建表? Oracle 的 ALTER TABLE ... MOVE 操作实质上是重建表的物理存储结构,但保留表的逻辑定义不变。 MOVE 操作的本质 物理重建: 创建新的数据段(物理存储结构)将原表数据按顺序重新插入到…

数据库中表的设计规范

表的结构 列:由多个字段构成,每个字段存储单一数据项,列的先后顺序对表没有影响 行:记录,一个表中不能存在完全相同的两行,行的顺序对表没有影响 主键:primary key 表中的一列或多列组合起来…

[学习]C语言指针函数与函数指针详解(代码示例)

C语言指针函数与函数指针详解 文章目录 C语言指针函数与函数指针详解一、引言二、指针函数(函数返回指针)定义与语法典型应用场景注意事项 三、函数指针(指向函数的指针)定义与声明初始化与调用赋值方式调用语法 高级应用回调函数…

Python 实现桶排序详解

1. 核心原理 桶排序是一种非比较型排序算法,通过将数据分配到多个“桶”中,每个桶单独排序后再合并。其核心步骤包括: 分桶:根据元素的范围或分布,将数据分配到有限数量的桶中。桶内排序:对每个非空桶内的…

brep2seq 论文笔记

Brep2Seq: a dataset and hierarchical deep learning network for reconstruction and generation of computer-aided design models | Journal of Computational Design and Engineering | Oxford Academic 这段文本描述了一个多头自注意力机制(MultiHead Attenti…

在 LangGraph 中集成 Mem0 记忆系统教程

简介 LangGraph 是一个强大的对话流程编排框架,而 Mem0 则是一个高效的记忆系统。本教程将介绍如何将两者结合,创建一个具有记忆能力的客服助手系统。 环境准备 首先安装必要的依赖: pip install langgraph mem0 langchain openai基础配置…

ceph 报错 full ratio(s) out of order

full ratio(s) out of order你遇到的错误信息: full ratio(s) out of order说明你设置的 OSD 空间使用阈值之间的数值顺序不正确,即: nearfull_ratio ≤ backfillfull_ratio ≤ full_ratio ≤ osd_failsafe_full_ratio如果它们的关系不满足这个顺序,Ceph 就会报这个错误。…

NB-IoT NPUSCH(三)-资源映射

资源映射单独做一章节,是因为NPUSCH的资源映射比较复杂。与LTE不同,为了提高数据传输的质量,NB-IoT的数据会有重复传输。NPUSCH一开始生成的TBS只与子载波个数、RU个数有关,与重复次数没有关系。初始产生的数据为 个时隙&#xff…