区分数据类型和数据结构
Distinguishing Data Types and Data structures
好吧,不知何故,即使在阅读了很多教科书(真的很多)和上网了很长时间之后,我仍然不能完全理解这两个东西之间的区别。
为了简化问题,假设维基百科的数据类型是:
a classification identifying one of various types of data, such as real, integer or Boolean, that determines the possible values for that type; the operations that can be done on values of that type; the meaning of the data; and the way values of that type can be stored.
主要是一些抽象数据类型的实现,比如实数或整数。
好了,接下来是数据结构:
is a particular way of organizing data in a computer so that it can be used efficiently.[1][2] Data structures can implement one or more particular abstract data types., which are the means of specifying the contract of operations and their complexity. In comparison, a data structure is a concrete implementation of the contract provided by an ADT.
所以数据结构是 ADT 的实现,比如堆栈或队列。
但这不也是一种数据类型吗??
我能真正看到的是,数据类型可以从没有任何结构组织的非常简单的事物到复杂的数据结构,真正重要的是它们是 ADT 的实现,反映了它的重要方面,并且它们可以被设想为单个实体,如(列表或树),但数据结构必须至少包含某种逻辑或数学组织才能归类为数据结构,但遗憾的是,这种差异会使许多实体既是数据结构和一个数据类型。
那么简单的普通(数据类型)和(数据结构)之间的实质区别是什么?
如果有人能给我推荐一些关于 C 数据结构的好书,我很乐意接受指定一本关于这个主题的特定书籍的答案,这本书足够深入地解释所有这些问题。
引用 >=C99:
有两种数据类型:
- 内在:
char
、int
、float
、double
、_Complex
、_Bool
、void
(对于其中一些有 long
和 unsigned
左右的变体)
- 派生:数组、结构、联合、指针、函数
后者是前者的基础and/or后者
所以回答你的问题:
So what is the solid difference between a simple plain (data type) and a (data structure)?
“数据结构[类型]”派生自“简单普通数据类型”(s)and/or其他“数据结构[类型]”(s).
在 C 语言中,数据类型 是一种语言级别的结构。预定义类型的数量有限(int
、char
、double
等),派生类型(数组类型、结构类型、联合类型、函数类型、指针类型、原子类型(后者是C11新增的))。
可以通过 typedef
声明为任何类型指定一个简单的名称。对于函数类型或不完整类型以外的任何类型,您可以拥有该类型的 objects;每个对象占用一个连续的内存区域。
C中可以存在的类型在C标准的6.2.5节中有完整的描述;例如,参见 N1570 draft.
另一方面,数据结构是由您自己的代码定义的结构。该语言没有定义 链表 或 二叉树 或 散列 table 的概念,但您可以实现这样的数据结构,通常是在派生数据类型之上构建它。通常没有 object 这样的链表。链表数据结构的实例由相关对象的集合组成,只有您的代码逻辑才能将该集合变成一个连贯的实体。但是您通常会有一个某种数据类型的对象,您的程序使用该对象 引用 链表数据结构,可能是结构或指向结构的指针。
您通常会有一组对数据结构的实例进行操作的函数。这些函数是否是数据结构的一部分是一个难题,我不会在这里尝试回答。
比如数组,既可以认为是一种数据类型,又可以认为是一种数据结构;更准确地说,您可以将其视为使用现有数组类型实现的数据结构。
一个数据类型指定单个表达式或对象允许的值和操作; 数据结构是一个存储区域和在该存储中组织对象的算法。
一个数据类型的例子是int
;这种类型的对象可以在至少范围内存储整数值[-32767, 32767]
,可以对这些对象执行通常的算术运算(尽管整数除法的结果也是一个整数,这会让人第一次绊倒)。您不能在 int
上使用下标运算符 []
,也不能在 int
对象上使用函数调用 ()
运算符。
关于数据结构的例子,我们可以看一个简单的栈。我们将使用一个数组作为我们的存储区域。我们将定义一个额外的整数项作为 堆栈指针 - 它将包含最近添加到数组中的元素的索引。我们定义了两种算法 - push
和 pop
- 它们将以特定顺序向堆栈添加和删除项目。
push: if sp is less than stack size then
add 1 to sp
write input to array[sp]
else
stack overflow
end if
pop: if sp is greater than 0 then
get value from array[sp]
subtract 1 from sp
return value
else
stack underflow
end if
我们的堆栈数据结构存储了一些数据类型的对象,这样最后添加的项目总是第一个删除的项目, a.k.a。后进先出 (LIFO) 队列。如果我们将值 1、2 和 3 压入堆栈,它们将按 3、2 和 1 的顺序弹出。
请注意,区分数据结构的是算法,而不是存储类型。如果您的算法将一个项目添加到数组的一端并从另一端拉出它们,则您有一个先进先出 (FIFO) 队列。如果您的算法将项目添加到数组中,使得数组中的每个元素 i
和 a[i] >= a[2*i]
都为真,那么您就有了一个堆。
基本上,
数据类型定义了特定的值域,并定义了允许对这些值进行的操作。编译器定义的所有基本数据类型都称为原始数据类型
数据结构更像是一种用户定义的数据类型,是组织数据以便有效使用数据的系统方式。这些的操作和取值在语言本身没有规定,而是由用户规定的。
了解更多信息的书是“C 编程语言 - 丹尼斯·里奇”
数据类型表示将要存储在变量中的数据类型。它指定变量将只分配特定类型的值。
数据结构是包含各种数据的集合。
好吧,不知何故,即使在阅读了很多教科书(真的很多)和上网了很长时间之后,我仍然不能完全理解这两个东西之间的区别。
为了简化问题,假设维基百科的数据类型是:
a classification identifying one of various types of data, such as real, integer or Boolean, that determines the possible values for that type; the operations that can be done on values of that type; the meaning of the data; and the way values of that type can be stored.
主要是一些抽象数据类型的实现,比如实数或整数。
好了,接下来是数据结构:
is a particular way of organizing data in a computer so that it can be used efficiently.[1][2] Data structures can implement one or more particular abstract data types., which are the means of specifying the contract of operations and their complexity. In comparison, a data structure is a concrete implementation of the contract provided by an ADT.
所以数据结构是 ADT 的实现,比如堆栈或队列。
但这不也是一种数据类型吗??
我能真正看到的是,数据类型可以从没有任何结构组织的非常简单的事物到复杂的数据结构,真正重要的是它们是 ADT 的实现,反映了它的重要方面,并且它们可以被设想为单个实体,如(列表或树),但数据结构必须至少包含某种逻辑或数学组织才能归类为数据结构,但遗憾的是,这种差异会使许多实体既是数据结构和一个数据类型。
那么简单的普通(数据类型)和(数据结构)之间的实质区别是什么?
如果有人能给我推荐一些关于 C 数据结构的好书,我很乐意接受指定一本关于这个主题的特定书籍的答案,这本书足够深入地解释所有这些问题。
引用 >=C99:
有两种数据类型:
- 内在:
char
、int
、float
、double
、_Complex
、_Bool
、void
(对于其中一些有long
和unsigned
左右的变体) - 派生:数组、结构、联合、指针、函数
后者是前者的基础and/or后者
所以回答你的问题:
So what is the solid difference between a simple plain (data type) and a (data structure)?
“数据结构[类型]”派生自“简单普通数据类型”(s)and/or其他“数据结构[类型]”(s).
在 C 语言中,数据类型 是一种语言级别的结构。预定义类型的数量有限(int
、char
、double
等),派生类型(数组类型、结构类型、联合类型、函数类型、指针类型、原子类型(后者是C11新增的))。
可以通过 typedef
声明为任何类型指定一个简单的名称。对于函数类型或不完整类型以外的任何类型,您可以拥有该类型的 objects;每个对象占用一个连续的内存区域。
C中可以存在的类型在C标准的6.2.5节中有完整的描述;例如,参见 N1570 draft.
另一方面,数据结构是由您自己的代码定义的结构。该语言没有定义 链表 或 二叉树 或 散列 table 的概念,但您可以实现这样的数据结构,通常是在派生数据类型之上构建它。通常没有 object 这样的链表。链表数据结构的实例由相关对象的集合组成,只有您的代码逻辑才能将该集合变成一个连贯的实体。但是您通常会有一个某种数据类型的对象,您的程序使用该对象 引用 链表数据结构,可能是结构或指向结构的指针。
您通常会有一组对数据结构的实例进行操作的函数。这些函数是否是数据结构的一部分是一个难题,我不会在这里尝试回答。
比如数组,既可以认为是一种数据类型,又可以认为是一种数据结构;更准确地说,您可以将其视为使用现有数组类型实现的数据结构。
一个数据类型指定单个表达式或对象允许的值和操作; 数据结构是一个存储区域和在该存储中组织对象的算法。
一个数据类型的例子是int
;这种类型的对象可以在至少范围内存储整数值[-32767, 32767]
,可以对这些对象执行通常的算术运算(尽管整数除法的结果也是一个整数,这会让人第一次绊倒)。您不能在 int
上使用下标运算符 []
,也不能在 int
对象上使用函数调用 ()
运算符。
关于数据结构的例子,我们可以看一个简单的栈。我们将使用一个数组作为我们的存储区域。我们将定义一个额外的整数项作为 堆栈指针 - 它将包含最近添加到数组中的元素的索引。我们定义了两种算法 - push
和 pop
- 它们将以特定顺序向堆栈添加和删除项目。
push: if sp is less than stack size then
add 1 to sp
write input to array[sp]
else
stack overflow
end if
pop: if sp is greater than 0 then
get value from array[sp]
subtract 1 from sp
return value
else
stack underflow
end if
我们的堆栈数据结构存储了一些数据类型的对象,这样最后添加的项目总是第一个删除的项目, a.k.a。后进先出 (LIFO) 队列。如果我们将值 1、2 和 3 压入堆栈,它们将按 3、2 和 1 的顺序弹出。
请注意,区分数据结构的是算法,而不是存储类型。如果您的算法将一个项目添加到数组的一端并从另一端拉出它们,则您有一个先进先出 (FIFO) 队列。如果您的算法将项目添加到数组中,使得数组中的每个元素 i
和 a[i] >= a[2*i]
都为真,那么您就有了一个堆。
基本上, 数据类型定义了特定的值域,并定义了允许对这些值进行的操作。编译器定义的所有基本数据类型都称为原始数据类型 数据结构更像是一种用户定义的数据类型,是组织数据以便有效使用数据的系统方式。这些的操作和取值在语言本身没有规定,而是由用户规定的。
了解更多信息的书是“C 编程语言 - 丹尼斯·里奇”
数据类型表示将要存储在变量中的数据类型。它指定变量将只分配特定类型的值。 数据结构是包含各种数据的集合。