精华内容
下载资源
问答
  • 抽象数据类型ADT

    2020-07-10 16:38:58
    抽象数据类型ADT 1ADT的解释 数学模型及该模型上的一组操作。或者说一组由操作定义的数据类型。 这说明ADT由两部分构成,一部分是数据,另一部分是在上面定义的操作。举例说明,就像整数Z,以及定义在整数上的加减...

    抽象数据类型ADT

    1ADT的解释

    数学模型及该模型上的一组操作。或者说一组由操作定义的数据类型。

    这说明ADT由两部分构成,一部分是数据,另一部分是在上面定义的操作。举例说明,就像整数Z,以及定义在整数上的加减运算。

    2 ADT的操作

    Creators构造器:创建该类型的新对象。

    Producers生产器:使用一个存在的对象产生一个新的对象。例如String.concat()。

    Observers观察器:获取抽象类型的对象并返回不同类型。例如List.size()。

    Mutators变值器:用于改变对象属性的方法。例如List.add()。注意,变值器一般返回为void,也可能返回bool值表示操作是否成功。

    3设计ADT

    好的ADT设计原则

    (1)设计简洁一致的操作
    (2)要足以支持client所需要的对数据的所有操作,且用操作的难度要低(3)要么抽象要么具体,不要混合——要么针对抽象设计,要么针对具体应 用的设计。

    表示独立性

    client使用ADT时无需考虑其内部如何实现,ADT内部表示的变化不应影响外部spec和客户端。

    客户端不应该依赖具体的实现细节而应该依赖抽象。

    除非制定了条件,否则不应该更改ADT内部实现。没有条件时候,客户端不知道到底和你约定了什么。

    测试ADT

    由于不能直接访问ADT内部的数据域,所以只能调用其他方法去测试被测试的方法。

    creator,producer,mutator:用observer来查看变化。

    observer:用creator,producer,mutator变化后观察。

    注意:如果被依赖的其他方法有错误,可能导致被测试方法的测试结
    果失效。

    不变量(Invariant)

    不变量:程序在任何时候总是true的性质。

    为什么需要不变量:保持程序的“正确性”,容易发现错误。

    表示泄露: 不仅影响不变量,也影响了表示独立性:无法在不影响客户
    端的情况下改变其内部表示。

    防止表示泄露:

    例如:
    1.确保不会返回任何可变对象的直接引用,可以防御拷贝。
    2.使用关键字private让rep对外不可见。

    最好的办法就是使用immutable的类型,彻底避免表示泄露。

    Rep Invariant(RI) and Abstraction Function(AF)

    表示空间R:实现者看到和使用的值。

    抽象空间A:client看到和使用的值。

    抽象函数AF:R和A之间映射关系的函数,即如何将R中的每一个值解释为A中的每一个值。
    注意,AF必定是一个满射,但不一定是单射。

    表示不变性RI:所有表示值的一个子集,包含了所有合法的表示值。也可以将其看作一个条件,描述了什么是“合法”的表示值。

    注意
    同样的表示空间R,可以有不同的RI。
    对同一个R,不同的RI
    在这里插入图片描述
    即使是同样的R、同样的RI,也可能有不同的AF,即“解释不同”。

    设计ADT
    (1) 选择R和A;
    (2) RI — 合法的表示值;
    (3) 如何解释合法的表示值 —映射AF。

    展开全文
  • 抽象数据类型(ADT)

    2019-09-29 03:58:27
    抽象数据类型(ADT),脱离具体实现定义数据结构,它的定义着重于做什么,而忽略怎么做 举例 列表、栈、队列 列表 列表,也叫线性表 抽象定义:数据项线性排列,可以插入某一项,删除某一项,读取某一项 ...

    概念

    抽象数据类型(ADT),脱离具体实现定义数据结构,它的定义着重于做什么,而忽略怎么做


    举例

    列表、栈、队列


    列表

    列表,也叫线性表

    抽象定义:数据项线性排列,可以插入某一项,删除某一项,读取某一项


    栈、队列、优先级队列

    抽象定义:访问是受限制的,在某一时刻只有某一个特定的数据项可以被读取或删除

    转载于:https://www.cnblogs.com/Mike_Chang/p/10203030.html

    展开全文
  • 三、抽象数据类型举例 举例 int:不可变数据类型,没有mutator函数 List:可变数据类型,接口,有mutator函数 String:不可变数据类型,没有mutator函数 认识Java中的ADT概念 抽象类型是用操...

    一、抽象和用户定义类型

    抽象意味着什么
    抽象、模块化、封装、信息隐藏、关注点分离(模块具有单独的责任,不要将一个责任分散在不同的模块中)
    用户定义类型
    数据抽象
    数据抽象:一个类型的特征由可对其执行的操作刻画
    抽象类型的新颖性和以往不同之处在于对操作的关注

    二、类型和操作的分类

    可变和不可变数据类型
    可变类型的对象可以被修改,是因为提供了可修改其状态的操作。
    抽象类型操作的分类
    Creators:产生类型的新对象
    Producer:在已有对象基础上产生新的对象
    Observer:输入抽象类型的对象,返回其他类型的对象
    Mutators:改变对象
    操作的签名
    在这里插入图片描述
    Creator的签名

    Creator通常通过构造函数和静态方法实现。
    在这里插入图片描述
    Mutator的签名
    Mutator大多数情况返回值为void,有的时候也是boolean等类型。
    在这里插入图片描述

    三、抽象数据类型举例

    举例
    int:不可变数据类型,没有mutator函数
    List:可变数据类型,接口,有mutator函数
    String:不可变数据类型,没有mutator函数
    认识Java中的ADT概念
    在这里插入图片描述
    抽象类型是用操作定义的
    类型是由其操作集以及规格说明所表征的。
    在这里插入图片描述
    抽象类型的值是不透明的,因为客户端无法检查存储在其中的数据,除非操作允许。 隐藏了数据和实现。

    四、设计一个抽象类型

    ADT的设计需要选择良好的操作以及确定操作的行为。
    规则
    设计一组简单操作,通过简单操作的组合实现复杂的操作
    操作的行为应是内聚的(单一职责),某个操作不要包罗万象的将所有特例都考虑进去)
    List中不应增加sum方法,缺乏通用性
    操作集应该是完备的,覆盖该类型所有应支持的行为(判断方法:检查对象的每个需要被访问到的属性是否都能够被访问到。另外,要提供基本信息的获取方法)
    类型不应该混合领域无关的(通用的)和领域特定的特征,例如表示扑克牌序列的牌组类型不应具有接受整数或字符串等任意对象的通用加法方法。

    五、表示独立

    概念
    抽象类型的表示是独立与其表示(真是的数据结构和成员)
    只有当我们通过前置条件和后置条件充分明确了ADT的操作,使调用者知道可以依赖哪些内容,实现者知道可以安全更改哪些内容,此时才可以修改内部表示。
    举例:不同的字符串表示
    在这里插入图片描述
    如果其内部表示为

    private char[] a;
    

    实现如下:
    在这里插入图片描述
    如果是

    private char[] a; 
    private int start; 
    private int end;
    

    在这里插入图片描述
    什么是表示独立
    MyString的现有调用者仅依赖其public方法,而不依赖其private字段,因此我们可以在不检查和更改所有调用者代码的情况下进行更改。

    六、测试抽象数据类型

    测试方法间不可避免的会相互影响,测试时尽量把独立,不依赖其他操作的且被后面其他方法调用的方法放在前面测试。
    划分ADT操作的输入空间
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    七、不变性

    ADT的不变性
    好的ADT最重要属性是保持其不变性。
    在程序运行过程中,程序始终保持不变的性质,不可变就是不可变类型的重要不变性。ADT自身有责任确保其不变性,而不是依赖于调用者或者其他模块 。
    为什么需要不变性?
    当ADT保持自己的不变性时,推理代码变得容易得多。
    如果您可以指望字符串永远不会改变,那么在调试使用字符串的代码时,或者在尝试为另一个使用字符串的ADT建立不变量时,可以排除这种可能性。与之形成对比的是,字符串类型保证只有当其客户承诺不更改它时,它才是不可变的。然后您必须检查代码中可能使用字符串的所有位置。
    要假设用户会有意或者无意地挑战不变性。

    八、表示不变性和抽象方法

    两种值空间
    在这里插入图片描述
    R:表示空间,实现时用到的值空间
    A:抽象值空间,需要支持的值空间
    两种空间的例子
    抽象类型的实现者只需要关注表示值。以下例子是用String来表示字符集。
    在这里插入图片描述
    这个映射是满射,但未必是单射,所以也未必是双射。
    抽象函数:一个从R空间映射到A空间的映射。
    表示不变性
    RI : R → boolean
    RI告诉我们空间R中的r是否被AF映射到了空间A中的某个值。
    RI形成了空间R的一个子集(子集中的所有元素均被AF映射到了空间A中)
    为RI和AF编写文档
    在这里插入图片描述
    什么决定了AF和RI
    AF和 RI 既不由选定的表示值空间决定,也不由抽象值空间单独决定,表示值空间确定后,AF和RI也不是确定的。
    比如,我们有同样的R空间,单射可能会有不同的表示不变性。
    在这里插入图片描述
    即使相同的表示值空间和相同的表示不变性RI,我们仍然可以用不同的抽象函数AF来映射。
    在这里插入图片描述
    RI和AF如何影响ADT设计
    ADT设计的关键:不仅是选择两个空间(面向规格说明的抽象值空间和面向实现的表示值空间), 而且要决定表示值(RI)和如何映射(AF)。
    为其编写注释是很重要的。
    举例:
    在这里插入图片描述
    在这里插入图片描述
    检测表示不变性
    在实现中采用断言技术来检查不变性是否保持,可以更早地捕获bug。
    应该在所有有create和mutate作用类型方法的最后检查不变性。
    在所有方法中调用checkRep() 有助于捕获因为表示泄露造成的不变性错误。
    表示中没有Null:x != null check

    九、有益的突变

    抽象值永远不可改变,在确保其映射的抽象值不变前提下,表示值可以变化。这类改变称作“有益的突变”(Beneficent mutation)。
    举例
    不要求不含公约数
    在这里插入图片描述
    参与运算时,可以有公约数;显示输出时,需要简化(没有公约数)
    在这里插入图片描述
    另外一种理解:AF是多对一的映射,rep value改变为了“多”中的另外一个。
    为什么需要有益的突变: 实现的自由为性能改善提供了可能,例如实现缓存、数据结构重新平衡、惰性计算、惰性清理

    十、为AF、RI编写文档并且远离表示泄露

    在类中说明AF、RI、不变性,在定义Rep的位置。
    表示泄露是指在类的外面可以直接修改内部表示的值。
    对表示泄露安全相关的参数,特别是输入参数和返回值,给出保证不泄露内部表示的策略。
    为AF和RI编写文档:示例1
    在这里插入图片描述
    为AF和RI编写文档:示例2
    在这里插入图片描述
    如何设置不变性
    不变量是整个程序的一个属性,在对象不变量的情况下,它会减少对象的整个生命周期。
    设置不变性就要:
    在初始化时使之为真,所有修改都使不变性得到保持。在ADT操作中,要保证creators和producers方法必须为新创建的对象建立不变性,mutators和observers必须保持不变性,保证没有表示泄露发生。

    十一、ADT不变性替代前置条件

    良好设计的ADT,可以替代spec中的部分preconditions。
    在这里插入图片描述

    展开全文
  • C语言实现抽象数据类型(ADT)什么是抽象数据类型(ADT)C语言通过怎样的方式来实现ADT举例前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结学习目标:学习内容:学习时间:学习产出: 什么是抽象数据类型...
  • (4)抽象数据类型举例 1.3 抽象数据类型的表示与实现 1、知识回顾 (1)数据结构的研究内容 (2)概念小结 2、抽象数据类型 一个问题抽象为一个抽象数据类型后,仅是形式上的抽象定义,还没有达到问题...
  • 3.1.1 栈的抽象数据类型定义;3.1.1 栈的抽象数据类型定义;3.1.1 栈的抽象数据类型定义;9;3.1.1 栈的抽象数据类型定义;11;12;3.1.1 栈的抽象数据类型定义;3.1.1 栈的抽象数据类型定义;3.1.1 栈的抽象数据类型定义;...
  • 数据类型与抽象数据类型2.1数据类型2.2 数据类型的作用2.3抽象数据类型2.4抽象数据类型定义抽象数据类型(ADT)定义举例:Circle的定义抽象数据类型(ADT)定义举例:复数的定义2.5概念小结2.6抽象数据类型的表示与...
  • 线性表(List)线性表定义特点:数据类型抽象数据类型举例线性表存储结构顺序存储结构获取元素操作(GetElem(L,i,*e))插入元素操作(ListInsert(*L,i,e))删除元素操作(ListDelete(*L,i,*e))顺序存储结构的...
  • 定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。 注意:保证测试中不会当栈为空的时候,对栈调用pop()或者min()或者top()方法。 # -*- coding:utf-8 -*- class...
  • 题目描述:包含min函数的栈 定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。 Python测试: // An highlighted block var foo = 'bar'; 总结 包含min函数的栈 ...
  • 定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。 注意:保证测试中不会当栈为空的时候,对栈调用pop()或者min()或者top()方法。 实现思路 这个题目主要考察的...
  • 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。在该栈中,调用min、push及pop的时间复杂度都是O(1)。 import java.util.Stack; public class Solution { Stack<Integer> ...
  • 定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。 JavaScript实现 var stack = []; function push(node) { stack.push(node); // write code here } function ...
  • 定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。 注意:保证测试中不会当栈为空的时候,对栈调用pop()或者min()或者top()方法。 方法思路 stack<int> ...
  • 定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。 题目思路 使用一个栈来存储所有入栈元素并使用一个辅助栈来保证栈顶元素永远都是入栈的最小元素。 代码...
  • 定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。 注意:保证测试中不会当栈为空的时候,对栈调用pop()或者min()或者top()方法。 解法一:双栈...
  • 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。在该栈中,调用min、push、pop的时间复杂度都是O(1) 详细代码: # -*- coding:utf-8 -*- class Solution: def __init__(self): self....
  • 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。在该栈中,调用min,push,pop的时间复杂度都是O(1)。 解析:首先是一个栈,这个栈已经是最常见的那种,我们需要改造它使它能够在O(1)时间内返回...
  • 定义栈的数据结构(push/pop),请在该类型中实现一个能够得到栈中所含最小元素的min函数(三者的时间复杂度都应为O(1))。 测试用例: 1)新压入栈的数字比之前的最小值大/小 2)弹出的数字不是最小的元素/...
  • 定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。 注意:保证测试中不会当栈为空的时候,对栈调用pop()或者min()或者top()方法。 首先,定义一个存全部数的栈...
  • (5)抽象数据类型(ADT)定义举例:Circle的定义 (6)抽象数据类型(ADT)定义举例:复数的定义 1.2 基本概念和术语2 1、数据类型和抽象数据类型 (1)高级程序设计语言 在使用高级程序设计语言编写程序时,...
  • 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。 牛客传送门:点击打开链接 思路很清晰,写代码时注意细节。 public class MinStack { int[] value = new int[100]; int[]...
  • 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。 2题目答案 使用栈,要先包含头文件 : #include&lt; stack&gt; 定义栈,以如下形式实现: stack s; 其中Type为数据...
  • 定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。 注意:保证测试中不会当栈为空的时候,对栈调用pop()或者min()或者top()方法。 知识点: 栈:先进后出 ...
  • 数据结构-栈

    2020-12-21 19:18:05
    栈栈的抽象数据类型定义(ADT):顺序栈(SqStack)基本操作实现结构体定义构造一个空栈StackEmpty判断栈空StackLength返回栈S中的元素个数GetTop返回栈顶元素Push入栈Pop出栈链栈(LinkStack)基本操作实现链栈的...
  • //定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。 #include #include using namespace std; // stk 保存依次进入栈的数据 // minstk 保存依次进入栈时当前的最小值的栈 class Solution { ...

空空如也

空空如也

1 2 3 4 5 ... 13
收藏数 249
精华内容 99
热门标签
关键字:

抽象数据类型定义举例