软件构造—ADT的理解_怎么定义一个adt-程序员宅基地

技术标签: 数据结构  

最近学习了ADT,即抽象数据类型,刚学的时候理解的不是很好,在完成lab2的过程中,我对ADT的构造以及作用有了一定的理解。(以下仅是我个人理解,很可能会有错误,请批评指正)

ADT的定义:

 首先什么是ADT,它是计算机科学中具有类似行为的特定类别的数据结构的数学模型;或者具有类似语义的一种或多种程序设计语言的数据类型。抽象数据类型是间接定义的,通过其上的可执行的操作以及这些操作的效果的数学约束(与可能的代价)。

抽象数据类型(ADT)是纯粹理论实体,用于简化描述抽象算法,分类与评价数据结构,形式描述程序设计语言的类型系统。一个ADT可以用特定数据类型或数据结构实现,在许多程序设计语言中有许多种实现方式;或者用形式规范语言描述。ADT常实现为模块(module):模块的接口声明了对应于ADT操作的例程(procedure),有时用注释描述了约束。

二.  ADT的作用:

根据我的理解,ADT是抽象数据类型,归根结底,它是一种数据类型,只不过是由我们根据我们的需求自己去定义构造出的数据类型。

就像基本数据类型一样,我可以用int i=1去产生一个局部变量i,也可以用我自己构造的Graph去创建一个图变量,例如Graph graph=new Graph(),然后根据我对Graph中方法的实现,可以用graph直接调用实现的方法,例如加点、加边、删除等操作,这样就不需要我再重新在类中实现这些方法。

所以我认为ADT的作用是可以让我们更加方便的去解决很多复杂问题,并且它拥有良好的封装性(前提是构造ADT时要充分考虑到数据的保护),使用的过程很难让人明白它工作的原理,除非去查看源代码,这样就有了很好的安全性。

还是根据Graph去解释,如果我们没有构造这个ADT的话,那么我们如果想要创建一张图的话应该怎么做呢,并且要实现很多的功能,那么我们只能去声明几个集合,比如用list存点、用map存对应点及权值......然后再实现我们需要的功能,去写一个个方法,如果这么去构造的话,是不是有一种非常散乱没有条理的感觉呢,给人的感觉也不好。而如果我们先去构造一个ADT呢,将这些要求都在其中完成,然后我们再去利用这个ADT,那么直接用graph.方法就可以了,那么一个graph就是一张图,是不是感觉整体性很强呢,而且很清晰。

三.  ADT的构造:

要实现:(以茶杯举例,借鉴于学长)

     构造器 : 凭空直接给你造出一个茶杯

生产器 : 放入一个白色的茶杯,与一些颜料,给你返回一个黑色的茶杯

观察器 : 看下茶杯是否为空的,里面的茶叶是什么品种的.

变值器 : 放入一个空茶杯,返回一个打满了茶水的茶杯.改变对象属性的方法,通常返回void,如果返回值为void,则必然意味着它改变了对象的某些内部状态,但变值器也可能返回非空类型如果是不可变类型,则可忽略变值器

四.  ADT的有关概念:

     (重点理解)

     AF(抽象函数):抽象函数描述了对表示的抽象,表示只能说是对一种实际事物的代码层面的抽象,距离数学上的抽象还有一定距离.抽象函数就描述了这段距离是如何行进的.

形式化地描述,AF:R→A,其中R为表示的集合,A为表示的抽象描述的集合.开发者更关注集合R,而客户更关注集合A(事实上他们只能从spec描述的操作得知A).AF一定是一个满射,因为抽象集合中的每个元素都应至少由一种表示实现;AF不一定是单射,可能存在多种表示实际上能被一种抽象所描述;也未必双射,因为不是所有的表示值都能映射到抽象域中

     RI(表示不变量):表示不变量是在任何操作序列执行后表示需要满足的一些条件.最基本的一个表示不变量就是可变/不可变性,它是指该类能否在不创建新对象的情况下改变对象内容的性质.除此之外,ADT还应该定义一些其他的RI,并适时地检查是否符合RI,RI的定义依赖于ADT的性质,例如对集合来说,RI还应该有包含的元素两两不同,对于三角形来说,应该保证边长为正,两边之和大于第三遍,两边之差小于第三边.通常在构造器,生产器,变值器完成其工作并返回之前都应检测是否符合RI.

    其实我认为可以简单的理解为定义域。

表示独立性:我们说一个ADT有良好的表示独立性,就是说客户在使用ADT时不必关心内部表示是怎样的,所有操作的使用方法和效果都在开发者和客户约定的spec中描述清楚,明确规定输入量的约束条件和输出量的形式,并且开发者需要保证在输入正确的情况下输出的正确性和安全性.这就引出了另一个概念:表示泄露,指的是客户通过某些操作(例如调用观察器等)直接得到了ADT的内部表示,这就可能带来一些安全问题.

表示泄露:为了避免表示泄露,使用private,而不用public,根据情况使用final,进行防御性拷贝。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_59437923/article/details/125121559

智能推荐

Yolov1 + Yolov2 + Yolov3 发展史、论文、代码最全资源分享合集 ! ! !_yolov用什么语言-程序员宅基地

文章浏览阅读1.8k次,点赞4次,收藏36次。点击上方“码农的后花园”,选择“星标”公众号 精选文章,第一时间送达YOLO之父Jeseph Redmon毕业于美国米德尔伯里学院计算机科学专业,辅修数学,他主要研究范围是..._yolov用什么语言

离散 Hopfield 神经网络的分类与matlab实现_离散hopfield神经网络 科研能力分类 例子 matlab-程序员宅基地

文章浏览阅读738次。科研能力是高校的核心能力,其高低已成为衡量一所高校综合实力的重要指标。科研能力的高低不仅影响高校自身的发展,对高校所在地区的经济发展也有很大的影响。如何准确评价高校的科研能力已成为摆在政府、企业和高校面前的一个十分重要的问题。影响科研能力的因素众多,且互相交叉,互相渗透和互相影响,无法用确定的数学模型进行描述。目前,高校科研能力评价的方法很多,但普遍存在工作繁琐、时间滞后等缺点,且人为主观因素对评价结果有很大的影响。如何快速,准确地对众多高校的科研能力进行客观、公正地评价?这是一个目前亟待解决的问题。_离散hopfield神经网络 科研能力分类 例子 matlab

VUE移动到指定位置(scrollIntoView)----亲测避坑_scrollintoview的坑-程序员宅基地

文章浏览阅读1.6w次,点赞6次,收藏20次。用(scrollIntoView)来实现移动到指定位置建议不要放在(mt-loadmore)里使用,不然头部会被挤上去----亲测html<div id="pronbit" ref="pronbit">需要移动到的位置</div>js//选中iddocument.getElementById(e).scrollIntoView({ behavior: "sm..._scrollintoview的坑

SyntaxErrorException系列日记一:FUNCTION xxxxxx.xxxxxx does not exist_function test.collection_set does not exist-程序员宅基地

文章浏览阅读4.2k次。错误记录:FUNCTION mytest.CONCATE does not exist 如下:CONCATE是错误的一般应该检查函数是否拼写错误SELECT city_id ,city_name,airport_name,city_code,city_pinyin,city_abbreviation FROM city_airport WHERE 1=1 AND city_function test.collection_set does not exist

设计模式精讲:单例模式-程序员宅基地

文章浏览阅读75次。一个类的静态内部类,在外面的类被加载的时候,它里面的静态的类是不会被加载的,只有当我们调用getInstance方法的时候才会被加载。实际上要加载一个类我们也可以这么来写:Class.forName("类的名字"),只把class放到内存里而不进行实例化,如果我们用这种方式把Mgr01加到内存之后,这个static的INSTANCE是实例化的,因为他是一个静态变量,load到内存就会初始化。这两种方法的缺点就是,实例在类加载时就被创建了,如果应用程序不需要使用该实例,那么就会浪费一定的内存空间。

“OSGeo.GDAL.GdalPINVOKE”的类型初始值设定项引发异常和OSGeo.OGR.Ogr”的类型初始值设定项引发异常-程序员宅基地

文章浏览阅读3.3k次。出现这个的原因大概是:1、32位和64位用错,32位程序用的64位的dll,64位程序使用32位的dll。2、缺少依赖库。3、环境变量配置错误。缺少依赖库首先找到缺少哪些关联库,也可以直接把bin目录下的所有dll拷贝过去查询gdal***.dll的关联动态库:1、找到vs的命令提示符,如图2、输入:dumpbin /dependents c:\…\…\…\gdal***.dll即可看到该dll所关联的dll3、将gadl中能查到的属于上图中关联的dll,和gda_osgeo.gdal.gdalpinvoke”的类型初始值设定项引发异常

随便推点

window xp IIS 安装遇到的错误并安装不成功_win xp 0x1009956b-程序员宅基地

文章浏览阅读667次。IIS安装时,安装程序无法复制一个或多个文件。特定错误码是0x4b8 故障现象安装IIS的时候一直提示如下错误,IIS无法正常安装。提示:安装程序无法复制一个或多个文件。特定错误码是 0x4b8。按“确定”以继续;或者按“取消”,停止安装并且再试一次。如果继续,组件可能无法正常运行。解决方案(1) 开始 > 运行 > 输入 CMD >再输入以下命令:esentutl /p %windir_win xp 0x1009956b

华为matebooke不能下python_华为MateBookE2019体验 到底怎么样-程序员宅基地

文章浏览阅读2.2k次。描述在上周的MateBook 13 i3版评测中有很多人问,这个是不是MateBook E 2019?我寻思着,看来 3999元的价格很深入人心嘛?大家都惦记着华为这个最便宜的骁龙笔记本。刚好 MateBook E 2019 就在我旁边,那就跟大家好好聊聊这个东西。颜值很华为一般来说,我们称既能当平板也能作为笔记本使用的产品为「二合一设备」,MateBook E 2019 包括平板和键盘保护盖两个..._matebook e 2019运行webots

Python扫雷游戏:安装PyQt5,Python3.x以上-程序员宅基地

文章浏览阅读117次。#coding: utf-8__note__ = """* 扫雷小游戏* 需要python3.x以上* 需要安装PyQt5* pip install PyQt5"""import systry:import PyQt5except ImportError:import tkinterfrom tkinter import messageboxerr_str = "请安装PyQt5后再打开: pip..._"def sl_initial(x_box,y_box): a=x_box*y_box hwnd = findwindow(none, \"扫雷\") #"

2024三掌柜赠书活动第五期:从零基础到精通Flutter开发_mk甄选-2024年flutter零基础极速入门到进阶实战[同步更新中]-程序员宅基地

文章浏览阅读1.1w次,点赞30次,收藏34次。Flutter开发领域有许许多多深奥的知识,笔者在写作过程中尽力涉及Flutter的各个方面,但是由于时间仓促,书中难免会存在一些疏漏和不足之处(鉴于本书的示例代码都是按照Flutter官方的组件库来介绍的,且Flutter的官方版本更新非常频繁,所以书中难免会有一些较早的使用方法等),敬请读者批评指正。一套代码,构建多平台精美的应用,本书从真实的开发场景出发,完整地讲解了Flutter框架,帮助你快速掌握Flutter的基础知识和开发技巧,助你在移动应用开发领域取得成功!_mk甄选-2024年flutter零基础极速入门到进阶实战[同步更新中]

YOLOv4安装和训练-程序员宅基地

文章浏览阅读7.5k次,点赞6次,收藏34次。环境Windows:10YOLOv4OpenCV:4.5.3Visual Studio 2019:16.11CUDA:11.2.0_460.89_win10cudnn:11.2-windows-x64-v8.1.1.33硬件NVIDIA GeForce RTX 3070 TiOpenCV 4.5.3网址:https://sourceforge.net/projects/opencvlibrary/files/4.5.3/OpenCV 4.5.3下载链接:https://nchc._yolov4安装和训练

NetAssist网络调试工具使用指南 (附NetAssist工具包)_网络调试助手怎么用-程序员宅基地

文章浏览阅读5.6k次。NetAssist网络调试助手,是Windows平台下开发的TCP/IP网络调试工具,集TCP/UDP服务端及客户端于一体,是网络应用开发及调试工作必备的专业工具之一,可以帮助网络应用设计、开发、测试人员检查所开发的网络应用软/硬件产品的数据收发状况,提高开发速度,简化开发复杂度,成为TCP/UDP应用开发调试的得力助手。NetAssist网络调试助手是绿色软件,无需安装,只有一个执行文件,适用于各版本Windows操作系统,不需要微软dotNet框架支持。_网络调试助手怎么用

推荐文章

热门文章

相关标签