抽象数据类型、数据结构、算法与Java语言:ADT Heap

导读

为什么要学习数据结构?

数据结构是关于如何组织(存储)数据的!编程实践中经常涉及到组织(存储)数据,所以要学习数据结构。

那么为啥还要学习抽象数据类型(Abstract Data Type,ADT)呢?

ADT描述了数据集、指明了在数据集上可能执行的操作。ADT是一种规范,它和具体的编程语言无关。尽管Java API提供多种数据结构,但是如果遇到不适用的情形,就需要针对这种情形定义ADT,然后使用Java实现它。况且如果不深入全面地掌握数据结构这方面的知识,就无法理解和合理的使用Java API提供的数据结构。

数据结构和ADT是什么关系呢?

ADT是一个规范,用于一组值以及对这组值执行的操作。而数据结构是使用编程语言对ADT的实现。

那么如何描述ADT呢?

我们仅描述数据和操作,不指明如何保存数据以及如何实现操作,会考虑一些实现的细节,但与具体编程语言无关。

我们借助UML以及对他们的说明来描述ADT。还可以使用伪代码,不过UML足以说明问题。

设计ADT的步骤是什么呢?

确定行为,然后指定数据和操作,并且考虑特殊情况。

ADT Heap(堆)简介

ADT Heap是什么呢?Heap直译成中文就是堆。我们长说,一堆人,一堆苹果,还有就像图中显示的那样,一堆石头。

ADT Heap与生活中的这些物品不像,生活中这些东西大多都是杂乱无章的放在一起的,但ADT Heap不是,他有由结构的,而且可以说是刻意使之成为这样。

ADT Heap是一棵特殊的树,因为他是完全二叉树,而且是一种特殊的完全二叉树,为什么这样说呢?因为他具有下面的性质:

每个节点不小于(或不大于)其后代节点。如果节点不小于其后代节点,那么我们称这种类型的堆为最大堆。如果节点不大于其后代节点,那么我们称这种类型的堆为最小堆。最大堆的子树仍然是最大堆,最小堆的子树仍然是最小堆。

ADT Heap(堆)的规格说明

ADT Heap(堆)操作细节阐述

这里不认为对象为null或者堆为空是前置条件,如果根据你的实际需要可以认为这是前置条件。

实现ADT Heap时,一般会区分最大堆和最小堆,并且分别实现他们。

+peekTop():T

如果堆是最大堆,那么此方法获得的是堆中最大的对象。如果堆是最小堆,那么此方法获得的是最小对象。

同样地+remove():T获得的是堆的根,那么对于最大堆而言,将获得堆中最大的对象,对最小堆而言则相反。

ADT Heap(堆)转换为接口

内容少一点,概念比较抽象,读个笑话放松一下(笑话来自于网络,据说只有程序员能看懂):

据说有一位软件工程师,一位硬件工程师和一位项目经理同坐车参加研讨会。不幸在从盘山公路下山时车坏在半路上了。于是两位工程师和一位经理就如何修车的问题展开了讨论。

硬件工程师说:“我可以用随身携带的瑞士军刀把车坏的部分拆下来,找出原因,排除故障。”

项目经理说:“根据经营管理学,应该召开会议,根据问题现状写出需求报告,制订计划,编写日程安排,逐步逼近,alpha测试,beta1测试和beta2测试解决问题。”

软件工程说:“咱们还是应该把车推回山顶再开下来,看看问题是否重现。”