比特派官网新版app下载|adt
抽象数据类型(ADT)怎么学?抽象数据类型到底怎么用? - 知乎
抽象数据类型(ADT)怎么学?抽象数据类型到底怎么用? - 知乎首页知乎知学堂发现等你来答切换模式登录/注册数据结构数据类型抽象数据类型(ADT)怎么学?抽象数据类型到底怎么用?我在学习数据结构时有这样的感受: 抽象数据类型没有固定的套路,而输入不同类型的数据时,光靠抽象数据类型中对不同步骤的简单描述,没办法面对不同类型的数据…显示全部 关注者26被浏览36,558关注问题写回答邀请回答好问题 4添加评论分享5 个回答默认排序华天清网络爬虫 www.GooSeeker.com 创始人,数据挖掘和数据获取社区运营 关注我的建议是不要想复杂了,把ADT只是当成一种伪代码,用于描述数据结构。没有必要把它当成一种形式化方法也没有必要用它做类型推演。我学习数据结构的时候,一年只有30小时的上机时间,绝大多数时间是在纸面上学习和推演,那时候ADT内容占了很大比例,当时就有类似的疑问:ADT怎样用。再看现在讲数据结构的书,基本上都是采用某种真正的编程语言讲解的,很少提及甚至不提ADT这个词,即使提了,可以理解成ADT为每一种数据结构定义了一套最基本的,最能反映这种数据结构特点的interface。编程练习的时候,就要实现这些interface。同时,很少再用伪代码写实现过程,直接用编程语言写真实的代码。另外,以前整个课本逐个讲那些常用的数据结构,现在很多课本讲解的很简略,因为这些数据结构普通的就像人的每天都在呼吸。作为练习,对着ADT用某种编程语言实现一下,练下手而已,没有必要纠结以后会不会总是能写出最棒的ADT实现。因为以后没有这个必要,只需要牢记每种数据结构的特点和各种interface上表现出来的性能就行了,别把数据结构类型选错了就行。发布于 2021-06-21 09:17赞同 183 条评论分享收藏喜欢收起TonyDistributed Small Datum in Sky 关注代码如果能公用,尽量公用。假设6个相似的函数,可以用Template写成一个函数,或者6个函数共用一个内部的小函数。好处在于:万一发现共用部分有bug,修正一处即可。否则漏了一个,就白修bug了。发布于 2021-06-20 04:27赞同 2添加评论分享收藏喜欢
数据结构与算法——10分钟理解抽象数据类型(ADT)-CSDN博客
>数据结构与算法——10分钟理解抽象数据类型(ADT)-CSDN博客
数据结构与算法——10分钟理解抽象数据类型(ADT)
最新推荐文章于 2024-03-05 20:55:25 发布
置顶
Baymax的学习日志
最新推荐文章于 2024-03-05 20:55:25 发布
阅读量1.4w
收藏
165
点赞数
53
文章标签:
数据结构
数据类型
抽象数据类型
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_41455398/article/details/100044745
版权
在学习数据结构类型时,首先遇到的一个难点即是如何理解抽象数据结构类型。通过阅读多个博客,将个人理解总结如下:
如已看过抽象数据类型定义,可直接跳过定义。 抽象数据类似的定义 抽象数据类型(Abstract Data Type 简称ADT)是指一个数学模型以及定义在此数学模型上的一组操作。抽象数据类型需要通过固有数据类型(高级编程语言中已实现的数据类型)来实现。对一个抽象数据类型进行定义时,必须给出它的名字及各运算的运算符名,即函数名,并且规定这些函数的参数性质。一旦定义了一个抽象数据类型及具体实现,程序设计中就可以像使用基本数据类型那样,十分方便地使用抽象数据类型。
如何理解? 1, 抽象数据类型 = 逻辑结构+数据运算。逻辑结构不涉及数据在计算机中具体的实现和存储,这些操作是由存储结构决定的,这就是说,抽象数据类型只需考虑问题本身即可。
均以买衣服的例子进行解释:在买衣服砍价时,自己需要将砍价这个事情抽象为语句(即构建模型)表达出来(操作),而不需要考虑卖家能否接受自己说的话(不需要考虑计算机如何处理)。
2,类型是指一类数据。基本数据类型被人做是最基本地,不可再划分的数据,一般就是整形、浮点型、以及字符型。抽象数据类型是由若干基本数据类型归并之后形成的一种新的数据类型,这种类型由用户定义,功能操作比基本数据类型更多,一般包括结构体和类。
例:要表达的语句中,应包含“动词”,“衣服名称”,“价格数字”等类型。也就是说,说的语句是由许多基本类型组成。
3,抽象数据类型是在在不涉及具体的,和计算机系统相关的细节情况下,优先理解问题本身,在此基础上,实现用计算机求解问题的过程。这就是使用抽象数据类型的目的。
例:我将砍价的语句说出来目的就是为了能够便宜点买衣服,将话说出来也便于卖家了解我的想法(便于计算机进行处理)。
再举一个别的博客里面的例子: 构建抽象数据类型复数(e1+e2i)
通过上例可知,问题是要将复数加法描述出来,而抽象数据类型就是在这种形式化的描述下把数据的组成和如何操作的问题描述清楚,且没有涉及到具体的计算机具体实现的一些问题。从数据对象中看出,抽象数据类型是由实数数据类型组成。另外,右侧c++代码是在通过抽象数据类型ADT描述清楚问题本身后,然后在此基础上设计高级程序语言中具体实现的过程,在这个阶段涉及到了计算机的具体实现和存储等因素。从此可知,该例子也符合上文中提出的3点对抽象数据类型理解的看法。
参考博客1 参考博客2 百度百科
优惠劵
Baymax的学习日志
关注
关注
53
点赞
踩
165
收藏
觉得还不错?
一键收藏
知道了
3
评论
数据结构与算法——10分钟理解抽象数据类型(ADT)
在学习数据结构类型时,首先遇到的一个难点即是如何理解抽象数据结构类型。通过阅读多个博客,将个人理解总结如下:如已看过抽象数据类型定义,可直接跳过定义。抽象数据类似的定义抽象数据类型(Abstract Data Type 简称ADT)是指一个数学模型以及定义在此数学模型上的一组操作。抽象数据类型需要通过固有数据类型(高级编程语言中已实现的数据类型)来实现。对一个抽象数据类型进行定义时,必须给出...
复制链接
扫一扫
数据结构与算法C语言版<2>——抽象数据结构
元气少女硕硕子的博客
07-16
944
抽象数据结构(Abstract Data Type)(ADT)
1.定义:抽象数据结构是指在一个数学模型以及定义在此模型中的一系列操作。
注意:❶抽象数据类型不考虑计算机内的具体存储结构与运算的具体实现方法。
(就是说抽象数据类型的意义在于有了他之后我可以更加简单的了解某一个或者一类问题,但是我不需要去考虑他具体怎么在电脑内存里运行和存储。)
❷抽象数据类型=逻辑结构+数据的算法
2.抽象数据类型的形式定义:
抽象数据类型可用(D,...
一篇通俗易懂的ADT介绍
weixin_45653722的博客
06-27
8050
最近笔者通过哈工大的软件构造课程,学习了抽象数据类型,现将其具体总结如下:
ADT:抽象数据类型
定义:抽象数据类型(Abstract Data Type,ADT)是计算机科学中具有类似行为的特定类别的数据结构的数学模型;或者具有类似语义的一种或多种程序设计语言的数据类型。抽象数据类型是间接定义的,通过其上的可执行的操作以及这些操作的效果的数学约束(与可能的代价)。
按照MIT的说法,ADT可以用下面的这幅图来进行描述:
直观的看,ADT就是一道墙,将内在的表示与外部的使用进行隔离这种隔离,通过接口进行的
3 条评论
您还未登录,请先
登录
后发表或查看评论
如何编写规范的ADT
m0_51733657的博客
06-02
1675
一.ADT基本概念
1. 什么是ADT?
抽象数据类型(Abstract Data Type,ADT)是将数据对象,数据对象之间的关系和数据对象的基本操作封装在一起的一种表达方式,是用于简化描述抽象算法,分类与评价数据结构,形式描述程序设计语言的类型系统。
在ADT设计时,首先要考虑对不可变类型的满足,虽然不可变类型在程序运行时会产生大量的重复信息复制,但能确保已经定义的变量不会被其他地方修改,在保障代码安全性的同时,也保障的线程安全性。其次,还需要ADT还需要具备表示...
数据结构习题答案(全部算法)严蔚敏版
11-18
第1章 绪论
1.1 数据结构的基本概念和术语
1.1.1 引言
1.1.2 数据结构有关概念及术语
1.1.3 数据结构和抽象数据类型(ADT)
1.2 算法描述与分析
1.2.1 什么是算法
1.2.2 算法描述工具——C语言
1.2.3 算法分析技术初步
习题一
第2章 线性表
2.1 线性表的定义及其运算
2.1.1 线性表的定义
2.1.2 各种运算简介
2.2 线性表的顺序存储结构(向量)
2.2.1 顺序存储结构(向量)
2.2.2 向量中基本运算的实现
2.3 线性表的链表存储结构
2.3.1 单链表与指针
2.3.2 单链表的基本运算
2.4 循环链表和双向链表
2.4.1 循环链表
2.4.2 双向链表
2.4.3 顺序存储结构与链表存储结构的综合分析与比较
2.5 多项式相加问题
2.5.1 多项式相加的链表存储结构
2.5.2 多项式相加的算法实现
2.6 线性表的算法实现举例
2.6.1 实现线性表顺序存储结构及运算的C语言源程序
2.6.2 单链表处理的C语言源程序
习题二
第3章 栈和队列
3.1 栈
3.1.1 栈的定义及其运算
3.1.2 栈的顺序存储结构(向量)
3.1.3 栈的链表存储结构
3.1.4 栈的应用
3.2 队列
3.2.1 队列的定义及运算
3.2.2 队列的顺序存储结构(向量)
3.2.3 队列的链表存储结构
3.3 栈和队列的算法实现举例
习题三
第4章 串
4.1 串的基本概念
4.2 串的存储结构
4.2.1 串的顺序存储
4.2.2 串的链表存储
4.2.3 串变量的存储映象
4.3 串的运算
4.3.1 串的运算简介
4.3.2 串的匹配运算
4.4 文本编辑
习题四
第5章 数组和广义表
5.1 数组的基本概念
5.1.1 数组的概念
5.1.2 数组的顺序表示
5.1.3 特殊矩阵的压缩存储
5.2 稀疏矩阵的三元组存储
5.2.1 三元组表
5.2.2 稀疏矩阵的运算
5.3 稀疏矩阵的十字链表存储
5.3.1 十字链表的组成
5.3.2 十字链表的有关算法
5.4 广义表
5.4.1 广义表的概念和特性
5.4.2 广义表的存储结构
5.4.3 求广义表的深度
5.4.4 广义表的输出
5.4.5 建立广义表的存储结构
5.5 迷宫问题
习题五
第6章 树
6.1 树的基本概念和术语
6.1.1 树的定义
6.1.2 树的常用术语
6.1.3 树的表示方法
6.2 二叉树
6.2.1 二叉树的定义
6.2.2 二叉树的重要性质
6.2.3 二叉树的存储结构
6.2.4 二叉树二叉链表的一个生成算法
6.3 遍历二叉树
6.3.1 先根遍历
6.3.2 中根遍历
6.3.3 后根遍历
6.3.4 二叉树遍历算法的应用
6.4 线索二叉树
6.4.1 线索二叉树的基本概念
6.4.2 线索二叉树的逻辑表示图
6.4.3 中根次序线索化算法
6.4.4 在中根线索树上检索某结点的前趋或后继
6.4.5 在中根线索树上遍历二叉树
6.5 二叉树、 树和森林
6.5.1 树的存储结构
6.5.2 树与二叉树之间的转换
6.5.3 森林与二叉树的转换
6.5.4 一般树或森林的遍历
6.6 树的应用
6.6.1 二叉排序树
6.6.2 哈夫曼树及其应用
6.7 二叉树的建立和遍历C语言源程序示例
习题六
第7章 图
7.1 图的基本概念和术语
7.1.1 图的基本概念
7.1.2 路径和回路
7.1.3 连通图
7.1.4 顶点的度
7.2 图的存储结构
7.2.1 邻接矩阵
7.2.2 邻接链表
7.3 图的遍历和求图的连通分量
7.3.1 图的建立
7.3.2 图的遍历
7.3.3 求图的连通分量
7.4 图的生成树
7.4.1 生成树的概念
7.4.2 最小生成树
7.4.3 普里姆(Prim)算法和克鲁斯卡尔(Kruskal)算法
7.5 最短路径
7.5.1 单源顶点最短路径问题求解
7.5.2 求有向网中每对顶点间的路径
7.6 有向无环图及应用
7.6.1 拓扑排序
7.6.2 关键路径
7.7 图的算法C语言程序实现举例
7.7.1 无向图的邻接表的建立和遍历
7.7.2 有向无环图的拓扑排序和求关键路径
习题七
第8章 查找
8.1 基本概念
软件构造—ADT的理解
weixin_59437923的博客
06-04
1791
最近学习了ADT,即抽象数据类型,刚学的时候理解的不是很好,在完成lab2的过程中,我对ADT的构造以及作用有了一定的理解。(以下仅是我个人理解,很可能会有错误,请批评指正) 首先什么是ADT,它是计算机科学中具有类似行为的特定类别的数据结构的数学模型;或者具有类似语义的一种或多种程序设计语言的数据类型。抽象数据类型是间接定义的,通过其上的可执行的操作以及这些操作的效果的数学约束(与可能的代价)。抽象数据类型(ADT)是纯粹理论实体,用于简化描述抽象算法,分类与评价数据结构,形式描述程序设计语言的类型系统。
数据结构(抽象数据类型及算法概念)
weixin_66405733的博客
08-31
531
自然语言、伪代码描述、流程图、源代码描述(算法给人看,程序给计算机)算法:是为了解决一个或一类问题而规定的一个确定、有限长的操作序列。简单地说,算法就是对问题求解过程的一种描述。定义抽象数据类型复数。...
什么叫ADT?
Guix
10-24
8099
Abstract Data Type,抽象数据类型,是指数据结构作为一个软件组件的实现。ADT的接口用一种类型和该类型上的一组操作来定义,每个操作由它的输入和输出定义。 ADT并不会指定数据类型如何实现,这些实现细节对于ADT的用户来说是隐藏的,并且通过封装(encapsulation)来阻止外部对他的访问。 数据结构(Data Structure)是ADT的实现,在诸如c++之类
关于ADT的一些简单解释及理解
qq_51683996的博客
05-15
3297
笔者写这篇文章的初衷是帮助刚刚接触软件构造课程的小白通俗易懂地解释关于ADT方面地知识(才不是为了作业呢)。虽然说上课老师讲的很不错,课件ppt也都提供了,本来也不需要我在这里过多的解释什么,但是ppt上大多是大段的英文,即便有少量中文来标记重要的知识点,但是如果不阅读那些英文的话是没有办法很好的理解的。笔者就当抛砖引玉,简单谈谈自己关于抽象数据类型(ADT)的理解。
最早接触到ADT概念的应该是大二上的数据结构课程上,当时只学了个概念,但是并没有很好的理解其具体意思。
...
ADT下载地址(含各版本),最新ADT-23.0.6
热门推荐
cayre的专栏
06-09
7万+
(ADT不分32或64位)
2015/05/07 新增 ADT-23.0.6.zip
2015/01/18新增
ADT-23.0.3.zip
ADT-23.0.4.zip
ADT百度云下载链接(含各版本):
链接: https://pan.baidu.com/s/1qSWOlX43IRsQKMVdAKM2Zg 密码: smy6
官网各版本下载链接:
...
软件构造ADT总结
youkinoxita的博客
06-08
288
软件构造ADT总结
抽象数据结构
jkevinking的博客
01-23
3637
1.抽象数据类型定义
抽象数据类型( Abstract Data Type,ADT)是带有一组操作的一些对象的集合。它通常是对数据的某种抽象,定义了数据的取值范围及其结构形式,以及对数据操作的集合。
2.抽象数据类型表示方法
抽象数据类型是一个数学模型以及定义在其上的一组操作组成,因此,抽象数据类型一般通过数据对象、数据关系以及基本操作来定义,即抽象数据类型三要素...
算法:算法C语言实现 第1-4部分 基础知识、数据结构、排序及搜索
05-25
算法:C语言实现 (第1-4部分)基础知识、数据结构、排序及搜索(原书第3版)
本书是Sedgewick彻底修订和重写的C算法系列的第一本。全书分为四部分,共16章。第一部分“基础知识”(第1—2章)介绍基本算法分析原理。第二部分“数据结构”(第3~5章)讲解算法分析中必须掌握的数据结构知识,主要包括基本数据结构、抽象数据结构、递归和树。第三部分“排序”(第6~11章)按章节顺序分别讨论基本排序方法(如选择排序、插入排序、冒泡排序、希尔排序等)、快速排序方法、归并和归并排序方法、优先队列与堆排序方法、基数排序方法以及特殊用途的排序方法,并比较了各种排序方法的性能特征。第四部分“搜索”(第12~16章)在进一步讲解符号表、树等抽象数据类型的基础上,重点讨论散列方法、基数搜索以及外部搜索方法。
书中提供了用C语言描述的完整算法源程序,并且配有丰富的插图和练习。作者用简洁的实现将理论和实践成功地结合了起来,这些实现均可在真实应用上测试,使得本书自问世以来备受程序员的欢迎。
本书可作为高等院校计算机相关专业算法与数据结构课程的教材和补充读物,也可供自学之用。
目录
出版者的话
译者序
前言
第一部分 基础知识
第1章 引言
1.1 算法
1.2 典型问题——连通性
1.3 合并一查找算法
1.4 展望
1.5 主题概述
第2章 算法分析的原理
2.1 实现和经验分析
2.2 算法分析
2.3 函数的增长
2.4 大O符号
2.5 基本递归方程
2.6 算法分析示例
2.7 保证、预测及局限性
第二部分 数据结构
第3章 基本数据结构
3.1 构建组件
3.2 数组
3.3 链表
3.4 链表的基本处理操作
3.5 链表的内存分配
3.6 字符串
3.7 复合数据结构
第4章 抽象数据类型
4.1 抽象对象和对象集
4.2 下推栈ADT
4.3 栈ADT客户示例
4.4 栈ADT的实现
4.5 创建一个新ADT
4.6 FIFO队列和广义队列
4.7 复制和索引项
4.8 一级ADT
4.9 基于应用的ADT示例
4.10 展望
第5章 递归与树
5.1 递归算法
5.2 分治法
5.3 动态规划
5.4 树
5.5 树的数学性质
5.6 树的遍历
5.7 递归二叉树算法
5.8 图的遍历
5.9 综述
第三部分 排序
第6章 基本排序方法
6.1 游戏规则
6.2 选择排序
6.3 插入排序
6.4 冒泡排序
6.5 基本排序方法的性能特征
6.6 希尔排序
6.7 对其他类型的数据进行排序
6.8 索引和指针排序
6.9 链表排序
6.10 关键字索引统计
第7章 快速排序
7.1 基本算法
7.2 快速排序算法的性能特征
7.3 栈大小
7.4 小的子文件
7.5 三者取中划分
7.6 重复关键字
7.7 字符串和向量
……
第8章 归并与归并排序
第9章 优先队列和堆排序
第10章 基数排序
第11章 特殊用途的排序方法
第四部分 搜索
第12章 符号表和二叉搜索树
第13章 平衡树
第14章 散列
第15章 基数搜索
第16章 外部搜索
如何理解数据结构中的抽象数据类型?
新海说
09-04
3万+
抽象数据类型的标准格式
ADT 抽象数据类型名
{
Data:
数据元素之间逻辑关系的定义;
Operation:
操作1;
操作2;
...
}
什么是抽象数据类型?
抽象数据类型(Abstract Data Type,ADT)是指一个数学模型以及定义在这个模型上的一组操作。
抽象数据类型的定义仅仅取决于它的一组逻辑特性,而与它在计算机中的表示和实现无关。
例如,int类型的数据表示的...
抽象数据类型(ADT)的学习总结及思考
MDNLNDZ的博客
07-04
2152
一.抽象数据类型(ADT)的概念
一个ADT是一个仅由保存的数据类型和可能在这个数据类型上进行的操作定义的。开发者们只能通过ADT的操作方法来访问ADT的属性,而且他们不会知道这个数据类型内部各种操作是如何实现的。 在Java中,我们常常使用一个接口来给出一个操作集合而不需要透露这些操作实现的细节。ADT提供了一个将对象公共接口中的操作和其具体的实现分开的强有力的工具。这使得一个ADT的实现可以不断变化和演化同时保持其公共接口不变。
可以说,数据得抽象是用抽象数据类型来实...
【数据结构】归并排序
vox520的博客
03-01
384
归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide andConquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。
【数据结构】初始集合框架
2301_79765510的博客
02-29
317
Java 集合框架 Java Collection Framework ,又被称为容器 container ,是定义在 java.util 包下的一组接口 interfaces和其实现类 classes。其主要表现为将多个元素 element 置于一个单元中,用于对这些元素进行快速、便捷的存储 store 、检索 retrieve 、管理 manipulate ,即平时我们俗称的增删查改 CRUD。
Java基础数据结构之栈
zyh20050430的博客
03-02
290
栈是一种特殊的线性表,它只允许在固定的一端进行元素的添加与使用,且遵循先进后出的原则。添加取用元素的一端称为栈顶,另一端称为栈底。出栈和入栈都是操作栈顶元素。
【数据结构】LinkedList与链表
最新发布
2301_79765510的博客
03-05
322
由于其底层是一段连续空间,当在ArrayList任意位置插入或者删除元素时,就需要将后序元素整体往前或者往后搬移,时间复杂度为O(n),效率比较低,因此ArrayList不适合做任意位置插入和删除比较多的场景。因此:java集合中又引入了LinkedList,即链表结构。链表是一种物理存储结构上非连续存储结构,数据元素的逻辑顺序是通过链表中的引用链接次序实现的。
抽象数据类型adt定义
05-10
抽象数据类型(ADT)是一种数学模型,它定义了一组数据类型和一组操作这些数据类型的操作。ADT 将数据和它们的操作分离开来,以便在实现时可以对它们进行修改。ADT 可以看作是一种封装机制,它隐藏了数据类型的内部实现细节,只暴露出一组可供使用的操作接口。
ADT 的定义包括两部分:一是数据类型的定义,即数据类型的名称和它所包含的数据元素的类型和数量;二是操作的定义,即对数据类型进行的操作。其中,操作又分为构造操作、查询操作和修改操作三类。构造操作用于创建新的数据类型对象,查询操作用于获取数据类型对象的信息,修改操作用于修改数据类型对象的状态。
通常,ADT 是通过编写接口(interface)来定义的。接口规定了数据类型的名称和操作的名称、参数和返回值类型。实现 ADT 的程序员需要实现这些操作接口,以便在程序中使用数据类型。由于 ADT 隐藏了数据类型的内部实现细节,因此可以在不影响程序其它部分的情况下进行修改和优化。
“相关推荐”对你有帮助么?
非常没帮助
没帮助
一般
有帮助
非常有帮助
提交
Baymax的学习日志
CSDN认证博客专家
CSDN认证企业博客
码龄6年
暂无认证
20
原创
39万+
周排名
52万+
总排名
6万+
访问
等级
649
积分
23
粉丝
62
获赞
9
评论
275
收藏
私信
关注
热门文章
数据结构与算法——10分钟理解抽象数据类型(ADT)
14732
pandas 学习笔记--------panel
12958
Word中插入图片不清晰、分辨率较低的问题解决方案(VISIO\MATLAB)
12266
无源测向技术介绍——振幅法测向
9971
投稿论文图片分辨率达不到要求的解决方案
6614
分类专栏
c++
7篇
c++11
1篇
数据结构
3篇
matlab
1篇
分辨率
2篇
visio
2篇
树
1篇
word转pdf
1篇
note
5篇
最新评论
无源测向技术介绍——振幅法测向
qsdzxp:
你好,请教一下,全向比幅法,C(theta)和S(theta)和差化积那步是怎么计算的,有参考资料么,感谢
无源测向技术介绍——振幅法测向
cz1095229989:
你好,这个代码运行完怎么没有图呀
无源测向技术介绍——振幅法测向
weixin_46987428:
你好,用你的代码试了一下。发现你是已知角去比幅,是有Bug的。代码中你把A = exp(-j*2*pi*d.'*sin(theta* pi / 180)); % 方向矢量中theta的值改成100,发现测角还是30.
投稿论文图片分辨率达不到要求的解决方案
Baymax的学习日志:
如果图片过大,可适当调整一下打印机的设置
数据结构与算法——10分钟理解抽象数据类型(ADT)
_Jesse_:
good
您愿意向朋友推荐“博客详情页”吗?
强烈不推荐
不推荐
一般般
推荐
强烈推荐
提交
最新文章
快速学会C++11中的lambda函数的使用
并查集-----leetcode547
Word中插入图片不清晰、分辨率较低的问题解决方案(VISIO\MATLAB)
2021年3篇
2020年11篇
2019年2篇
2018年4篇
目录
目录
分类专栏
c++
7篇
c++11
1篇
数据结构
3篇
matlab
1篇
分辨率
2篇
visio
2篇
树
1篇
word转pdf
1篇
note
5篇
目录
评论 3
被折叠的 条评论
为什么被折叠?
到【灌水乐园】发言
查看更多评论
添加红包
祝福语
请填写红包祝福语或标题
红包数量
个
红包个数最小为10个
红包总金额
元
红包金额最低5元
余额支付
当前余额3.43元
前往充值 >
需支付:10.00元
取消
确定
下一步
知道了
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝
规则
hope_wisdom 发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额
0
抵扣说明:
1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。 2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。
余额充值
一文读懂:什么是前列腺癌内分泌治疗 - 知乎
一文读懂:什么是前列腺癌内分泌治疗 - 知乎切换模式写文章登录/注册一文读懂:什么是前列腺癌内分泌治疗云医惠药传播医药健康科普知识,为每个人的健康保驾护航。数据统计显示,前列腺癌居全球男性恶性肿瘤发病率第2位(仅次于肺癌),占男性全部癌症发病例数的13.5%,是男性癌症致死的第5大原因。随着城市化发展、老龄化进程加快,我国前列腺癌的发病率在近年来呈现持续快速增长趋势,已超过膀胱癌,成为我国男性泌尿生殖系统发病率最高的肿瘤;同时,我国前列腺癌5年生存率明显低于发达国家,前列腺癌正成为严重影响男性健康的泌尿系恶性肿瘤。前列腺癌的治疗通常要可以根据病情发展阶段和患者自身身体状况进行有针对性的个性化治疗。其中,内分泌治疗是我国治疗晚期前列腺癌的主要方法之一。什么是内分泌治疗?前列腺癌内分泌治疗又称为雄激素剥夺疗法(ADT),是临床上抑制睾丸雄激素分泌或抑制雄激素活性治疗方法的统称。内分泌治疗方法有哪些?内分泌治疗根据作用机制和靶点的不同分为去势治疗和抗雄治疗两大类。去势治疗的作用靶点在脑垂体,抗雄治疗作用靶位是肾上腺或前列腺。去势治疗,即去除产生睾酮器官或抑制产生睾酮器官的功能,抑制睾丸分泌雄激素,包括手术去势和药物去势。去势治疗的药物包括促性腺激素释放激素(GnRH)激动剂和GnRH拮抗剂,前者通过下调GnRH受体减少促黄体激素 (LH)的释放;后者直接抑制GnRH受体。值得一提的是,2008年获FDA批准的地加瑞克(费蒙格®)是唯一被推荐用于前列腺癌治疗的GnRH拮抗剂,其竞争性与垂体促性腺细胞膜上的GnRH受体结合,阻断内源性GnRH,快速彻底地停止垂体促性腺激素的分泌。地加瑞克用于前列腺癌内分泌治疗已获得国内外权威指南推荐,2018年在中国获批,适应症为适用于需要雄激素去势治疗的前列腺癌患者。地加瑞克治疗前列腺癌患者,能更迅速强效抑制睾酮,快速降低PSA水平,提高患者生存率。抗雄治疗,即应用抗雄激素药物竞争性阻断雄激素与前列腺细胞上雄激素受体的结合。抗雄治疗药物分为三类:肾上腺皮质激素合成阻滞药、雄激素受体拮抗剂及5α-还原酶抑制剂。内分泌治疗适应症有哪些?(1)转移性前列腺癌(2)局限早期前列腺癌或局部进展前列腺癌,无法行根治性前列腺切除术或放射治疗(3)根治性前列腺切除术或根治性放疗前的新辅助内分泌治疗(4)配合放射治疗的辅助内分泌治疗(5)治愈性治疗后局部复发,但无法再行局部治疗(6)治愈性治疗后远处转移 (7)去势抵抗期的雄激素持续抑制前列腺癌作为一种激素依赖性肿瘤,针对前列腺癌的内分泌治疗应用空间将日益广泛,而地加瑞克的疗效和安全性也将成为前列腺癌患者的新选择。参考资料:前列腺癌诊断治疗指南发布于 2020-03-12 17:10前列腺癌症肿瘤赞同 4添加评论分享喜欢收藏申请
eclipse安装ADT插件_eclipse2021-12 adt 安装-CSDN博客
>eclipse安装ADT插件_eclipse2021-12 adt 安装-CSDN博客
eclipse安装ADT插件
最新推荐文章于 2023-09-21 20:06:57 发布
我是大魔王2
最新推荐文章于 2023-09-21 20:06:57 发布
阅读量1.1w
收藏
23
点赞数
5
分类专栏:
android入门
文章标签:
eclipse搭建android开发环境
android入门
专栏收录该内容
3 篇文章
0 订阅
订阅专栏
eclipse安装ADT插件
文章目录
eclipse安装ADT插件一、通过网络在线安装二、本地安装
在搭建Android开发环境的时候,我们需要为Eclipse安装ADT(Android Development Tools)插件,这个插件可以为用户提供一个强大的Android集成开发环境。通过给Eclipse安装ADT插件,用户才能够完成快速新建Android项目、创建界面、调试程序、导出apk等一系列的开发任务。
一、通过网络在线安装
点击菜单中的Help ——> Install New Software——>add ;在弹出的对话框中,在 "archive "右边的输入栏中输入:https://dl-ssl.google.com/android/eclipse/ 再者在"Local"输入自定义插件的名字,然后下面就会pending出来一个“Developer Tools”,勾选上,然后一路的Next下去就可以安装完成。
二、本地安装
但是在我天朝,这网站是上不去的,需要科学上网(你懂的呢),而且下载安装的速度也很慢。所以这就需要离线安装了,首先在网上下载好ADT插件包,可以到(http://tools.android-studio.org/index.php/adt-bundle-plugin),或者去这个网站上下(http://www.androiddevtools.cn/)。ADT插件列表如下: 安装步骤:
点击上述列表到百度云下载,当然也可以将http://dl.google.com/android/ADT-xx.x.x.zip地址里的ADT-XX.X.X部分替换为要下载的ADT版本号,ADT版本号可以在Android SDK Manager里识别,例如:安装ADT- 23.0.7,需要将http://dl.google.com/android/ADT-23.0.7.zip填入Localtion表格中。然后再点击Archive…按钮添加本地安装包。 一直next,直到窗口关闭,回到eclipse主界面,右下角出现: 在安装过程中,会弹出如此警告: 点击Install anyway按钮继续安装即可,直至安装完成,会提示重新启动软件。
参考链接:https://blog.csdn.net/lu1024188315/article/details/77966894
时间:2019年2月26日18点35分
-END-
优惠劵
我是大魔王2
关注
关注
5
点赞
踩
23
收藏
觉得还不错?
一键收藏
知道了
2
评论
eclipse安装ADT插件
eclipse安装ADT插件文章目录eclipse安装ADT插件一、通过网络在线安装二、本地安装在搭建Android开发环境的时候,我们需要为Eclipse安装ADT(Android Development Tools)插件,这个插件可以为用户提供一个强大的Android集成开发环境。通过给Eclipse安装ADT插件,用户才能够完成快速新建Android项目、创建界面、调试程序、导出apk...
复制链接
扫一扫
专栏目录
Eclipse+ADT(Eclipse怎样安装ADT插件)
11-14
教你Eclipse怎样安装ADT插件
.
eclipse搭建Android开发环境(eclipse配置ADT、SDK)详细步骤
雨云21的博客
03-14
9429
eclipse下载官网:https://www.eclipse.org/downloads/
ADT、SDK下载网址:https://www.androiddevtools.cn/
一.安装eclipse
1.将eclipse官网下载的压缩包解压,然后直接打开文件夹运行eclipse.exe。
2.运行界面如下。
二、eclipse配置ADT
ADT下载地址:https://www...
2 条评论
您还未登录,请先
登录
后发表或查看评论
Eclipse ADT 离线包 Eclipse安装ADT
01-11
Eclipse ADT 离线安装包,用于Eclipse安装ADT进行安卓程序开发
最新eclipse的ADT插件
12-16
eclipse的ADT23.04插件,eclipse的ADT23.04插件,eclipse的ADT23.04插件,eclipse的ADT23.04插件,
Eclipse安装ADT
北极的冰箱
05-03
2万+
参考官方链接https://stuff.mit.edu/afs/sipb/project/android/docs/sdk/installing/installing-adt.html
1.在线安装
(1)启动Eclipse,然后选择Help>Install New Software...;
(2)点击右上角的“Add”。在出现的“Add Repository”对话框中,为“名称”输
Eclipse ABAP ADT 集成详细安装教程
最新发布
nopicture的博客
09-21
1056
最近看到网上有个源码使用CDS做的,然后看了一下原来还可以用eclipse,趁热打铁,试了一把,最后成功了,中间可能会有一些报错,可以自己慢慢解决,大概就是这样的。增加语言包仓库地址:https://download.eclipse.org/technology/babel/update-site/latest/,名字随便取。2、点击红箭头指向的红框中的“Download Packages”。6、使用eclipse 执行ABAP开发。的开发,有三种开发路径,第一种是。3、下载后安装即可。
搭建安卓开发环境 GIT配色 terminator SecureCRT source insight Notepad++安装
纸上得来终觉浅,绝知此事要躬行
12-21
1815
windows 7 基本操作。
运行环境
windows 7
下载地址
环境下载
最近开接触Android(安卓)嵌入式开发,首要问题是搭建Andoid开发环境,由于本人用的是windows7的笔记本,也就只能到Windows中搭建Android 开发环境了! 就搭建环境都花了比较长的时间, 在各种版本之间折腾了比较久的时间, 装好后SDK包更新又是一个比较大的麻烦(
eclipse安装ADT插件搭建安卓开发环境
linxinfa的专栏
09-04
808
总结起来,Android开发环境搭建可以分为以下四步:
1、安装JDK
2、安装Eclipse
3、下载并安装AndroidSDK
4、为Eclipse安装ADT插件
下面说一下ADT的安装
首先在网上下载好 ADT插件包
网盘下载地址 http://pan.baidu.com/s/1qWspK7M
或者去这个网站上下 http://www.androiddevtools.cn/
ADT更多版本下...
eclipse+安装ADT插件+Android SDK--搭建安卓开发环境
木鱼wzh的博客
02-13
1万+
在看这篇博客前,请确保你的电脑已配置好JDK,并且已安装好eclipse
如果我们要通过Eclipse来开发Android应用程序的话,那么我们还需要下载Android SDK(Software Development Kit)和在Eclipse上安装ADT插件。
第一步:下载并安装AndroidSDK
首先打开安卓工具下载网站,我们可以看到这里面有Android开发所需的各种工具,首先找到SDK...
使用eclipse配置adt
Dimanche的博客
06-18
4884
1、 在浏览器中输入下载eclipse的地址:https://www.eclipse.org/downloads/packages/ ,根据自己电脑选择合适版本下载,由于目前是使用java语言进行android开发,我这里下载的是windows64的“Eclipse IDE for Java Developers”版本,如下图:
2、 在浏览器中输入https://www.androiddev...
如何在Eclipse中离线安装ADT
sanshou的专栏
08-19
890
背景
本来正常情况的话,去下载集成好ADT的Eclipse,就可以直接使用了:
【记录】搭建Android开发环境
但是呢,(有人)有时候,是本身已经有了Eclipse了,是需要(通过Eclipse)在线下载和安装ADT的。
(可参考官网的教程:Installing the Eclipse Plugin)
结果就遇到了这种问题:
即,在输入了:
?
1
eclipse中安装ADT插件的最简单的方法(不需要联网)亲测
yangxiaojun9238的专栏
01-09
3035
此方法不存在版本或者插件不全安装失败的问题
1,首先在eclipse的安装目录中,建一个links文件夹。
2,然后在D盘根目录下建立ADT_plug文件夹,在ADT_plug文件夹下建立一个eclipse文件夹,然后将下载好的ADT解压缩,将里面的features和plugins文件夹拷贝到前面建立的eclipse文件夹中。
3,然后再links文件夹下建立个后缀名为.link的文件
ADT下载地址(含各版本),最新ADT-23.0.6
cayre的专栏
06-09
7万+
(ADT不分32或64位)
2015/05/07 新增 ADT-23.0.6.zip
2015/01/18新增
ADT-23.0.3.zip
ADT-23.0.4.zip
ADT百度云下载链接(含各版本):
链接: https://pan.baidu.com/s/1qSWOlX43IRsQKMVdAKM2Zg 密码: smy6
官网各版本下载链接:
...
android安装SDK、安装ADT插件、创建AVD
qq_44872773的博客
11-11
4018
前提条件,
1、安装SDK之前需要安装JDK。
2、安装ADT插件前,必须安装MyEclipse。
参考文章地址:
一、下载Android SDK
1、下载地址
官网上下载:http://developer.android.com/sdk/index.html
国内地址:`https://www.androiddevtools.cn/
链接:https://pan.baidu.com/s/1z3Q7YM5z20PzBgpugBAiYw
提取码:qkjp
2、国内地址选择最新版本24.4.1
3、下载后解压
MyEclipse安装ADT
weixin_30699443的博客
09-30
190
====================问题描述==================== MyEclipse安装ADT23后打开文件时报错Anerrorhasoccurred.Seeerrorlogformoredetails.org.eclipse.swt.custom.StyledText.getScrollbarsMod...
Eclipse中离线安装ADT插件详细教程
余_小凡 的博客
05-29
3406
在搭建Android开发环境的时候,我们需要为Eclipse安装ADT(Android Development Tools)插件,这个插件可以为用户提供一个强大的Android集成开发环境。通过给Eclipse安装ADT插件,用户才能够完成快速新建Android项目、创建界面、调试程序、导出apk等一系列的开发任务。一般都是通过在线安装的方式。,由于ADT插件是从http://dl-ssl.goo...
Eclipse搭建Android开发环境(安装ADT,Android4.4.2)
热门推荐
海涛的博客
06-10
25万+
使用Eclipse做Android开发,需要先在Eclipse上安装ADT(Android Development Tools)插件。
1.安装JDK 1.7
ADT的下载及安装
Dimanche的博客
06-13
1万+
一、ADT相关介绍
ADT(Android Development Tools),是android在eclipse开发环境中的开发工具,在eclipse中以插件的形式安装。为android开发提供开发工具的升级和变更。
二、ADT下载及安装
在eclipse中有离线安装、在线安装两种方式安装插件,但是为了方便我们初学者更好的入门android开发,不至于在配置开发环境上浪费太多的功夫与时间,网上也...
eclipse安装ADT
09-14
要在eclipse中安装ADT插件,你可以按照以下步骤进行操作: 1. 首先,解压eclipse的压缩包并将其放置在适当的位置。然后创建eclipse的桌面快捷方式,并通过双击快捷方式来启动eclipse。 2. 一旦eclipse启动,你需要...
“相关推荐”对你有帮助么?
非常没帮助
没帮助
一般
有帮助
非常有帮助
提交
我是大魔王2
CSDN认证博客专家
CSDN认证企业博客
码龄7年
暂无认证
143
原创
3万+
周排名
137万+
总排名
51万+
访问
等级
5396
积分
107
粉丝
232
获赞
74
评论
791
收藏
私信
关注
热门文章
单片机第一个程序----点亮LED灯
43031
docker 问题解决:”invalid reference format: repository name must be lowercase”
36494
单片机实验----LED灯闪烁(汇编)
32044
Ubuntu安装sshd服务
20249
单片机实验----控制数码管的动态显示
19756
分类专栏
linux
4篇
docker
2篇
java
3篇
编程
2篇
idea
1篇
swagger
1篇
设计模式
1篇
springboot
45篇
redis
1篇
jpa
2篇
maven
4篇
apache
1篇
vscode
1篇
java问题
1篇
spring
那些年Java 学习中遇到的问题
5篇
单片机学习遇到的问题
1篇
单片机入门学习
8篇
微信小程序开发
11篇
安卓学习入门
1篇
Linux入门
10篇
软件使用
4篇
资源库
1篇
eclipse
html5
3篇
电脑问题
1篇
windows系统
1篇
php学习笔记
4篇
c's's
1篇
vue学习
2篇
树莓派学习
3篇
网站推荐
1篇
android入门
3篇
遇到的问题
6篇
markdown
1篇
composer
1篇
laravel
1篇
mybatis
7篇
小目标
1篇
rainmater
桌面美化
react
2篇
宝塔
1篇
chrome插件
1篇
D3入门教程
7篇
最新评论
mybatis遇到的问题----没有合适的驱动(No suitable driver found for jdbc)
m0_70604509:
mybatis遇到的问题----没有合适的驱动(No suitable driver found for jdbc)
大力pig:
那岂不是很惨
Android Studio打不开虚拟机,两种情况详解
qq_38619527:
解决了,谢谢
windows无法安装软件
老稳wwww:
系统管理在哪
使用composer时遇到的一些坑
uos_develop:
phar是压缩包,为什么放在bin目录下,前面不用加php就能运行呢?
您愿意向朋友推荐“博客详情页”吗?
强烈不推荐
不推荐
一般般
推荐
强烈推荐
提交
最新文章
VMware连不上网
ubuntu配置tomcat环境
Ubuntu安装sshd服务
2020年66篇
2019年33篇
2018年44篇
2017年8篇
目录
目录
分类专栏
linux
4篇
docker
2篇
java
3篇
编程
2篇
idea
1篇
swagger
1篇
设计模式
1篇
springboot
45篇
redis
1篇
jpa
2篇
maven
4篇
apache
1篇
vscode
1篇
java问题
1篇
spring
那些年Java 学习中遇到的问题
5篇
单片机学习遇到的问题
1篇
单片机入门学习
8篇
微信小程序开发
11篇
安卓学习入门
1篇
Linux入门
10篇
软件使用
4篇
资源库
1篇
eclipse
html5
3篇
电脑问题
1篇
windows系统
1篇
php学习笔记
4篇
c's's
1篇
vue学习
2篇
树莓派学习
3篇
网站推荐
1篇
android入门
3篇
遇到的问题
6篇
markdown
1篇
composer
1篇
laravel
1篇
mybatis
7篇
小目标
1篇
rainmater
桌面美化
react
2篇
宝塔
1篇
chrome插件
1篇
D3入门教程
7篇
目录
评论 2
被折叠的 条评论
为什么被折叠?
到【灌水乐园】发言
查看更多评论
添加红包
祝福语
请填写红包祝福语或标题
红包数量
个
红包个数最小为10个
红包总金额
元
红包金额最低5元
余额支付
当前余额3.43元
前往充值 >
需支付:10.00元
取消
确定
下一步
知道了
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝
规则
hope_wisdom 发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额
0
抵扣说明:
1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。 2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。
余额充值
ADT(数学模型及该模型上的一组操作)_百度百科
数学模型及该模型上的一组操作)_百度百科 网页新闻贴吧知道网盘图片视频地图文库资讯采购百科百度首页登录注册进入词条全站搜索帮助首页秒懂百科特色百科知识专题加入百科百科团队权威合作下载百科APP个人中心ADT是一个多义词,请在下列义项上选择浏览(共3个义项)展开添加义项ADT播报讨论上传视频数学模型及该模型上的一组操作收藏查看我的收藏0有用+10本词条由“科普中国”科学百科词条编写与应用工作项目 审核 。抽象数据类型(Abstract Data Type,ADT)是计算机科学中具有类似行为的特定类别的数据结构的数学模型;或者具有类似语义的一种或多种程序设计语言的数据类型。抽象数据类型是描述数据结构的一种理论工具,其目的是使人们能够独立于程序的实现细节来理解数据结构的特性。抽象数据类型的定义取决于它的一组逻辑特性,而与计算机内部如何表示无关。中文名抽象数据类型外文名AbstractDataType简 称ADT释 义数学模型及该模型上的一组操作行 业计算机软件研发群体程序员类 别开发工具目录1介绍2特征3示例4表示方法5接口和实现的分离6抽象数据结构7内置抽象数据类型介绍播报编辑抽象数据类型( ADT,Abstract Data Type)是指一个数学模型以及定义在此数学模型上的一组操作。它通常是对数据的某种抽象,定义了数据的取值范围及其结构形式,以及对数据操作的集合。 [1]例如,各种高级程序设计语言中都有“整数”类型,尽管它们在不同处理器上实现的方法不同,但对程序员而言是“相同的”,即数学特性相同。从“数学抽象”的角度看,可称它为一个“抽象数据类型”。 [1]抽象数据类型的特征是将使用与实现分离,从而实行封装和隐藏信息。抽象数据类型通过一种特定的数据结构在程序的某个部分得以实现,只关心在这个数据类型上的操作,而不关心数据结构具体实现。 [1]特征播报编辑抽象数据类型的特征主要体现在以下几个方面: [1]数据抽象。用ADT描述程序处理的实体时,强调的是其本质的特征、其所能完成的功能以及它和外部用户的接口(即外界使用它的方法)。 [1]数据封装。将实体的外部特性和其内部实现细节分离,并且对外部用户隐藏其内部实现细节,它包含两层含义: [1]①将数据和其行为结合在一起,形成一个不可分割的独立单位;②信息隐藏,即尽可能隐藏数据内部细节,只留有限的对外接口形成一个边界,与外部发生联系。封装的原则使得软件错误能够局部化,大大降低排错的难度,便于软件的维护。 [1]继承性。数据封装使得一个类型可以拥有一般类型的数据和行为,即对一般类型的继承。若特殊类型从多个一般类型中继承相关的数据和行为,则为多继承。 [1]多态性。多态性是指在一般类型中定义的数据或行为被特殊类型继承后,具有不同的数据类型或呈现出不同的行为。例如,“苹果”是“水果”的子类,它可以有“水果”的一般“吃”法,但其本身还可以有别的多种“吃法”。 [1]注:“抽象”的意义在于数据类型的数学特性,其数学特性和具体的计算机或语言无关。 [1]示例播报编辑在编程语言(或库)和教科书中,常见的几个抽象数据类型如下:关联数组关联数组用字符串代替数字来索引数组中的元素。可以认为索引字符串是用来寻找元素的关键字。在Perl中,利用在数组名前加前缀百分号(%)来定义一个关联数组。被赋值的值列表由索引字符串对和元素值组成。索引字符串后跟随元素值,元素值后面跟下个索引字符串和元素值,以此类推。 [2]复数定义如下: [3]ADT complex{数据对象:D={real, image | real∈实数, image∈实数} [3]数据关系:R={光力科技-ADT半导体智能制造产业基地建造进展_ADT
光力科技-ADT半导体智能制造产业基地建造进展_ADT
留言
Font Size:
А
А
А
Site Colors:
Accesskey
?
Pressing the Tab button repeatedly will help you navigate between the various links and areas in the page.
Activation of shortcut buttons depends on the browser you’re using:
For Internet Explorer, Google Chrome and older versions of Firefox, press Alt and a number button or a letter according to the list.
For Firefox 3 and over: press the buttons Alt + Shift + number or letter.
1 - Home page
4 - Search
Accessibility Statement
登录
English
繁体
首页
关于我们
公司介绍
公司简介
ADT USA
总经理寄语
管理层声明
环境管理政策
质量管控
条款和条件
全球分布
ADT总部及分部
亚洲
欧洲
美洲
非洲
产品介绍
划片机
单轴半自动划片机
单轴全自动划片机
双轴半自动划片机
双轴全自动划片机
切割刀片
树脂粘结切割刀片
金属烧结切割刀片
镍粘结切割刀片
硬刀
周边设备
水循环系统
主轴冷却系统
CO2发泡机
UV固化系统
切割减薄贴膜机
晶圆清洗机
UV解胶机
切割配件
法兰
磨刀板
工具
金属环和料盒
切割解决方案
切割解决方案
应用方案
工艺流程方案
量身定制解决方案
新闻活动
新闻活动
新闻
活动
技术支持与服务
技术支持与服务
下载中心
专业培训
工程师技术文件
联系我们
联系我们
联系方式
联系 ADT USA
人才招聘
登录
繁体
English
首页
关于我们
公司介绍
∟公司简介
∟ADT USA
∟总经理寄语
∟管理层声明
∟环境管理政策
∟质量管控
∟条款和条件
全球分布
∟ADT总部及分部
∟亚洲
∟欧洲
∟美洲
∟非洲
产品介绍
划片机
∟单轴半自动划片机
∟单轴全自动划片机
∟双轴半自动划片机
∟双轴全自动划片机
切割刀片
∟树脂粘结切割刀片
∟金属烧结切割刀片
∟镍粘结切割刀片
∟硬刀
周边设备
∟水循环系统
∟主轴冷却系统
∟CO2发泡机
∟UV固化系统
∟切割减薄贴膜机
∟晶圆清洗机
∟UV解胶机
切割配件
∟法兰
∟磨刀板
∟工具
∟金属环和料盒
切割解决方案
应用方案
工艺流程方案
量身定制解决方案
新闻活动
新闻
活动
技术支持与服务
下载中心
专业培训
工程师技术文件
联系我们
联系方式
联系 ADT USA
人才招聘
新闻活动
光力科技-ADT半导体智能制造产业基地建造进展
光力科技-ADT半导体智能制造产业基地建造进展
2022-03-01
中国半导体产业正处于发展壮大的黄金时期,国产设备厂商也纷纷加大投资力度,为“中国芯”贡献力量。
ADT也不例外。自2019年被中资收购后,ADT不断提升设备国产化水平及产能。作为ADT母公司,光力科技(国家火炬计划重点高新技术企业,股票代码:300480)全力助力ADT国产化及产能扩充,建造半导体智能制造产业基地。基地坐落于郑州航空港经济综合实验区的南部高端制造业集聚区,规划工业六街以西、黄海路以北。
图:郑州航空港经济综合实验区总体规划,星号为基地所处位置
项目规模总占地面积178亩,总建筑面积24万平方米。主要建设生产车间、检测楼、研发楼、办公楼及其配套设施。其中一期工程已于2020年9月正式开工,主体部分于2021年10月完工,主要生产国产化的以色列ADT半导体晶圆切割机及相关核心零部件。
图:俯瞰基地示意图
图:一区厂房效果图
项目一期将于2022年第二季度达成投产条件,建成后,预计年产先进晶圆切割机500套。届时,ADT将为客户提供更充分的设备产能及品质保证。
最新新闻
GLTECH&ADT董事兼副总经理张健欣参加2023 SEMI中国半导体供应链国际论坛活动
邀请函 | ADT 邀您参加 CSPT2023 第21届中国半导体封装测试技术与市场年会
喜迎新春
ADT邀您参加第24届中国国际光电博览会
新闻中心
豫ICP备2023036851号
©2020 ADT(Advanced Dicing Technologies). All Rights Reserved.
条款和条件
|
繁体
|
English
关于我们
公司介绍
全球分布
产品介绍
划片机
切割刀片
周边设备
切割配件
切割解决方案
新闻活动
新闻
活动
技术支持与服务
下载中心
专业培训
工程师技术文件
联系我们
各地联系方式
人才招聘
联系我们
收到您留言后,我们会在最短时间内与您取得联系,帮助您解决困惑。
*
请选择城市
中国大陆地区销售及支持
台湾地区销售及支持
美国地区销售及支持
全球其它地区销售
全球其它地区支持
*
*
*
*
*
提 交
基本
文件
流程
错误
SQL
调试
请求信息 : 2024-03-07 16:56:09 HTTP/1.1 GET : www.adt-co.cn/en/news/info.html?id=224运行时间 : 0.048666s [ 吞吐率:20.55req/s ] 内存消耗:3,681.85kb 文件加载:103查询信息 : 46 queries 0 writes 缓存信息 : 4 reads,0 writes会话信息 : SESSION_ID=d49k167vruuabl5aafoj9ettug
/www/wwwroot/www.adt-co.com/index.php ( 0.40 KB )/www/wwwroot/www.adt-co.com/core/base.php ( 2.65 KB )/www/wwwroot/www.adt-co.com/core/library/think/Loader.php ( 13.10 KB )/www/wwwroot/www.adt-co.com/vendor/composer/autoload_static.php ( 9.39 KB )/www/wwwroot/www.adt-co.com/core/library/think/Error.php ( 4.15 KB )/www/wwwroot/www.adt-co.com/vendor/psr/log/Psr/Log/LoggerInterface.php ( 3.21 KB )/www/wwwroot/www.adt-co.com/core/library/think/Facade.php ( 3.52 KB )/www/wwwroot/www.adt-co.com/core/library/think/Container.php ( 13.64 KB )/www/wwwroot/www.adt-co.com/core/library/think/App.php ( 28.78 KB )/www/wwwroot/www.adt-co.com/core/library/think/Config.php ( 8.88 KB )/www/wwwroot/www.adt-co.com/core/convention.php ( 11.75 KB )/www/wwwroot/www.adt-co.com/core/library/think/Env.php ( 2.84 KB )/www/wwwroot/www.adt-co.com/zmapp/tags.php ( 1.01 KB )/www/wwwroot/www.adt-co.com/core/library/think/Hook.php ( 6.02 KB )/www/wwwroot/www.adt-co.com/zmapp/common.php ( 22.61 KB )/www/wwwroot/www.adt-co.com/core/helper.php ( 20.15 KB )/www/wwwroot/www.adt-co.com/config/admin.php ( 0.05 KB )/www/wwwroot/www.adt-co.com/config/app.php ( 5.15 KB )/www/wwwroot/www.adt-co.com/core/library/think/facade/Env.php ( 0.97 KB )/www/wwwroot/www.adt-co.com/config/cache.php ( 0.95 KB )/www/wwwroot/www.adt-co.com/config/collection.php ( 0.05 KB )/www/wwwroot/www.adt-co.com/config/cookie.php ( 1.11 KB )/www/wwwroot/www.adt-co.com/config/database.php ( 0.57 KB )/www/wwwroot/www.adt-co.com/config/filecache.php ( 0.59 KB )/www/wwwroot/www.adt-co.com/config/log.php ( 0.93 KB )/www/wwwroot/www.adt-co.com/config/oauth.php ( 0.07 KB )/www/wwwroot/www.adt-co.com/config/session.php ( 1.06 KB )/www/wwwroot/www.adt-co.com/config/template.php ( 2.78 KB )/www/wwwroot/www.adt-co.com/config/trace.php ( 0.84 KB )/www/wwwroot/www.adt-co.com/config/version.php ( 0.05 KB )/www/wwwroot/www.adt-co.com/vendor/paragonie/random_compat/lib/random.php ( 8.01 KB )/www/wwwroot/www.adt-co.com/vendor/symfony/polyfill-mbstring/bootstrap.php ( 4.68 KB )/www/wwwroot/www.adt-co.com/vendor/symfony/polyfill-php70/bootstrap.php ( 0.94 KB )/www/wwwroot/www.adt-co.com/vendor/guzzlehttp/promises/src/functions_include.php ( 0.17 KB )/www/wwwroot/www.adt-co.com/vendor/guzzlehttp/promises/src/functions.php ( 12.66 KB )/www/wwwroot/www.adt-co.com/vendor/guzzlehttp/psr7/src/functions_include.php ( 0.16 KB )/www/wwwroot/www.adt-co.com/vendor/guzzlehttp/psr7/src/functions.php ( 25.50 KB )/www/wwwroot/www.adt-co.com/vendor/guzzlehttp/guzzle/src/functions_include.php ( 0.17 KB )/www/wwwroot/www.adt-co.com/vendor/guzzlehttp/guzzle/src/functions.php ( 10.30 KB )/www/wwwroot/www.adt-co.com/vendor/overtrue/wechat/src/Payment/helpers.php ( 1.76 KB )/www/wwwroot/www.adt-co.com/vendor/qiniu/php-sdk/src/Qiniu/functions.php ( 7.92 KB )/www/wwwroot/www.adt-co.com/vendor/qiniu/php-sdk/src/Qiniu/Config.php ( 3.46 KB )/www/wwwroot/www.adt-co.com/vendor/topthink/think-captcha/src/helper.php ( 1.65 KB )/www/wwwroot/www.adt-co.com/core/library/think/facade/Route.php ( 3.65 KB )/www/wwwroot/www.adt-co.com/core/library/think/Route.php ( 25.43 KB )/www/wwwroot/www.adt-co.com/core/library/think/Request.php ( 54.96 KB )/www/wwwroot/www.adt-co.com/core/library/think/route/Domain.php ( 7.17 KB )/www/wwwroot/www.adt-co.com/core/library/think/route/RuleGroup.php ( 15.23 KB )/www/wwwroot/www.adt-co.com/core/library/think/route/Rule.php ( 28.97 KB )/www/wwwroot/www.adt-co.com/core/library/think/route/RuleItem.php ( 8.73 KB )/www/wwwroot/www.adt-co.com/core/library/think/route/RuleName.php ( 1.77 KB )/www/wwwroot/www.adt-co.com/core/library/think/facade/Validate.php ( 4.67 KB )/www/wwwroot/www.adt-co.com/core/library/think/Validate.php ( 43.23 KB )/www/wwwroot/www.adt-co.com/core/library/think/Db.php ( 7.71 KB )/www/wwwroot/www.adt-co.com/core/library/think/Lang.php ( 7.66 KB )/www/wwwroot/www.adt-co.com/core/library/think/Log.php ( 9.22 KB )/www/wwwroot/www.adt-co.com/core/library/think/log/driver/File.php ( 6.14 KB )/www/wwwroot/www.adt-co.com/core/lang/zh-cn.php ( 12.54 KB )/www/wwwroot/www.adt-co.com/route/admin.php ( 0.16 KB )/www/wwwroot/www.adt-co.com/route/route.php ( 0.62 KB )/www/wwwroot/www.adt-co.com/core/library/think/route/dispatch/Url.php ( 6.49 KB )/www/wwwroot/www.adt-co.com/core/library/think/route/Dispatch.php ( 8.46 KB )/www/wwwroot/www.adt-co.com/core/library/think/route/dispatch/Module.php ( 4.94 KB )/www/wwwroot/www.adt-co.com/zmapp/en/tags.php ( 0.61 KB )/www/wwwroot/www.adt-co.com/zmapp/en/behavior/CheckPc.php ( 0.56 KB )/www/wwwroot/www.adt-co.com/zmapp/en/config/app.php ( 0.15 KB )/www/wwwroot/www.adt-co.com/zmapp/en/config/auth.php ( 0.70 KB )/www/wwwroot/www.adt-co.com/zmapp/en/config/template.php ( 0.87 KB )/www/wwwroot/www.adt-co.com/core/library/think/Cookie.php ( 7.32 KB )/www/wwwroot/www.adt-co.com/core/library/think/View.php ( 5.77 KB )/www/wwwroot/www.adt-co.com/core/library/think/view/driver/Think.php ( 6.22 KB )/www/wwwroot/www.adt-co.com/core/library/think/exception/ErrorException.php ( 1.74 KB )/www/wwwroot/www.adt-co.com/core/library/think/Exception.php ( 1.67 KB )/www/wwwroot/www.adt-co.com/core/library/think/exception/Handle.php ( 9.26 KB )/www/wwwroot/www.adt-co.com/core/library/think/Template.php ( 48.42 KB )/www/wwwroot/www.adt-co.com/core/library/think/template/driver/File.php ( 2.38 KB )/www/wwwroot/www.adt-co.com/core/library/think/Session.php ( 14.35 KB )/www/wwwroot/www.adt-co.com/core/library/think/Debug.php ( 7.70 KB )/www/wwwroot/www.adt-co.com/core/library/think/Cache.php ( 3.32 KB )/www/wwwroot/www.adt-co.com/core/library/think/cache/driver/File.php ( 8.20 KB )/www/wwwroot/www.adt-co.com/core/library/think/cache/Driver.php ( 8.73 KB )/www/wwwroot/www.adt-co.com/core/library/think/Middleware.php ( 4.17 KB )/www/wwwroot/www.adt-co.com/zmapp/en/behavior/ReadHtmlCacheBehavior.php ( 7.98 KB )/www/wwwroot/www.adt-co.com/core/library/think/facade/Request.php ( 6.33 KB )/www/wwwroot/www.adt-co.com/core/library/think/facade/Config.php ( 1.07 KB )/www/wwwroot/www.adt-co.com/zmapp/en/controller/Emptys.php ( 1.11 KB )/www/wwwroot/www.adt-co.com/zmapp/en/controller/Common.php ( 5.90 KB )/www/wwwroot/www.adt-co.com/zmapp/common/controller/AppCommon.php ( 1.83 KB )/www/wwwroot/www.adt-co.com/core/library/think/Controller.php ( 6.17 KB )/www/wwwroot/www.adt-co.com/core/library/traits/controller/Jump.php ( 4.93 KB )/www/wwwroot/www.adt-co.com/core/library/think/facade/Cache.php ( 1.87 KB )/www/wwwroot/www.adt-co.com/core/library/think/Response.php ( 9.63 KB )/www/wwwroot/www.adt-co.com/core/library/think/response/View.php ( 2.37 KB )/www/wwwroot/www.adt-co.com/runtime/temp/3314a3a335fee934d1b7dd4a3d4beb88.php ( 32.99 KB )/www/wwwroot/www.adt-co.com/core/library/think/db/Connection.php ( 60.80 KB )/www/wwwroot/www.adt-co.com/core/library/think/db/connector/Mysql.php ( 5.78 KB )/www/wwwroot/www.adt-co.com/core/library/think/db/builder/Mysql.php ( 5.46 KB )/www/wwwroot/www.adt-co.com/core/library/think/db/Builder.php ( 39.68 KB )/www/wwwroot/www.adt-co.com/core/library/think/db/Query.php ( 92.44 KB )/www/wwwroot/www.adt-co.com/core/library/think/facade/Url.php ( 0.94 KB )/www/wwwroot/www.adt-co.com/core/library/think/Url.php ( 13.01 KB )/www/wwwroot/www.adt-co.com/core/library/think/facade/Session.php ( 1.86 KB )/www/wwwroot/www.adt-co.com/core/library/think/debug/Html.php ( 4.17 KB )
[ LANG ] /www/wwwroot/www.adt-co.com/core/lang/zh-cn.php[ ROUTE ] array (
)[ HEADER ] array (
'connection' => 'keep-alive',
'accept' => '*/*',
'accept-encoding' => 'gzip, deflate, br',
'user-agent' => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36',
'host' => 'www.adt-co.cn',
'content-length' => '',
'content-type' => '',
)[ PARAM ] array (
'id' => '224',
)[ BEHAVIOR ] Run app\en\behavior\CheckPc->run @module_init [ RunTime:0.000024s ][ BEHAVIOR ] Run app\en\behavior\ReadHtmlCacheBehavior->run @module_init [ RunTime:0.000618s ][ VIEW ] /www/wwwroot/www.adt-co.com/theme/en/default/news/info.tpl [ array (
0 => 'site_name',
1 => 'site_url',
2 => 'site_title',
3 => 'site_keywords',
4 => 'site_description',
5 => 'site_icp',
6 => 'site_copyright',
7 => 'site_tongji',
8 => 'site_status',
9 => 'request_cache_except',
10 => 'site_tel',
11 => 'site_address',
12 => 'qq',
13 => 'y_title',
14 => 'site_logo',
15 => 'site_d_logo',
16 => 'site_kefu',
17 => 'site_email',
18 => 'WeChat',
19 => 'site_qrcode',
20 => 'jl_email',
21 => 'site_lng',
22 => 'site_lat',
23 => 's',
24 => 'id',
25 => 'cid',
26 => 'p',
27 => 'page',
28 => 'keyword',
) ][ DB ] INIT mysql
[2]"continue" targeting switch is equivalent to "break". Did you mean to use "continue 2"?[/www/wwwroot/www.adt-co.com/core/library/think/Template.php:1053][2]array_merge(): Expected parameter 2 to be an array, null given[/www/wwwroot/www.adt-co.com/zmapp/en/controller/Common.php:84][2]array_merge(): Expected parameter 2 to be an array, null given[/www/wwwroot/www.adt-co.com/zmapp/en/controller/Common.php:87][8]未定义数组索引: keyword[/www/wwwroot/www.adt-co.com/runtime/temp/3314a3a335fee934d1b7dd4a3d4beb88.php:102][2]Use of undefined constant userAuth - assumed 'userAuth' (this will throw an Error in a future version of PHP)[/www/wwwroot/www.adt-co.com/runtime/temp/3314a3a335fee934d1b7dd4a3d4beb88.php:105][8]未定义变量: Request[/www/wwwroot/www.adt-co.com/runtime/temp/3314a3a335fee934d1b7dd4a3d4beb88.php:116][8]未定义数组索引: pid[/www/wwwroot/www.adt-co.com/runtime/temp/3314a3a335fee934d1b7dd4a3d4beb88.php:119][8]未定义数组索引: index[/www/wwwroot/www.adt-co.com/runtime/temp/3314a3a335fee934d1b7dd4a3d4beb88.php:120][8]未定义数组索引: pid[/www/wwwroot/www.adt-co.com/runtime/temp/3314a3a335fee934d1b7dd4a3d4beb88.php:185][8]未定义数组索引: pid[/www/wwwroot/www.adt-co.com/runtime/temp/3314a3a335fee934d1b7dd4a3d4beb88.php:185][8]未定义数组索引: pid[/www/wwwroot/www.adt-co.com/runtime/temp/3314a3a335fee934d1b7dd4a3d4beb88.php:185][8]未定义数组索引: pid[/www/wwwroot/www.adt-co.com/runtime/temp/3314a3a335fee934d1b7dd4a3d4beb88.php:185][8]未定义数组索引: keyword[/www/wwwroot/www.adt-co.com/runtime/temp/3314a3a335fee934d1b7dd4a3d4beb88.php:289][2]Use of undefined constant userAuth - assumed 'userAuth' (this will throw an Error in a future version of PHP)[/www/wwwroot/www.adt-co.com/runtime/temp/3314a3a335fee934d1b7dd4a3d4beb88.php:294][2]Use of undefined constant php - assumed 'php' (this will throw an Error in a future version of PHP)[/www/wwwroot/www.adt-co.com/runtime/temp/3314a3a335fee934d1b7dd4a3d4beb88.php:300][8]未定义数组索引: pid[/www/wwwroot/www.adt-co.com/runtime/temp/3314a3a335fee934d1b7dd4a3d4beb88.php:356][8]未定义数组索引: pid[/www/wwwroot/www.adt-co.com/runtime/temp/3314a3a335fee934d1b7dd4a3d4beb88.php:356][8]未定义数组索引: pid[/www/wwwroot/www.adt-co.com/runtime/temp/3314a3a335fee934d1b7dd4a3d4beb88.php:356][8]未定义数组索引: pid[/www/wwwroot/www.adt-co.com/runtime/temp/3314a3a335fee934d1b7dd4a3d4beb88.php:356]
[ DB ] CONNECT:[ UseTime:0.000315s ] mysql:host=127.0.0.1;port=3306;dbname=www_adt_co_com;charset=utf8[ SQL ] SHOW COLUMNS FROM `zhimeng_article` [ RunTime:0.000863s ][ SQL ] SELECT * FROM `zhimeng_article` WHERE `id` = 224 LIMIT 1 [ RunTime:0.000261s ][ SQL ] SELECT * FROM `zhimeng_article` WHERE `id` < 224 ORDER BY `sort` ASC,`id` DESC LIMIT 1 [ RunTime:0.000301s ][ SQL ] SELECT * FROM `zhimeng_article` WHERE `id` > 224 ORDER BY `sort` ASC,`id` ASC LIMIT 1 [ RunTime:0.000255s ][ SQL ] SHOW COLUMNS FROM `zhimeng_webpage` [ RunTime:0.000960s ][ SQL ] SELECT * FROM `zhimeng_webpage` WHERE `pid` = 9 ORDER BY `sort` ASC [ RunTime:0.000394s ][ SQL ] SHOW COLUMNS FROM `zhimeng_category` [ RunTime:0.000674s ][ SQL ] SELECT * FROM `zhimeng_category` WHERE ( `model` = 'guanli' AND `pid` = 0 ) [ RunTime:0.000297s ][ SQL ] SELECT * FROM `zhimeng_category` WHERE ( `model` = 'product' AND `pid` = 0 ) ORDER BY `sort` ASC LIMIT 0,4 [ RunTime:0.000339s ][ SQL ] SELECT * FROM `zhimeng_category` WHERE ( `model` = 'product' AND `pid` = 52 ) ORDER BY `sort` ASC [ RunTime:0.000302s ][ SQL ] SELECT * FROM `zhimeng_category` WHERE ( `model` = 'product' AND `pid` = 507 ) ORDER BY `sort` ASC [ RunTime:0.000213s ][ SQL ] SELECT * FROM `zhimeng_category` WHERE ( `model` = 'product' AND `pid` = 510 ) ORDER BY `sort` ASC [ RunTime:0.000228s ][ SQL ] SELECT * FROM `zhimeng_category` WHERE ( `model` = 'product' AND `pid` = 508 ) ORDER BY `sort` ASC [ RunTime:0.000180s ][ SQL ] SELECT * FROM `zhimeng_category` WHERE ( `model` = 'product' AND `pid` = 509 ) ORDER BY `sort` ASC [ RunTime:0.000185s ][ SQL ] SELECT * FROM `zhimeng_category` WHERE ( `model` = 'product' AND `pid` = 78 ) ORDER BY `sort` ASC [ RunTime:0.000212s ][ SQL ] SELECT * FROM `zhimeng_category` WHERE ( `model` = 'product' AND `pid` = 108 ) ORDER BY `sort` ASC [ RunTime:0.000207s ][ SQL ] SELECT * FROM `zhimeng_category` WHERE ( `model` = 'product' AND `pid` = 110 ) ORDER BY `sort` ASC [ RunTime:0.000172s ][ SQL ] SELECT * FROM `zhimeng_category` WHERE ( `model` = 'product' AND `pid` = 109 ) ORDER BY `sort` ASC [ RunTime:0.000173s ][ SQL ] SELECT * FROM `zhimeng_category` WHERE ( `model` = 'product' AND `pid` = 394 ) ORDER BY `sort` ASC [ RunTime:0.000260s ][ SQL ] SELECT * FROM `zhimeng_category` WHERE ( `model` = 'product' AND `pid` = 71 ) ORDER BY `sort` ASC [ RunTime:0.000314s ][ SQL ] SELECT * FROM `zhimeng_category` WHERE ( `model` = 'product' AND `pid` = 81 ) ORDER BY `sort` ASC [ RunTime:0.000285s ][ SQL ] SELECT * FROM `zhimeng_category` WHERE ( `model` = 'product' AND `pid` = 84 ) ORDER BY `sort` ASC [ RunTime:0.000212s ][ SQL ] SELECT * FROM `zhimeng_category` WHERE ( `model` = 'product' AND `pid` = 85 ) ORDER BY `sort` ASC [ RunTime:0.000179s ][ SQL ] SELECT * FROM `zhimeng_category` WHERE ( `model` = 'product' AND `pid` = 83 ) ORDER BY `sort` ASC [ RunTime:0.000172s ][ SQL ] SELECT * FROM `zhimeng_category` WHERE ( `model` = 'product' AND `pid` = 475 ) ORDER BY `sort` ASC [ RunTime:0.000186s ][ SQL ] SELECT * FROM `zhimeng_category` WHERE ( `model` = 'product' AND `pid` = 461 ) ORDER BY `sort` ASC [ RunTime:0.000203s ][ SQL ] SELECT * FROM `zhimeng_category` WHERE ( `model` = 'product' AND `pid` = 497 ) ORDER BY `sort` ASC [ RunTime:0.000184s ][ SQL ] SELECT * FROM `zhimeng_category` WHERE ( `model` = 'product' AND `pid` = 79 ) ORDER BY `sort` ASC [ RunTime:0.000192s ][ SQL ] SELECT * FROM `zhimeng_category` WHERE ( `model` = 'product' AND `pid` = 112 ) ORDER BY `sort` ASC [ RunTime:0.000195s ][ SQL ] SELECT * FROM `zhimeng_category` WHERE ( `model` = 'product' AND `pid` = 115 ) ORDER BY `sort` ASC [ RunTime:0.000231s ][ SQL ] SELECT * FROM `zhimeng_category` WHERE ( `model` = 'product' AND `pid` = 113 ) ORDER BY `sort` ASC [ RunTime:0.000197s ][ SQL ] SELECT * FROM `zhimeng_category` WHERE ( `model` = 'product' AND `pid` = 114 ) ORDER BY `sort` ASC [ RunTime:0.000179s ][ SQL ] SELECT * FROM `zhimeng_category` WHERE ( `model` = 'solution' AND `pid` = 0 ) [ RunTime:0.000183s ][ SQL ] SELECT * FROM `zhimeng_category` WHERE ( `model` = 'article' AND `pid` = 0 ) ORDER BY `sort` [ RunTime:0.000229s ][ SQL ] SELECT * FROM `zhimeng_webpage` WHERE `pid` = 9 ORDER BY `sort` ASC [ RunTime:0.000337s ][ SQL ] SELECT * FROM `zhimeng_category` WHERE ( `model` = 'guanli' AND `pid` = 0 ) [ RunTime:0.000239s ][ SQL ] SELECT * FROM `zhimeng_category` WHERE ( `model` = 'product' AND `pid` = 0 ) ORDER BY `sort` ASC LIMIT 0,4 [ RunTime:0.000210s ][ SQL ] SELECT * FROM `zhimeng_category` WHERE ( `model` = 'product' AND `pid` = 52 ) ORDER BY `sort` ASC [ RunTime:0.000229s ][ SQL ] SELECT * FROM `zhimeng_category` WHERE ( `model` = 'product' AND `pid` = 78 ) ORDER BY `sort` ASC [ RunTime:0.000226s ][ SQL ] SELECT * FROM `zhimeng_category` WHERE ( `model` = 'product' AND `pid` = 71 ) ORDER BY `sort` ASC [ RunTime:0.000225s ][ SQL ] SELECT * FROM `zhimeng_category` WHERE ( `model` = 'product' AND `pid` = 79 ) ORDER BY `sort` ASC [ RunTime:0.000214s ][ SQL ] SELECT * FROM `zhimeng_category` WHERE ( `model` = 'solution' AND `pid` = 0 ) [ RunTime:0.000232s ][ SQL ] SELECT * FROM `zhimeng_category` WHERE ( `model` = 'article' AND `pid` = 0 ) ORDER BY `sort` [ RunTime:0.000195s ][ SQL ] SELECT * FROM `zhimeng_article` WHERE ( `status` = 1 AND `j_show` = 1 ) ORDER BY `create_time` DESC LIMIT 0,4 [ RunTime:0.000345s ][ SQL ] SELECT * FROM `zhimeng_category` WHERE ( `model` = 'product' AND `pid` = 0 ) ORDER BY `sort` ASC LIMIT 0,4 [ RunTime:0.000234s ][ SQL ] SELECT * FROM `zhimeng_category` WHERE `model` = 'article' ORDER BY `sort` ASC [ RunTime:0.000184s ]
抽象数据类型定义(ADT)_抽象数据类型定义dsp-CSDN博客
>抽象数据类型定义(ADT)_抽象数据类型定义dsp-CSDN博客
抽象数据类型定义(ADT)
最新推荐文章于 2022-06-04 16:45:32 发布
喜欢哲学的女孩
最新推荐文章于 2022-06-04 16:45:32 发布
阅读量2.9w
收藏
134
点赞数
45
分类专栏:
算法与数据结构
文章标签:
数据结构
抽象数据类型
算法与数据结构
专栏收录该内容
26 篇文章
0 订阅
订阅专栏
一、抽象数据类型定义(ADT)
作用:抽象数据类型可以使我们更容易描述现实世界。例:用线性表描述学生成绩表,用树或图描述遗传关系。
定义:一个数学模型以及定义在该模型上的一组操作。
关键:使用它的人可以只关心它的逻辑特征,不需要了解它的存储方式。定义它的人同样不必要关心它如何存储。
例:线性表这样的抽象数据类型,其数学模型是:数据元素的集合,该集合内的元素有这样的关系:除第一个和最后一个外,每个元素有唯一的前趋和唯一的后继。可以有这样一些操作:插入一个元素、删除一个元素等。
抽象数据类型分类
原子类型值不可分解,如int固定聚合类型值由确定数目的成分按某种结构组成,如复数可变聚合类型值的成分数目不确定如学生基本情况
抽象数据类型表示法:
一、
三元组表示:(D,S,P)
其中D是数据对象,S是D上的关系集,P是对D的基本操作集。
二、书中的定义格式:
ADT 抽象数据类型名{
数据对象:<数据对象的定义>
数据关系:<数据关系的定义>
基本操作:<基本操作的定义>
}ADT 抽象数据类型名
例:线性表的表示
名称线性表 数据对象D={ai| ai(-ElemSet,i=1,2,...,n,n>=0}任意数据元素的集合数据关系R1={
二、类C语言语法
类C语言语法示例
1、预定义常量和类型#define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define OVERFLOW -2 typedef in Status; //Status是函数的类型,其值是函数结果状态代码。2、数据结构的存储结构typedef ElemType first;3、基本操作的算法 函数类型 函数名(函数参数表){ //算法说明 语句序列 }//函数名 4、赋值语句简单赋值:变量名=表达式;串联赋值:变量名1=变量名2=...=变量名k=表达式;成组赋值:(变量名1,...,变量名k)=(表达式1,...,表达式k); 结构名=结构名; 结构名=(值1,...,值k); 变量名[]=表达式; 变量名[起始下标..终止下标]=变量名[起始下标..终止下标]; 交换赋值:变量名<-->变量名;条件赋值:变量名=条件表达式?表达式?表达式T:表达式F5、选择语句 1、if(表达式) 语句; 2、if(表达式) 语句; else 语句; 3、switch(表达式){ case 值1:语句序列1;break; ... case 值n:语句序列n;break; default:语句序列n+1;break; } 4、switch{ case 条件1:语句序列1;break; ... case 条件n:语句序列n;break; default:语句序列n+1;break; } 6、循环语句for(赋初值表达式;条件;修改表达式序列)语句; while(条件)语句; do{ 语句序列}while(条件);7、结束语句 return [表达式]; return; //函数结束语句 break; //case结束语句 exit(异常代码); //异常结束语句 8、输入和输出语句scanf([格式串],变量1,...,变量n);9、注释//文字序列10、基本函数max(表达式1,...,表达式n) min,abs,floor,ceil,eof,eoln11、逻辑运算&&与运算;||或运算
例:线性表的实现: ADT List{
数据对象: D={ai| ai(-ElemSet,i=1,2,...,n,n>=0}
数据关系: R1={
基本操作:
InitList(&L) DestroyList(&L) ListInsert(&L,i,e) ListDelete(&L,i,&e)
}ADT List
ListInsert(List &L,int i,ElemType e)
{if(i<1||i>L.length+) return ERROR;
q=&(L.elem[i-1]);
for(p=&(L.elem[L.length-1]);p>=q;--p) *(p+1)=*p;
*q=e;
++L.length;
return OK;
}
下面是C语言编译通过的示例:
#define ERROR 0 #define OK 1 struct STU { char name[20]; char stuno[10]; int age; int score; }stu[50]; struct LIST { struct STU stu[50]; int length; }L; int printlist(struct LIST L) { int i; printf("name stuno age score/n"); for(i=0;i
优惠劵
喜欢哲学的女孩
关注
关注
45
点赞
踩
134
收藏
觉得还不错?
一键收藏
知道了
0
评论
抽象数据类型定义(ADT)
一、抽象数据类型定义(ADT)作用:抽象数据类型可以使我们更容易描述现实世界。例:用线性表描述学生成绩表,用树或图描述遗传关系。定义:一个数学模型以及定义在该模型上的一组操作。关键:使用它的人可以只关心它的逻辑特征,不需要了解它的存储方式。定义它的人同样不必要关心它如何存储。例:线性表这样的抽象数据类型,其数学模型是:数据元素的集合,该集合内的元素有这样的关系:除第一个和最后一
复制链接
扫一扫
专栏目录
DataStructures-ADT:抽象数据类型(ADT)算法的实现
03-25
数据结构
数据结构需求
随着应用程序变得越来越复杂和数据越来越丰富,当今应用程序面临三个常见问题。
资料搜寻
处理器速度
多个请求
抽象数据类型
抽象数据类型(ADT)是某种编程语言中与实现无关的数据类型的规范。 ADT的接口是根据类型和对该类型的一组操作定义的。
每个操作的行为取决于其输入和输出。 ADT没有指定如何实现数据类型。 这些实现细节对ADT的用户是隐藏的,并且可以防止外部访问(称为封装)。
数据结构是ADT的实现。 在像Java这样的面向对象的语言中,抽象数据类型及其实现共同构成一个类。 与ADT相关的每个操作都由成员,功能或方法实现。
定义数据项所需空间的变量称为数据成员。 对象是类的实例,即在计算机程序执行期间创建并占用存储空间的对象。
数据结构-1.绪论
qq_52758861的博客
03-19
962
数据结构; 数据项; 数据元; 逻辑结构; 存储结构; 抽象数据类型; 算法
参与评论
您还未登录,请先
登录
后发表或查看评论
1.数据结构的研究内容(数据结构和算法)
飞扬晴雪
05-09
1577
数据结构的研究内容1.1计算机解决问题:1.1.1计算机处理问题的思路:1.1.2计算机处理问题的思路:1.2数据结构和术语1.2.1数据定义:1.2.2数结构层级关系:1.2.2数结构包含的内容:
1.1计算机解决问题:
1.1.1计算机处理问题的思路:
1.将具体问题抽象为数学模型;
2设计算法;
3编程、调试、运行;
1.1.2计算机处理问题的思路:
1操作对象;2.操作算法;3.操作对象之间的关系;
1.2数据结构和术语
1.2.1数据定义:
能够被计算机处理的各种符号的集合:
信息的载体;是对客
数据结构 1-0 绪论
博客标题不能为空我也没办法
10-08
199
数据结构的基本概念
数据结构中涉及很多的概念,这些概念在后面也许用不到,但是对于理解数据结构的概念具有很好的帮助
数据:数据是信息的载体,能够输入到计算机内并且被计算机程序所识别和处理的符号的集合就是数据。
数据元素:数据元素是数据的基本单位,一个数据项可由若干个数据项组成,数据项是数据元素最小的不可分割的最小单位。
数据对象:数据对象是具有相同性质的数据元素的集合,是数据的一个子集。
数据类型:数据类型是一个值的集合和定义在这个集合上的一组操作的总称。数据类型分为三类,原子类型指的是其值不可以再分的数据类
2021-01-21
zdn135860_的博客
01-21
711
数据结构可用三元式表示(D,S,P)。其中:D是数据对象,S是D上的关系集,P是对D的基本操作集。×
(DSP是指抽象数据类型,数据结构用DS表示)
队列是数据对象特定的线性表。(字符串)×
一棵无向连通图的生成树是其极大的连通子图。(极小)×
完全二叉树必定是平衡二叉树。(平衡二叉树有序)×
若广义表LS满足GetHead(LS)==GetTail(LS),则LS为( b )。
A. ( ) B. (( )) C. (( ),( )) D. (( ..
抽象数据类型(ADT)
hit_zjx的博客
06-01
656
关于面向对象编程ADT的思考
数据结构课程(共40课) 第二课 抽象数据类型的表示与实现
weixin_30263277的博客
01-25
1458
本课主题: 抽象数据类型的表示与实现
教学目的: 了解抽象数据类型的定义、表示和实现方法
教学重点: 抽象数据类型表示法、类C语言语法
教学难点: 抽象数据类型表示法
授课内容:
一、抽象数据类型定义(ADT)
作用:抽象数据类型可以使我们更容易描述现实世界。例:用线性表描述学生成绩表,用树或图描述遗传关系。
定义:一个数学模型以及定义在该模型上的一组操作。
关键:使用它的人可...
抽象数据类型 (ADT)
weixin_60151280的博客
06-04
996
一、Abstraction and User-Defined Types二、Classifying Types and Operations不可变数据类型: 其操作不可改变内部值,而是构造新的对象 六、Testing an Abstract Data TypeHow to test an ADT:测试creators, producers, and mutators:调用observers来观察这些operations的结果是否满足spec;测试observers:调用creators, produce
抽象数据类型 ADT
FOR 的博客
08-25
4354
5. 抽象数据类型(ADT)
抽象数据类型 (ADT,Abstract Data Type)是指一个 数学模型 以及定义在此数学模型上的一组操作。 它通常是对数据的某种抽象,定义了数据的 取值范围 及其结构形式,以及对 数据操作 的集合 。抽象数据类型是描述数据结构的一种理论工具,其目的是使人们能够独立于程序的实现细节来理解数据结构的特性。
抽象数据类型 ( abstract data type ) 是从数据使用者的角度去看数据类型。抽象数据类型是对数据的一种抽象描述,是一种数学上的约束。数据结构是ADT的
ADT抽象数据类型
weixin_51404363的博客
06-04
668
一.ADT:抽象数据类型1.除了编程语言所提供的基本数据类型和对象数据类型,程序员可定义自己的数据类型2.抽象数据类型被其操作定义,操作和规约刻画其特征3.抽象数据类型与表示独立性:能够分离数据结构和对其使用的方式4.ADT特性:不变量、表示泄露、、抽象函数AF、表示不变量RI二.可变和不可变数据类型1.可变类型的对象:提供了可改变其内部数据的值的操作2.不可变数据类型:其操作不可改变内部值3.抽象类型的操作:构造器(从无到有),构造器可能需要一个对象参数,但这个参数类型不是要构造的类型生产器(从有到新),
抽象数据类型(三元组ADT、复数四则运算)
05-12
抽象数据类型(三元组ADT、复数四则运算) 数据结构 湖南大学
ADT.zip_ADT 复数_复数ADT_复数ADT的描述_复数adt定义_抽象数据类型
09-22
复数抽象数据类型ADT的描述及实现 复数ADT的描述: ADT complex{ 数据对象:D={ c1,c2 c1,c2∈FloatSet } 数据关系:R={
面向对象编程:Java中的抽象数据类型
01-20
在本文中,我们将考察Java中的数据类型,但是我们将介绍抽象数据类型(ADT)的概念。我们还将通过介绍Java Collections Framework(Java 集合架构)来学习Java定义的一些ADT。 ADT 一个ADT是一个仅由保存的...
数据结构-抽象数据类型.pdf
07-11
2、抽象数据类型( 、抽象数据类型(Abstract Data Type, ADT) ) 是指⼀个数学模型及定义在该模型上的⼀组操作。 抽象:抽取出事物具有的普遍性的本质。抽象的意义在于数据类型的数学抽象特性。 例如,在Unity中...
图的抽象数据类型实现
12-15
二、 抽象数据类型定义以及各基本操作的简要描述 ADT MGraph{ 数据对象:n=n是具有相同特征的数据元素集合,称为顶点集。 数据关系:DR={,w>|v,w∈n且,w>表示从v指向w的弧} 基本操作: CreateMGraph 初始条件:n是...
数据结构 C语言 设计集合抽象数据类型
05-07
}ADT LinkList
2. 集合的抽象数据类型定义为:
ADT LinkSet {
数据对象:D={ | IntSet,i=1,2,…,n,n 0}
数据关系:R1={}
基本操作:
CreatSet(*L)
初始条件:s为整型数组。...
数据结构与算法笔记-线性表定义和特点
01-07
线性表的定义和特点 # 定义: 由n (n>0)个数据特性相同的元素构成的有限序列称为线性表。 # 对于非空线性表或者线性...一、下列给出线性表的抽象数据类型定义: ADT 线性表 (list) Data 线性表的数据对象集合为{a1,a
苏大872数据结构指点江山
03-12
Clifford A.Shaffer在《数据结构与算法分析》一书中的定义是:"数据结构是ADT(抽象数据类型Abstract Data Type) 的物理实现。" Robert L.Kruse在《数据结构与程序设计》一书中,将一个数据结构的设计过程分成抽象层...
程序设计抽象思想:C语言描述-
04-21
第8章 抽象数据类型 …… 第9章 效率与ADT 第10章 线性结构 第11章 符号表 第Ⅳ部分 递归数据 第12章 递归链表 第13章 树 第14章 表达式树 第15章 集合 第16章 图 第17章 展望Java
抽象数据类型adt定义
最新发布
05-10
抽象数据类型(ADT)是一种数学模型,它定义了一组数据类型和一组操作这些数据类型的操作。ADT 将数据和它们的操作分离开来,以便在实现时可以对它们进行修改。ADT 可以看作是一种封装机制,它隐藏了数据类型的内部...
“相关推荐”对你有帮助么?
非常没帮助
没帮助
一般
有帮助
非常有帮助
提交
喜欢哲学的女孩
CSDN认证博客专家
CSDN认证企业博客
码龄11年
暂无认证
145
原创
9万+
周排名
170万+
总排名
49万+
访问
等级
6312
积分
208
粉丝
217
获赞
45
评论
504
收藏
私信
关注
热门文章
抽象数据类型定义(ADT)
29708
Keil串口仿真调试
22496
Qt学习之路【5】:静态Qt库下SQLite数据库无法加载驱动(QSQLITE driver not loaded)
15902
使用"conn / as sysdba"登录时报出"insufficient privileges"错的问题
12542
extern和volatile的用法
12026
分类专栏
linux学习
22篇
Linux C 程序设计学习笔记
9篇
算法与数据结构
22篇
ARM裸机程序设计
5篇
Java后端技术学习总结
13篇
基础编程
1篇
Makefile
2篇
嵌入式学习
32篇
Linux驱动
14篇
linux学习
38篇
C语言学习
40篇
裸机程序开发篇
5篇
WEB框架学习
4篇
Java相关开发
27篇
Java基础
5篇
数据库
4篇
思考与总结
21篇
指导杂文
9篇
网络管理
6篇
windows
3篇
算法与数据结构
26篇
Qt学习
6篇
最新评论
数码管消影问题总结
睇宁个呢:
这错别字,像机器人
数码管消影问题总结
吃貔恘的饕餮:
请问为什么一定要delay呢?直接进入下一位理论上已经消影,但实际中不delay的话还是会有重影现象
Keil串口仿真调试
mdc9:
点运行 或者F5 只单步运行,不全速运行咋回事
Keil串口仿真调试
不成大佬我是猪:
https://www.keil.com/support/man/docs/uv4/uv4_debug_commands.htm直接去keil官网看就行了
extern和volatile的用法
十万空击:
请问我在main函数里加的延时函数,5秒检测一次。为什么检测速度还是很快?
您愿意向朋友推荐“博客详情页”吗?
强烈不推荐
不推荐
一般般
推荐
强烈推荐
提交
最新文章
软件开发技术文档编写规范
ROM、SDRAM、RAM、DRAM、SRAM、FLASH 的区别
【linux学习】ubuntu下挂载window共享文件
2019年7篇
2018年25篇
2017年20篇
2016年25篇
2015年15篇
2014年149篇
2013年10篇
2012年1篇
目录
目录
分类专栏
linux学习
22篇
Linux C 程序设计学习笔记
9篇
算法与数据结构
22篇
ARM裸机程序设计
5篇
Java后端技术学习总结
13篇
基础编程
1篇
Makefile
2篇
嵌入式学习
32篇
Linux驱动
14篇
linux学习
38篇
C语言学习
40篇
裸机程序开发篇
5篇
WEB框架学习
4篇
Java相关开发
27篇
Java基础
5篇
数据库
4篇
思考与总结
21篇
指导杂文
9篇
网络管理
6篇
windows
3篇
算法与数据结构
26篇
Qt学习
6篇
目录
评论
被折叠的 条评论
为什么被折叠?
到【灌水乐园】发言
查看更多评论
添加红包
祝福语
请填写红包祝福语或标题
红包数量
个
红包个数最小为10个
红包总金额
元
红包金额最低5元
余额支付
当前余额3.43元
前往充值 >
需支付:10.00元
取消
确定
下一步
知道了
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝
规则
hope_wisdom 发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额
0
抵扣说明:
1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。 2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。
余额充值
2023 ASCO | 郑伏甫教授:ADT治疗进展——合理选择,早期预测,全程管理_前列腺癌_ADT_医脉通
2023 ASCO | 郑伏甫教授:ADT治疗进展——合理选择,早期预测,全程管理_前列腺癌_ADT_医脉通
最新进展
登录
麦粒:0
2023 ASCO | 郑伏甫教授:ADT治疗进展——合理选择,早期预测,全程管理
2023-06-14
来源:医脉通
关键词:
前列腺癌
ADT
发表评论
郑伏甫
5篇内容
前往专栏主页
医脉通编辑撰写,未经授权请勿转载。编者按雄激素剥夺治疗(ADT)是前列腺癌应用最广泛、历史最悠久的治疗方式之一,至今仍是众多联合治疗的基础。对不同的患者选择适合的ADT治疗方式和疗程,在治疗中通过监测重要生化指标如睾酮和前列腺特异性抗原(PSA)等预测治疗效果和患者预后,均有助于前列腺癌的全程管理,为患者带来更多获益。本期“益腺学院”聚焦2023年美国临床肿瘤学会(ASCO)年会,特邀中山大学附属第一医院泌尿外科郑伏甫教授,深入解读前列腺癌以ADT为基石的治疗中患者的合理选择和早期生化指标与预后关系的研究进展,分享其专业见解。Abs 5001:在多个NRG/RTOG Ⅲ期试验中开发并验证人工智能衍生的基于数字化病理学的生物标志物,用于预测高危局限性前列腺癌患者接受长期雄激素剥夺治疗联合放疗的获益[1]研究背景雄激素剥夺治疗(ADT)可改善接受放疗(RT)的高危局限性前列腺癌患者的生存并降低转移风险。临床需要预测性生物标志物指导ADT的治疗持续时间,从而最大化获益并最小化风险。本研究拟利用多个NRG肿瘤学会Ⅲ期随机试验的数据,训练并验证首个预测长期(LT)vs短期(ST)ADT获益的生物标志物。研究方法将6项NRG/RTOG Ⅲ期随机试验中接受RT±ADT治疗的患者治疗前的前列腺活检切片进行数字化处理。利用RTOG 9408、9413、9902、9910和0521试验训练人工智能(AI)衍生的临床和组织病理学预测性生物标志物,用以预测LTADT对于远处转移(DM)获益的差异,其方法架构详见图1。锁定AI生物标志物后,在RTOG 9202试验(患者随机分为RT+ STADT[4个月]和RT+ LTADT[28个月]两组)中进行验证。采用Fine-Gray相互作用模型分别评估AI生物标志物预测ADT持续时间对主要终点DM和次要终点的效用。采用累积发生率法估算事件发生率。图1 多模式AI架构研究结果在2641例患者(中位随访9.8年;IQR,8.2-11.5年)中训练了AI生物标志物,并在RTOG 9202试验(80%的患者有至少1个高危/极高危[cT3-4、Gleason 8-10、PSA>20、初始Gleason结构类型5])的1192例患者(中位随访17.2年;IQR,9.1-19.6年)中进行了验证。与已发表的结果一致,LTADT显著改善了验证队列中患者的DM(亚分布风险比[sHR]0.64,95%CI 0.50-0.82,p<0.001)。AI生物标志物是DM的预后标志物(sHR 2.35,95%CI 1.72-3.19,p<0.001)。观察到显著的生物标志物-治疗相互作用(p=0.04),在AI生物标志物阳性的患者中(n=785,66%),LTADT显著减少了DM;但在AI标志物阴性的患者中(n=407,34%)并未观察到类似的获益,详见图2。在次要终点存在DM的死亡中也观察到类似的趋势,详见图3。 图2 生物标志物阴性(左)和阳性(右)组患者不同治疗的DM结果 图3 生物标志物阴性(左)和阳性(右)组患者不同治疗的存在DM的死亡结果AI预测模型成功识别了在RT基础上联合LT-ADT的获益差异,详见图4。 图4 AI生物标志物预测LT-ADT+RT获益的森林图而临床风险分层(NCCN中危[n=221,43%为 AI生物标志物阳性] vs 其他高危/极高危[n=954,71%为AI生物标志物阳性])是LTADT获益的预后因素(HR 4.28,95%CI 2.5-7.34,p<0.001),但非预测因素(交互作用p=0.79)。这意味着29%有至少一个NCCN高危/极高危风险特征的患者可能无法从LTADT中获益,而43%NCCN中危患者或可从LTADT中获益,详见图5。 图5 AI生物标志物分组与NCCN风险分组的关系结论本研究采用AI衍生的基于数字化病理学的平台,在NRG/RTOG 9202Ⅲ期试验中成功验证了第一个可预测LTADT+RT在高危局限性前列腺癌患者中获益的生物标志物。预测性AI生物标志物能识别出29%可从STADT得到相似获益的高危/极高危前列腺癌患者,避免了长期ADT的不良反应;同时可识别出43%可从LTADT中获益的中危前列腺癌患者。郑伏甫教授点评:本研究的结果会对真实世界的临床实践产生很大的帮助。放疗联合ADT治疗是高危局限性前列腺癌的标准治疗方案。但是在LTADT和STADT的选择上,始终没有统一的标准。既往,我们通过对患者的病理情况如Gleason评分、PSA水平、临床分期,和患者的一般状况、人种等因素进行评估,选择LRADT或STADT。但由于临床分期、PSA水平、ISUP分级分组的复杂性,在缺乏具体分级数据指导的情况下,对于ADT持续时间的选择始终存有极大的争议。如何选择合适的ADT持续时间呢?建立预测模型或许是行之有效的手段。但假设预测模型纳入的临床参数较少(5-6个),该模型预测的AUC值可能不高,预测效能偏低;反之,增加纳入的临床参数数量,又会导致模型过于复杂,临床运用困难。这项研究基于AI技术,将临床常用的指标纳入预测模型,成功发现了可预测LTADT+RT在高危局限性前列腺癌患者中获益的生物标志物。通过AI预测模型的帮助,使适合LTADT的患者接受长期治疗,而无法从LTADT中获益的患者接受STADT,避免LTADT的副作用。同时,我们应在长期管理中结合患者随访的PSA、影像学和症状进展情况,使患者得到精准的治疗,最终获益。Abs 5074:接受ADT联合或不联合orteronel治疗的转移性激素敏感性前列腺癌患者3个月及7个月时的PSA值和总生存结果的关系(SWOG S1216)[2]研究背景既往通过分析多项转移性激素敏感性前列腺癌(mHSPC)的Ⅲ期研究(包括ADT联合多西他赛和/或雄激素受体轴靶向治疗),已确定了治疗7个月时的PSA(PSA-7mo)为关键预后指标。本研究的目的是在mHSPC S1216Ⅲ期研究(NCT01809691)中评估ADT+orteronel(新型CYP17抑制剂)组(治疗组)和ADT+比卡鲁胺组(对照组)患者PSA-3mo、PSA-7mo和总生存(OS)之间的相关性。研究方法纳入了S1216试验中有PSA-3mo和PSA-7mo数据的患者。PSA缓解定义为:在第3或第7个月时,PSA≤0.2 ng/mL为完全缓解(CR);PSA>0.2且≤4 ng/mL为部分缓解(PR);PSA>4 ng/mL为未缓解(NR)。对OS进行Landmark分析,采用Cox回归模型并校正分层因素(体能状态、疾病程度、治疗开始的早或晚、治疗组),以评价治疗方式和3/7个月时PSA缓解的相互作用。研究结果在总共1279例患者中,1251例仍生存,且PSA-3mo可评估,1231例PSA-7mo可评估。中位年龄为67岁(范围:43-92岁),10%为黑色人种,96% Zubrod体能状态评分为0-1。基线中位PSA为29 ng/mL(范围:2-6710 ng/mL)。治疗组和对照组PSA-3mo为CR、PR和NR的患者比例分别为52% vs 35%、31% vs 42%、17% vs 23%。治疗组和对照组PSA-7mo为CR、PR和NR的患者比例分别为61% vs 46%、20% vs 26%、19% vs 29%。无论哪个时间点,CR和PR患者的5年OS均显著优于NR的患者,详见表1和图6。整体而言,PSA-7mo的预测效能优于PSA-3mo(对于5年OS的ROC曲线下AUC分别为0.76和0.67)。对于OS,治疗组与PSA缓解间无相互作用。表1 治疗开始后3个月和7个月时不同缓解组的5年OS图6 治疗7个月时不同PSA缓解组的生存分析结论PSA-3mo和PSA-7mo是mHSPC患者强有力的预后指标。在ADT+orteronel组中有更多患者在3个月和7个月时达到CR。3或7个月时PSA水平>4 ng/ml的患者与更差的预后有关,可能需要早期治疗干预。此外,应继续研究以评估PSA-3mo或PSA-7mo作为mHSPC临床试验OS替代终点的可能性。郑伏甫教授点评:既往,我们经验性地认为内分泌治疗后一个月内PSA水平显著下降预示着患者预后较好。本研究通过更精准的时间节点选择,评估mHSPC患者的PSA-3mo和PSA-7mo预测其长期获益,并取得了一定成果,为我们提供了一项判断患者预后的关键指标。PSA低点反映了患者对针对雄激素受体(AR)信号通路治疗的敏感程度,虽然70%-80%前列腺癌的发生发展是由AR信号所致,但仍有20%-30%的患者存在着其他导致肿瘤发生发展的生物学信号通路,如Wnt通路、细胞周期通路、PI3K通路等等。根据患者PSA-3mo和PSA-7mo的缓解情况,判断其预后不良时,我们可以通过强化治疗的方式进行调整,并通过其他检测手段查找原因。因此,PSA-3mo和PSA-7mo是非常重要的定性指标,一定程度上可以反映PSA与OS的关系。但该研究仍处于探索阶段,我们期待以后通过纳入除PSA最低值外更多的指标,如PSA速率、缓解持续时间等,多维度评估PSA与患者预后的关系,更精准地把握患者病情。同时,在临床实践中,部分患者经新型内分泌药物治疗后,PSA水平显著下降的同时仍可能出现影像学或症状进展,因此,我们需要多维度考量患者的病情,及时、合理地调整临床治疗方案。Abs 5077:高危生化复发前列腺癌患者PSA最低值的缓解深度和后续PSA无进展生存期的关系:来自3期PRESTO研究(AFT-19)的结果[3]研究背景在PRESTO Ⅲ期研究中,ADT+阿帕他胺(Apa)±醋酸阿比特龙和泼尼松(AAP)强化治疗,在52周的治疗周期内延长了高危生化复发前列腺癌(BRPC)患者的PSA无进展生存期(PSA-PFS)。已有研究显示在转移性患者中,PSA最低值的缓解深度于后续临床结局有关。本研究旨在评估治疗开始后3个月内PSA最低值与后续PSA-PFS之间的关系。研究方法PRESTO是一项在接受根治性前列腺切除术(RP)后出现生化复发,PSA倍增时间(PSADT)≤9个月且传统影像学无远处转移的前列腺癌患者中进行的随机Ⅲ期、开放标签试验(NCT03009981)。患者按照1:1:1的比例随机接受ADT、ADT+Apa或ADT+Apa+AAP治疗52周,根据PSADT(<3个月 vs 3-9个月)分层,治疗结束后持续随访。对治疗开始后前3个月的PSA最低值与后续PSA-PFS间的关系进行事后分析。研究结果504例患者随机分配至ADT组(n=167)、ADT+Apa组(n=168)和ADT+Apa+AAP组(n=169)。3个月时,463例患者可评估PSA最低值。所有组中,前3个月的PSA最低值<0.1 ng/mL、0.1-0.2 ng/mL和≥0.2 ng/mL的患者比例分别为86.3%、4.4%和9.3%。ADT组、ADT+Apa组和ADT+Apa+AAP组在治疗开始后的前3个月内达到PSA最低值<0.2 ng/mL的患者比例分别为79.8%、96.9%和95.0%。达到PSA最低值的时间和后续PSA-PFS的相关性为-0.30(标准误=0.03,Kendall's tau调整双变量删失),达到PSA最低值的中位时间为2.0个月(IQR,1.12-4.76个月)。治疗开始后的前3个月内PSA最低值未达到<0.2 ng/mL的患者的后续PSA-PFS显著短于PSA最低值≤0.1 ng/mL的患者(治疗开始3个月后的中位PSA-PFS:13.9个月 vs 22.8个月,HR=5.60,95%CI:3.58-8.75,p<0.0001)。治疗开始后前3个月内PSA最低值为0.1-0.2 ng/mL和≤0.1 ng/mL的患者的后续PSA-PFS也有显著差异(中位PSA-PFS:17.4个月 vs 22.8个月,HR 2.63,95%CI 1.49-4.63,p=0.0008),详见图7。图7 3个月时PSA最低值与后续PSA-PFS的关系结论Landmark分析显示,高危BRPC患者在开始ADT治疗后的前3个月内PSA最低值未达到<0.1 ng/mL与治疗结束后更短的PSA-PFS有关。随访仍在进行中,以研究PSA最低值未达最优标准的患者的前列腺癌组织的基因组特征和全血RNA,从而确定雄激素通路抑制剂耐药的潜在标志物。郑伏甫教授点评:本研究通过对PSA水平进行细致的分层,预测不同PSA缓解深度患者的预后,拓宽了我们的视野,PSA-PFS这一指标的应用将为前列腺癌治疗提供巨大的帮助。在前列腺癌患者的管理过程中,除了PSA之外,睾酮也是非常重要的一项指标,同时还要视患者的疾病转移情况进行骨转移和骨代谢相关指标的检测。结合以上研究来看,近年来,我们关注PSA最低值与患者预后的关系。今年ASCO上报告的如ODM-208、ARV-110等新型药物,也是在继续贯彻抗雄激素治疗的理念。传统ADT治疗和二代抗雄药物的应用可以很好地控制患者的PSA水平,达到很好的治疗效果。但PSA终究只是一个生化指标,一些遗传学指标诸如PTEN缺失、RB1阴性、DDR突变、BRCA 1/2突变、TP53突变等基因变异并不会体现在PSA水平上。此外,去年WHO更新了前列腺癌的病理分型,其中治疗相关的神经内分泌前列腺癌(t-NEPC),在保持PSA水平较低的同时,也存在抵抗雄激素信号通路治疗的可能性,这都为我们对肿瘤的分子机制以及治疗过程中的变化带来了新的思考。因此,在临床疾病管理中,控制好PSA和睾酮水平,做到双标并行非常重要。此外我们还要每年对患者进行影像学检查,关注转移灶的进展。在前列腺癌治疗中还有许多未知领域等待我们探索,希望对PSA水平的关注可以为更多的患者带来福音,同时也需要将PSA与其他多种指标结合,为患者带来更好的获益。小结ADT作为前列腺癌的基石治疗,疗效确切但也存在一定副作用,我们期待以AI为代表的新技术的应用能够帮助临床医生更好的识别能从不同ADT方案中获益的患者,实现精准选择,合理治疗。监测PSA等生化指标对于前列腺癌的内分泌治疗至关重要,多项研究也再次证实了其对患者长期预后的作用。但前列腺癌有着显著的临床异质性,我们在关注患者的PSA变化的同时,还应全面结合其他指标,如睾酮、影像学检查等,方能更好把握患者的病情,完善前列腺癌得全程管理,最大化患者获益。声明:本视频/资讯/文章是由益普生医学团队编辑/医疗卫生专业人士撰写提供,旨在用于医疗卫生专业人士间的学术交流,不支持以任何形式转发给非医疗卫生专业人士;如有违反,责任自负;转发给其他医疗卫生专业人士时,也请自觉保护知识产权。本视频/资讯/文章的内容不能以任何方式取代专业的医疗指导,也不应被视为诊疗建议。内容中出现任何药品并非为广告推广目的,医疗卫生专业人士如进行处方,请严格遵照该药品在中国批准使用的说明书。益普生不承担任何相关责任。审批号:DIP-CN-011340 有效期至:2024年6月11日
参考文献
1.Andrew J. et al. Development and validation of an AI-derived digital pathology-based biomarker to predict benefit of long-term androgen deprivation therapy with radiotherapy in men with localized high-risk prostate cancer across multiple phase III NRG/RTOG trials. J Clin Oncol 41, 2023 (suppl 16; abstr 5001).
2.Mamta Parikh, et al. Prostate-specific antigen value at 3 & 7 months (PSA-3mo, PSA-7mo) and overall survival (OS) in metastatic hormone-sensitive prostate cancer (mHSPC) treated with androgen deprivation (ADT) with or without orteronel (SWOG S1216). J Clin Oncol 41, 2023 (suppl 16; abstr 5074).
3.Rahul Raj Aggarwal, et al. Depth of PSA nadir and subsequent PSA progression-free survival in patients (pts) with high-risk biochemically relapsed prostate cancer: Results from the phase 3 PRESTO study (AFT-19). J Clin Oncol 41, 2023 (suppl 16; abstr 5077).
(本网站所有内容,凡注明来源为“医脉通”,版权均归医脉通所有,未经授权,任何媒体、网站或个人不得转载,否则将追究法律责任,授权转载时须注明“来源:医脉通”。本网注明来源为其他媒体的内容为转载,转载仅作观点分享,版权归原作者所有,如有侵犯版权,请及时联系我们。)
0
收藏
分享
微信扫一扫:分享
微信里点“发现”,扫一下二维码便可将本文分享至朋友圈。
添加表情
热门进展
EAU24摘要标题超前披露!中国专家入选研究数量突破新高,实现近3倍狂飙增长!
2024-03-01
循证医学 | 探讨前列腺癌转移灶定向治疗的有效性及安全性
2024-03-05
EAU24中国专家入选海报超前披露!医脉通邀您悦享学术盛宴!
2024-03-05
推荐新闻 -- 前列腺癌
热门话题
雨水节气的诗句有哪些?
全国爱耳日丨科技助听,共享美好生活
惊蛰节气的诗句有哪些?
春季是传染病高发期,常见疾病有哪些?
您要举报的内容为
举报理由:
广告软文
内容质量差
低俗色情
抄袭或未经授权转载
其他
0/100
取消
确认举报
分享
同时添加评论
收藏
分享到我的医脉通
关于我们
联系我们
隐私政策
版权声明
免责声明
公司产品
诚聘英才
网站帮助
(京)网药械信息备字(2022)第00008号
京公网安备11010502036930
京ICP备13043379号-5
京ICP证130463号
©2005-2024 medlive.cn,all rights reserved
软件构造 | 笔记3-抽象数据类型(ADT) - 知乎
软件构造 | 笔记3-抽象数据类型(ADT) - 知乎首发于软件构造切换模式写文章登录/注册软件构造 | 笔记3-抽象数据类型(ADT)大猫咋NLPer抽象数据类型是软件工程中一个普遍原则的实例,要解决如何设计良好的抽象数据结构,通过封装来避免使用者获取数据的内部表示什么是抽象?从抽象数据类型可以衍生出很多意思相近的名词,这里列出几个能表达其中思想的词:抽象:忽略底层的细节而在更高层思考模块化:将系统分为一个个模块,每个模块可以单独地进行设计、实现、测试、推导,并且在剩下的开发中进行复用封装:在模块外部建立起一道“围墙”,使它只对自己内部的行为负责,并且系统其它地方的代码不会影响到它的内部信息隐藏:将模块的实现细节隐藏,使未来更改模块内部时不必改变外部代码功能分离:一个模块仅仅负责一个特性/功能,而不是将一个特性运用在很多模块或一个模块拥有很多特性事实上,上一节讲到的规约就要体现了这几个方面:抽象:规约使得使用者只需要弄懂规约并遵守前置条件,而不需要弄懂底层的代码实现模块化:单元测试和规约都帮助将方法模块化封装:方法中的局部变量都是被封装起来的,因为它们仅仅可以在方法内部使用。与此相对的是全局变量和指向可变对象的别名,它们会对封装带来很大损害信息隐藏:规约就是一种信息隐藏,它使得实现者可以自由地更改实现代码功能分离:一个规约应该是逻辑明确的,即它不能有很多特性,而应只需实现一种功能用户定义类型在早期的编程语言中,用户只能自己定义方法,而所有的类型都是规定好的(例如整型、布尔型、字符串等等)。而现代编程语言允许用户自己定义类型对数据进行抽象,这是软件开发中的一个巨大进步。对数据进行抽象的核心思想就是:类型是通过其对应的操作来区分的一个整型就是你能对它进行加法和乘法的东西一个布尔型就是你能对它进行取反的东西一个字符串就是你能对它进行链接或者取子字符串的东西在 C语言中,似乎有一个类似的东西叫结构体,这种传统的类型强调关注数据的具体表示。但是抽象类型强调作用于数据上的操作:用户不用管这个类型里面的数据是怎么保存表示的,就好像是程序员不用管编译器是怎么存储整数一样,起作用的只是类型对应的操作和很多现代语言一样,在 Java 中内置类型和用户定义类型之间的关系很模糊。例如在 java.lang中的类 Integer 和 Boolean 就是内置的——Java 标准中规定它们必须存在,但是它们的定义又是和用户定义类型的方式一样的。另外,Java中还保留不是类和对象的原始类型,例如 int 和 boolean ,用户无法对它们进行继承例如,抽象数据类型Bool有以下操作:true : Boolfalse : Booland : Bool × Bool → Boolor : Bool × Bool → Boolnot : Bool → Bool抽象数据类型的特征是其操作就像我们在提及List类型时,和它是linkedlist类型还是array类型没有关系,我们只关注它能不能满足该类型的规约和操作,例如get()方法和size()方法类型和操作的分类对于类型,不管是内置的还是用户定义的,都可以被分为可改变和不可变两种其中可改变类型的对象能够被改变:它们提供了改变对象内容的操作,这样的操作执行后可以改变其他对该对象操作的返回值,例如 Date 就是可改变的,因为可以通过调用setMonth操作改变 getMonth 操作的返回值但 String 就是不可改变的,因为它的操作符都是创建一个新的 String 对象而不是改变现有的这个有时候一个类型会提供两种形式,一种是可改变的一种是不可改变的,例如 StringBuilder就是一种可改变的字符串类型抽象类型的操作大致分类:构造器(creator):创建一个该类型的新对象。一个构造器可能会接受一个对象作为参数,但是这个对象的类型不能自己生产器(producer):通过已有的同类型的对象创建新的对象。例如,String类里面的concat方法就是一个生产器,它接受两个字符串然后据此产生一个新的字符串观察器(observer):接受一个同类型的对象,然后返回一个不同类型的对象/值。例如,List的size方法,它返回一个int变值器(mutator):改变对象的方法,例如List的add方法,它会在列表中添加一个元素可以将这些区别用映射来表示:creator : t* → Tproducer : T+, t* → Tobserver : T+, t* → tmutator : T+, t* → void | t | T其中:T 代表抽象类型本身t 代表其他的类型+代表这个参数可能出现一次或多次*代表这个参数可能出现零次或多次例如,String.concat() 这个接受两个参数的生产器的映射为:concat : String × String → String不接受其它类型参数的观察器List.size():size : List → int接受很多参数的观察器String.regionMatches:regionMatches : String × boolean × int × String × int × int → boolean构造器通常都是用构造函数实现的,例如 new ArrayList()但是有的构造器是静态方法(类方法),例如 Arrays.asList()和 String.valueOf ,这样的静态方法也称为工厂方法变值器通常没有返回值(void),例如在Java图形库接口中,Component.add() 会将它自己这个对象返回,因此add()可以被连续链式调用但也不是所有的变值器都没有返回值,例如Set.add() 会返回一个布尔值用来提示这个集合是否被改变了一些例子int是Java中的原始整数类型,它是不可变类型,没有变值器creators : 值 0, 1, 2, …producers : 算术符 +, -, *, /observers : 比较符号 ==, !=, <, >mutators : 无String是Java中的字符串类型,它是不可变类型,故也没有变值器creators : String 构造函数, valueOf 静态方法(工厂方法)producers : concat, substring, toUpperCaseobservers : length, charAtmutators : 无List是 Java 中的列表类型,它是可变类型。另外,List也是一个接口,所以对于它的实现可以有很多类,例如 ArrayList 和 LinkedListcreators : ArrayList 和 LinkedList 的构造函数, Collections.singletonListproducers : Collections.unmodifiableListobservers : size, getmutators : add, remove, addAll, Collections.sort一些抽象数据类型操作分类的例子:Integer.valueOf() -> creatorBigInteger.mod() -> producerList.addAll() -> mutatorString.toUpperCase() -> producerSet.contains() -> observerMap.keySet() -> observerBufferedReader.readLine() -> mutator设计抽象类型的原则设计一个抽象类型包括选择合适的操作以及它们对应的行为,这里列出了几个重要的规则:设计少量,简单,可以组合实现强大功能的操作而非设计很多复杂的操作每个操作都应该有一个被明确定义的目的,并且应该设计为对不同的数据结构有一致的行为,而不是针对某些特殊情况。例如,不应该为List类型添加一个sum操作,因为这虽然可能对想要操作一个整数列表的使用者有帮助,但是如果使用者想要操作一个字符串列表呢?或者一个嵌套的列表? 所有这些特殊情况都将会使得sum成为一个难以理解和使用的操作操作集合应该充分地考虑到用户的需求,也就是说,用户可以用这个操作集合做他们可能想做的计算。一个较好的测试方法是检查抽象类型的每个属性是否都能被操作集提取出来。例如,如果没有get操作,我们就不能提取列表中的元素。抽象类型的基本信息的提取也不应该特别困难,例如,size方法对于List并不是必须的,因为我们可以用get增序遍历整个列表,直到get执行失败,但是这显然就很不方便了抽象类型可以是通用的:例如,列表、集合,或者图。或者它可以是适用于特定领域的:一个街道的地图,一个员工数据库,一个电话簿等等,但是一个抽象类型不能兼有上述二者的特性:要么针对重修按设计,要么针对具体应用设计,而不应该将两者混合,面向具体应用的类型不应包含通用方法;面向通用的类型不应包含面向具体应用的方法表示独立性(representation independence)什么是表示独立性?表示独立:使用者使用 ADT 时无需考虑其内部如何实现,ADT 内部表示的变化不会影响外部的规约和使用者例如,List就是表示独立的——它的使用与它是用数组还是链表实现的无关。例子:字符串的不同表示下面举一个例子:根据规约自行设计抽象类型的过程,规约如下/** MyString represents an immutable sequence of characters. */
public class MyString {
//////////////////// Example of a creator operation ///////////////
/** @param b a boolean value
* @return string representation of b, either "true" or "false" */
public static MyString valueOf(boolean b) { ... }
//////////////////// Examples of observer operations ///////////////
/** @return number of characters in this string */
public int length() { ... }
/** @param i character position (requires 0 <= i < string length)
* @return character at position i */
public char charAt(int i) { ... }
//////////////////// Example of a producer operation ///////////////
/** Get the substring between start (inclusive) and end (exclusive).
* @param start starting index
* @param end ending index. Requires 0 <= start <= end <= string length.
* @return string consisting of charAt(start)...charAt(end-1) */
public MyString substring(int start, int end) { ... }
}我们可以简单地用一个字符数组来实现:private char[] a;设计如下操作:public static MyString valueOf(boolean b) {
MyString s = new MyString();
s.a = b ? new char[] { 't', 'r', 'u', 'e' }
: new char[] { 'f', 'a', 'l', 's', 'e' };
return s;
}
public int length() {
return a.length;
}
public char charAt(int i) {
return a[i];
}
public MyString substring(int start, int end) {
MyString that = new MyString();
that.a = new char[end - start];
System.arraycopy(this.a, start, that.a, 0, end - start);
return that;
}下面的快照图展示了在使用者进行substring操作后的数据状态:对应代码为:MyString s = MyString.valueOf(true);
MyString t = s.substring(1,3);这种实现有一个性能上的问题,因为这个数据类型是不可变的,那么 substring 实际上没有必要真正去复制子字符串到一个新的数组中。它可以仅仅指向原来的 MyString 字符数组,并且记录当前的起始位置和终止位置为了优化,我们可以将内部表示改为:private char[] a;
private int start;
private int end;通过这种新的表示方法,我们的操作的实现也会发生变化:public static MyString valueOf(boolean b) {
MyString s = new MyString();
s.a = b ? new char[] { 't', 'r', 'u', 'e' }
: new char[] { 'f', 'a', 'l', 's', 'e' };
s.start = 0;
s.end = s.a.length;
return s;
}
public int length() {
return end - start;
}
public char charAt(int i) {
return a[start + i];
}
public MyString substring(int start, int end) {
MyString that = new MyString();
that.a = this.a;
that.start = this.start + start;
that.end = this.start + end;
return that;
}刚刚的快照图也就变为了:我们改变了操作,提高了性能,而不需要改变其它的代码,这就是表示不变性的力量!Java 中的抽象数据类型如下表:ADT conceptWays to do it in JavaExamplesAbstract data typeClassStringInterface + class(es)List and ArrayListEnumDayOfWeekCreator operationConstructorArrayList()Static (factory) methodCollections.singletonList(), Arrays.asList()ConstantBigInteger.ZEROObserver operationInstance methodList.get()Instance methodCollections.max()Producer operationInstance methodString.trim()Static methodCollections.unmodifiableList()Mutator operationInstance methodList.add()Static methodCollections.copy()Representationprivate fields测试抽象数据类型我们通过测试抽象数据类型中的每一个操作来测试这个抽象数据类型而这些测试不可避免的要互相交互:我们只能通过观察器来判断其他操作的测试是否成功,而测试观察器的唯一方法是创建对象然后使用观察器不变量(invariants)什么是不变量?不变量是一种属性,它在程序运行的时候总是一种状态,比如不变性(immutability)就是其中的一种:一旦一个不可变类型的对象被创建,它总是代表一个不变的值。当一个ADT能够确保它内部的不变量恒定不变(不受使用者/外部影响),我们就说这个ADT保护/保留自己的不变量为什么需要不变量?当一个ADT保护/保留自己的不变量时,对代码的分析会变得更简单,容易发现错误,例如:我们能够依赖字符串(String)的不变性特点,在分析的时候跳过那些关于字符串的代码否则,那么在所有使用(String)的地方,都要检查其是否改变了不变性——一种不变量考虑如下不可变类:/**
* This immutable data type represents a tweet from Twitter.
*/
public class Tweet {
public String author;
public String text;
public Date timestamp;
/**
* Make a Tweet.
* @param author Twitter user who wrote the tweet
* @param text text of the tweet
* @param timestamp date/time when the tweet was sent
*/
public Tweet(String author, String text, Date timestamp) {
this.author = author;
this.text = text;
this.timestamp = timestamp;
}
}我们应该怎么样做才能确保 Tweet 对象是不可变的(一旦被创建,author, message 和 date 都不能被改变)?第一个威胁就是使用者可以直接访问Tweet内部的数据,例如:Tweet t = new Tweet("justinbieber",
"Thanks to all those beliebers out there inspiring me every day",
new Date());
t.author = "rbmllr";这就是一个**表示泄露(representation exposure)**的例子,类外部的代码可以直接修改类内部的数据幸运的是,Java 给我们提供了处理这样的表示泄露的方法:public class Tweet {
private final String author;
private final String text;
private final Date timestamp;
public Tweet(String author, String text, Date timestamp) {
this.author = author;
this.text = text;
this.timestamp = timestamp;
}
/** @return Twitter user who wrote the tweet */
public String getAuthor() {
return author;
}
/** @return text of the tweet */
public String getText() {
return text;
}
/** @return date/time when the tweet was sent */
public Date getTimestamp() {
return timestamp;
}
}其中, private 表示只能类内部访问,而final确保了该变量不会被更改,对于不可变的类型来说,就是确保了变量的值不可变但是这并没有解决全部问题,还是会表示泄露!思考下面这个代码:/** @return a tweet that retweets t, one hour later*/
public static Tweet retweetLater(Tweet t) {
Date d = t.getTimestamp();
d.setHours(d.getHours()+1);
return new Tweet("rbmllr", t.getText(), d);
}retweetLater 希望接受一个 Tweet 对象然后修改 Date 后返回一个新的 Tweet 对象。问题出在哪里呢?其中的 getTimestamp 调用返回一个一样的Date对象,它会被 t.t.timestamp 和 d 同时索引,所以当我们调用 d.setHours()后,t也会受到影响,如下图所示:这样,Tweet的不变性就被破坏了,这里的问题就在于Tweet将自己内部对于可变对象的索引泄露了出来,因此整个对象都变成可变的了,使用者在使用时也容易造成隐秘的bug我们可以通过第 4 章讲到的防御性拷贝来弥补这个问题:在返回的时候复制一个新的对象而不会返回原对象的索引public Date getTimestamp() {
return new Date(timestamp.getTime());
}可变类型通常都有一个专门用来复制的构造器,可以通过它产生一个一模一样的复制对象在上面的例子中,Date的复制构造器就接受了一个timestamp值,然后产生了一个新的对象现在我们已经通过防御性拷贝解决了 getTimestamp返回值的问题,但是还有问题,思考这个代码:/** @return a list of 24 inspiring tweets, one per hour today */
public static List
List
Date date = new Date();
for (int i = 0; i < 24; i++) {
date.setHours(i);
list.add(new Tweet("rbmllr", "keep it up! you can do it", date));
}
return list;
}这个代码尝试创建 24 个 Tweet 对象,每一个对象代表一个小时,如下图所示:这样,Tweet 的不变性就再次被打破了,因为每一个 Tweet 创建时对 Date 对象的索引都是一样的,所以我们应该对构造器也进行防御性编程:public Tweet(String author, String text, Date timestamp) {
this.author = author;
this.text = text;
this.timestamp = new Date(timestamp.getTime());
}通常来说,需要特别注意 ADT 操作中的参数和返回值,如果它们之中有可变类型的对象,就要确保代码没有直接使用索引或者直接返回索引有同学可能会有疑问,这样不会很浪费吗?毕竟要复制创建这么多新的对象,为什么不直接在规格说明中解决这个问题:/**
* Make a Tweet.
* @param author Twitter user who wrote the tweet
* @param text text of the tweet
* @param timestamp date/time when the tweet was sent. Caller must never
* mutate this Date object again!
*/
public Tweet(String author, String text, Date timestamp) {除非迫不得已,否则不要把希望寄托在使用者上,ADT 有责任保保护自己的不变量,并避免表示泄露当然,最好的办法就是使用 immutable 的类型,彻底避免表示泄露表示不变量与抽象函数表示域与抽象域在研究之前,先说明两个域:表示域 R:具体的值,是实现者关注的抽象域 A:抽象值,是使用者关注的,例如,一个无限整数对象的抽象域是整个整数域,但是它的实现域可能是一个由原始整数类型(有限)组成的数组实现的,而使用者只关注抽象域而实现者的责任就是实现表示域到抽象域的映射如上图所示,表示域 R 包含的是我们的实现实体(字符串),而抽象域里面是抽象类型表示的字符集合,我们用箭头表示这两个域之间的映射关系。这里要注意几点:抽象值都是满射的,即每一个抽象值都是由表示值映射而来。我们之前说过实现抽象类型的意义在于支持对于抽象值的操作,即我们需要能够创建和管理所有的抽象值,因此它们也必须是可表示的抽象值未必单射,即一些抽象值是被多个表示值映射而来的。这是因为表示方法并不是固定的,我们可以灵活的表示一个抽象值两者未必双射,即不是所有的表示值都能映射到抽象域中。在上面这个例子中,"abbc"就没有被映射。因为我们已经确定了表示值的字符串中不能含有重复的字符——这样我们的 remove 方法就能在遇到第一个对应字符的时候停止,因为我们知道没有重复的字符抽象函数有了上面的概念,抽象函数就好说了,它是 R 和 A 之间映射关系的函数,即如何将 R 中的每一个值解释为 A 中的每一个值,即如下映射AF: R \rightarrow A而表示不变量是一个从表示值到布尔值的映射RI: R \rightarrow boolean对于表示值 r,当且仅当 r 被 AF 映射到了 A 时,RI(r) 为真,也就是说,RI 告诉了我们哪些表示值能够去表示 A 中的抽象值,在下图中,绿色表示的就是 RI(r) 为真的部分,AF 只在这个子集上有定义表示不变量和抽象函数都应该在表示声明后注释出来:public class CharSet {
private String s;
// Rep invariant:
// s contains no repeated characters
// Abstraction function:
// AF(s) = {s[i] | 0 <= i < s.length()}
...
}即使是同样的 R,同样的 RI,也可能有不用的 AF,即解释不同。比如,同样对于上面的CharSet,如下的解释:public class CharSet {
private String s;
// Rep invariant:
// s.length() is even
// s[0] <= s[1] <= ... <= s[s.length()-1]
// Abstraction function:
// AF(s) = union of { c | s[2i] <= c <= s[2i+1] }
// for all 0 <= i < s.length()/2
...
}则得到映射为:举例:有理数为了对表示域和抽象域有更深刻的理解,我们可以再举有理数RatNum表示的例子代码:public class RatNum {
private final int numerator;
private final int denominator;
// Rep invariant:
// denominator > 0
// numerator/denominator is in reduced form
// Abstraction function:
// AF(numerator, denominator) = numerator/denominator
/** Make a new RatNum == n.
* @param n value */
public RatNum(int n) {
numerator = n;
denominator = 1;
checkRep();
}
/** Make a new RatNum == (n / d).
* @param n numerator
* @param d denominator
* @throws ArithmeticException if d == 0 */
public RatNum(int n, int d) throws ArithmeticException {
// reduce ratio to lowest terms
int g = gcd(n, d);
n = n / g;
d = d / g;
// make denominator positive
if (d < 0) {
numerator = -n;
denominator = -d;
} else {
numerator = n;
denominator = d;
}
checkRep();
}
}检查表示不变量(chechRep)例如,上面的有理数需要满足分母大于 0 且分子分母互质,可以用如下代码检查// Check that the rep invariant is true
// *** Warning: this does nothing unless you turn on assertion checking
// by passing -enableassertions to Java
private void checkRep() {
assert denominator > 0;
assert gcd(Math.abs(numerator), denominator) == 1;
}应该在每一个创建或改变(构造器,生产器, 变值器)表示数据的操作后调用checkRep()检查表示不变量有益的改动(beneficent mutation)回顾之前不可变类型的定义:对象一旦被创建,其值就不会发生改变。现在学习了抽象数据类型,可以将定义更细化一下:对象一旦被改变,其抽象值不会发生改变也就是说,对使用者来说,其代表的值是不会变的,但是实现者可以在底层对表示域做一些改动,这些不会影响到抽象域的改动称为有益的改动(beneficent mutation)还是举前面RatNum的例子,不过我们将不变量的限制放款:不再要求分子和分母必须是最简形式public class RatNum {
private int numerator;
private int denominator;
// Rep invariant:
// denominator != 0
// Abstraction function:
// AF(numerator, denominator) = numerator/denominator
/**
* Make a new RatNum == (n / d).
* @param n numerator
* @param d denominator
* @throws ArithmeticException if d == 0
*/
public RatNum(int n, int d) throws ArithmeticException {
if (d == 0) throw new ArithmeticException();
numerator = n;
denominator = d;
checkRep();
}
...
}只不过,在输出它的抽象值的时候,我们对其简化: /**
* @return a string representation of this rational number
*/
@Override
public String toString() {
int g = gcd(numerator, denominator);
numerator /= g;
denominator /= g;
if (denominator < 0) {
numerator = -numerator;
denominator = -denominator;
}
checkRep();
return (denominator > 1) ? (numerator + "/" + denominator)
: (numerator + "");
}注意到观察器toString更改了numerator和denominator,即它改变了的表示域。但是关键在于,它并没有改变映射到的抽象值,我们对分子分母进行的约分和同乘 -1 的操作并没有改变AF(numerator, denominator)=numerator/denominator也可以这样想,AF 是一种多对一的函数,即一个表示值可以用多种表示值来实现,所以这种改动是无害的甚至是有益的注释 AF, RI 并说明表示泄露应该在抽象类型表示声明后写上对于抽象函数和表示不变量的注解,描述时要清晰明确:对于 RI,仅仅宽泛的说什么区域是合法的并不够,你还应该说明是什么使得它不合法对于AF,抽象函数的作用是规定合法的表示值会如何被解释到抽象域,作为一个函数,我们应该清晰的知道从一个输入到一个输入是怎么对应的。我们还要讲为什么不会表示泄露注解出来,这种注解应该说明表示的每一部分,它们为什么不会发生表示暴露,特别是处理的表示的参数输入和返回部分下面是一个Tweet类的例子,它将表示不变量和抽象函数以及不会表示泄露注释了出来:// Immutable type representing a tweet.
public class Tweet {
private final String author;
private final String text;
private final Date timestamp;
// Rep invariant:
// author is a Twitter username (a nonempty string of letters, digits, underscores)
// text.length <= 140
// Abstraction function:
// AF(author, text, timestamp) = a tweet posted by author, with content text,
// at time timestamp
// Safety from rep exposure:
// All fields are private;
// author and text are Strings, so are guaranteed immutable;
// timestamp is a mutable Date, so Tweet() constructor and getTimestamp()
// make defensive copies to avoid sharing the rep's Date object with clients.
// Operations (specs and method bodies omitted to save space)
public Tweet(String author, String text, Date timestamp) { ... }
public String getAuthor() { ... }
public String getText() { ... }
public Date getTimestamp() { ... }
}注意到我们并没有对 timestamp 的表示不变量进行要求(除了之前说过的默认 timestamp!=null)。但是我们依然需要对timestamp 的表示暴露的安全性进行说明,因为整个类型的不变性依赖于所有的成员变量的不变性下面是关于 RatNum的另一个例子:// Immutable type representing a rational number.
public class RatNum {
private final int numerator;
private final int denominator;
// Rep invariant:
// denominator > 0
// numerator/denominator is in reduced form, i.e. gcd(|numerator|,denominator) = 1
// Abstraction function:
// AF(numerator, denominator) = numerator/denominator
// Safety from rep exposure:
// All fields are private, and all types in the rep are immutable.
// Operations (specs and method bodies omitted to save space)
public RatNum(int n) { ... }
public RatNum(int n, int d) throws ArithmeticException { ... }
...
}可以看到,对于不可变类型的表示,说明不会表示泄露会简单很多ADT 的规约我们讲了如何对表示不变量和抽象函数做注解,现在我们就来说明一下 ADT 的规约应该写什么如上图ADT 的规约只能使用使用者可见的内容来撰写,包括参数、返回值、异常等如果规约里需要提及值,只能使用抽象域中的值不应谈及任何内部表示的细节,以及表示域中的任何值ADT 内部表示(私有属性),对外部都应该严格不可见如何设计不变量不变量是一种在程序中一直为真的属性,对于对象而言,就是从创建开始一直具有的属性为了保持一个不变量,我们需要:确保在对象创建的时候不变量为 true确保对对象在接下来的每一个改变后不变量依然为 true翻译成对于 ADT 的操作,就是:构造器和生产器在创建对象时要确保不变量为 true变值器和观察器在执行时必须保持不变性在每个方法return之前,用checkRep()检查不变量是否得以保持表示泄露会使得情况更加复杂,如果一个表示被泄露出来,那么程序的任何地方都可能对其进行修改,我们也就没法确保不变量一直成立了。所以使用不变量完整的规则应该是:结构归纳法,如果一个抽象数据类型的不变量满足:被构造器或生产器创建被变值器和观察器保持没有表示暴露那么 ADT 就是保持不变量的用ADT不变量替换前置条件良好设计的 ADT 的一个大优点在于我们用 ADT 不变量来取代复杂的前置条件。例如,现在有一个规约:/**
* @param set1 is a sorted set of characters with no repeats
* @param set2 is likewise
* @return characters that appear in one set but not the other,
* in sorted order with no repeats
*/
static String exclusiveOr(String set1, String set2);我们可以利用ADTSortedSet总是有序的不变量属性代替这种前置条件:再举个例子,考虑下面的规约:/**
* Find tweets written by a particular user.
*
* @param tweets a list of tweets with distinct timestamps, not modified by this method.
* @param username Twitter username (a nonempty sequence of letters, digits, and underscore)
* @return all and only the tweets in the list whose author is username,
* in the same order as in the input list.
*/
public static List
版权声明:本文由比特派官网新版app下载发布,如需转载请注明出处。
本文链接:https://www.siyuewuyu.com/article/71.html