“数据结构”和“数据类型”之间有区别吗?

11

我就读的大学考试中常出现两个问题:

  • 定义数据类型。分类和解释数据类型
  • 定义数据结构。分类和解释数据结构
  • 它们难道不是同样的东西吗?
    假设你正在用Java创建一个 Tree<E>,你会声明一个 Tree<E> 的类,并为其添加方法,最后你会执行 Tree<String> myTree = new Tree<>(); 以创建一棵树对象。

    您的“数据结构”现在是一个数据“类型”。
    比如,如果你被问到这样一个问题:变量myTree的类型是什么? 答案会是 Tree<E>。您的“数据结构”现在是一个数据“类型”。

    既然它们是相同的,那么根据您要基于什么基础对它们进行分类,它们将以相同的方式进行分类。原始或非原始。同质还是异质。线性还是分层。

    这就是我的理解。这种理解有错吗?


    3
    一种类型可以是“int”,它并不一定具有“结构”。事实上,类型系统是一种错误检查系统,与“数据结构”并没有太多关系。 - deceze
    如果您对答案感到满意,请慷慨地接受它。 :) - user2339071
    3个回答

    11

    我想先纠正一下,您创建了一个名为“Tree”的和一个名为“myTree”的对象,而不是一个叫做“myTree”的 数据类型 为“Tree”。这些是不同的东西。

    以下是数据类型的定义:

      

    数据类型或简称类型是一种分类,用于识别各种数据类型之一,例如实值、整数或布尔值,它决定了该类型的可能值;可以对该类型的值执行的操作;数据的含义;以及该类型的值的存储方式。

    现在根据维基百科上的定义,关于“类型”的定义有很多种。

    您提出的问题很好。在今天的现代语言中,有被称为抽象数据类型或ADT的数据类型。ADT的定义如下:

      

    抽象数据类型(ADT)是某一类具有类似行为的数据结构的数学模型;或者是一个或多个编程语言的某些数据类型的数学模型。抽象数据类型是通过可以对其执行的操作以及对这些操作的效果(可能的成本)的数学约束间接定义的。

    还写道:

      

    抽象数据类型是纯粹的理论实体,用于简化抽象算法的描述、对数据结构进行分类和评估以及正式描述编程语言的类型系统。然而,ADT可以通过具体的数据类型或数据结构在许多编程语言中以多种方式实现;或者使用形式化的规范语言进行描述。

    这意味着可以使用数据类型或数据结构来实现ADT。

    至于数据结构

    数据结构是一种特定的计算机数据存储和组织方式,以便有效地使用。

    许多教科书会将这些词混用。对于更复杂的类型,这可能导致混淆。

    举个小例子:使用B树实现数据库已经成为标准。这意味着我们知道这种ADT非常适合这种类型的问题,并且可以更有效地处理它。但是,为了将这种效率注入ADT中,您需要创建一种数据结构,以获得所需的输出。

    另一个例子:有许多树,如B-Tree,二叉搜索树,AA树等。所有这些本质上都是树的类型,但每个都是其自己的数据结构。

    请参阅:数据结构列表以获取可用结构的大量列表。


    我们知道这种ADT。我有点困惑,B树是ADT还是数据结构?维基百科说它是一种数据结构,但你似乎在暗示它是ADT?我想你可以说B树是数据结构,而树是ADT? - Ben Butterworth

    1
    区分的是抽象数据结构和具体数据结构。一些计算机科学教科书将抽象数据结构称为“数据类型”,这很容易引起混淆,因为并不是所有的数据类型都是数据结构。他们使用“数据结构”来特指具体数据结构。
    抽象数据结构,也称为抽象数据类型,是数据结构的接口。Java通常使用接口来表示它们; 例如:List,Queue,Map,Deque,Set。(但还有其他未在Java中表示的类别,如bag/multiset,multimap,graph,stack和priority queue)。它们通过其行为和您使用数据结构的方式进行区分。例如,集合的特点是禁止重复项且不记录顺序,而列表允许重复项并记住顺序。队列具有受限界面,仅允许您从一个端添加,从另一个端删除。
    一个具体的数据结构是抽象数据结构的实现。例如 ArrayListLinkedList。它们都是列表的实现;虽然它们的列表接口相同,但程序员可能仍然关心它们不同的性能特征。注意,LinkedList 也实现了 Queue

    0
    此外,在编程语言中存在一些没有类型系统的数据结构。例如,您可以在LISP中建模Map,或在Python中拥有一个字典。在这里谈论类型是具有误导性的,因为类型只有在某种类型系统的情况下才有意义,或者作为一个抽象概念,如“所有值的集合,它们居住在t中”。
    因此,似乎数据结构具有某种抽象类型的具体实现的含义。如果我们谈论带有类型系统的编程语言中的某个对象,我们可能会说“它具有XY类型”。

    Python肯定有类型系统。每个值都有一个类型。当然,Python的标识符可以被赋予任何类型的值。 - Alan

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接