谁能解释一下"抽象数据类型"和"容器"之间的区别?我应该将它们用作数据结构和算法课程项目的一部分,但我不明白其中的区别。
抽象数据类型只是对数据存储方式以及允许对该数据的操作的逻辑描述。例如,堆栈被定义为具有操作推送、弹出等和 LIFO 访问权限的数据类型。
容器是一个非常抽象的概念,但通常它意味着(无论如何对我来说(某种形式的封装 - 从某种意义上说,它可能掩盖底层对象的复杂性,或者可能为一系列不同的可能底层对象提供统一的接口。这是一个深深植根于程序员词汇中的词,以至于人们一直在使用它,因此它的含义非常模糊。
我的回答是:
ADT 的特点是可以对其执行的一组操作及其语义的定义。ADTreader
可以通过操作来表征
available(reader) -> number
get_next(reader) -> element
未定义element
类型的地方。请注意,没有定义reader
内部应如何工作或get_next()
从何处检索其元素。它的抽象。
容器只是一种(可能是抽象的(数据类型,可以包含其他数据类型的实例,如向量。我们的'reader
显然不需要是一个容器:上面的定义没有说它将包含其他数据类型的实例。
您可以实现一个reader
,该不断从键盘读取并返回按下的键。这个冲击显然不是容器——它不包含其他元素。 您还可以实现一个reader
,该 是一个向量,该向量也实现了上述两种方法。Eah 调用get_next()
可以返回它的第一个元素,然后是第二个元素,依此类推。此实现包含其他元素,因此它也将是一个容器。
来自 Skeina 的 算法设计手册 这里有几行。
我们将关注三种基本抽象数据类型中的每一种 (容器、字典和优先级队列(,看看它们是如何做到的 使用数组和列表实现。
我们使用术语容器来表示允许的数据结构 存储和检索独立于 内容。相比之下,字典是检索的抽象数据类型 基于键值或内容。
这意味着容器(如向量(、字典(如哈希表(和 PQ 都是抽象数据类型。这意味着它们是使用本机数据类型(如数组(或使用链接类型(如指针(实现的数据结构概念。