数据类型及数据结构资料

来源:互联网 发布:组策略隐藏网络配置 编辑:程序博客网 时间:2024/05/22 02:28
数据类型(data type) = 接口(interface) + 数据的表示(data representation)

数据表示有多种, 数据结构(data structural representation)的表示形式是其中一种.

实际上,数据类型是一种 属性,数据结构是一种 关系,都很抽象,严格说起来,应该把数据类型比作元素种类,数据结构类比作化学式/分子式。但是这样没有起到比喻说理的效果,依然很抽象,所以依然选择 原子 和 分子 来说明(一般人想到原子应该都会觉得就像一个一个小球吧,这样就更易理解)。
从实际结构上来说,一个链表只含有一个数据甚至不含数据,他还是会有指针域和表头,队列/堆栈等也一样,而这些部分就表现了“关系”。相反,单个int/char/float/double数据不含有这些表示关系的部分,所以不能算做一种特殊的 数据结构 。
数据结构是数据与数据之间的关系,数据类型是数据的种类。

数据的本质是差异,每一种差异是一个值。数据的意义是用来对比。

表示数据就要把所有的差异枚举出来,也就是确定值的范围。
最简单的表示数据的方式是使用二值位串。这也是计算机使用的方式。位串这种东西很常见,例如阿拉伯数字。
这里强调一点:数据没有类型。如,“1”是一个数字还是字符?只有在被使用的时候才知道。数据的类型在于使用其的方式。人类认知事物的典型方式是加标签,或者说分类。这种方式便于人类理解,但同样也只是人类的主观意愿。举个例子,一个狼人以人的形态走在路上,如何判断他是人还是狼人。如果你告诉我狼人也是人,那我无话可说。
可能因为受到了面向对象思想的影响,我用了很长时间才意识到这一点。

接下来考虑数据的解释。
如何判断“123456”是一个数字还是两个数字?这里需要使用约定。需要事先约定好一个数字是三位还是六位。
也就是说,在解释一组数据之前需要对数据的表示方式做好约定。

接下来考虑数据存储。
受那位匿名同学的启发,数据的存储方式也就是数据结构。
回想我们在数据结构课上学到的东西,数据结构考虑的通常是效率和空间这些问题。而这些东西绝对是由数据的存储方式决定的。通常一种高效的算法会使用专门为这种算法设计的数据结构。这也就是数据结构的意义。

如果一定要问数据类型是什么东西,只能说是一种人为的限制。
可能最开始数据类型出现的目的是为了减少由于程序员不小心造成的错误。还有可能就是受到面向对象思想的影响。或者干脆就是别人有我也应该有的想法。

  1. 数据结构:是相互之间存在一种或多种特定关系的数据元素的集合,包括逻辑结构和物理结构。
  2. 数据类型:是一个值的集合和定义在这个值集上的一组操作的总称。
  3. 抽象数据类型:是指一个数学模型以及定义在该模型上的一组操作
数据结构是一种值的集合,这种值集+值集上的操作就是结构类型,而结构类型是数据类型中的一种,所以数据结构属于数据类型。
数据结构强调结构,即元素间的关系
数据类型强调类型,即作用于元素的合法操作

数据类型是值的集合及对这些值的运算
数据结构是数据元素的关系及对这种关系的操作。数据元素是有类型的,但是数据结构撇开了这种元素具体的类型,只考虑数据元素间的相互关系。
数组是数据结构也是数据类型,要看你用什么角度看
int a[3]; 这里的a的类型是int [3]
但若是
typedef int DATATYPE;
DATATYPE a[3];
只要是你不需要考虑 DATATYPE 具体是什么类型的时候
这里的a就是一种数据结构

数据类型偏向于用途用法方面,比如整型我用来计算,做加减乘除,字符串我用来表示文字信息,可以截取,拼接;

数据结构偏向其内部原理,如链表的实现链式存储,队列用来保存待处理的数据等;

就说数组吧,我写 int[10] arr_data;的时候,我说arr_data是一个数组,这里的数组是说的是数据类型,

我说这些数据用一个数组做成线性表存储的时候,这里的数组说的是数据结构。

数据类型的作用是限制你程序所做的事情,以检查出潜在的错误。比如在静态类型的语言比如C中,你有一个类型int的变量,那么就限定了它是一个范围有限的整数,你可以对它做运算,但是系统会阻止你把它当作函数调用,这可以阻止潜在的错误发生。而且在静态类型的语言中,这样的错误在编译期就可以检查出来了,免得你程序哪天跑着跑着就中枪了。因为这样的语言变量携带类型,类型检查在编译期就完成了,所以一般值自身很少携带类型信息。
另外一类是动态类型系统的语言,其中变量不携带类型而是值携带类型,所以当你运行到某个地方想要把一个整数当成函数调用的时候,类型检查就会失败,然后你就会得到一个运行错误。

所以类型的作用相当于是规定程序中的一部分:值或者变量,他们可以进行什么样的操作。而到底是规定值还是变量,那么就取决于什么样的类型系统了。

先说数据结构(data structure)。一般来说数据结构指的都是结构化的东西,也就是说若干elements(这个词不好翻译,可以认为是基本元素)按照一定结构组成的。如数组,链表。可以看出这两种都是由基本元素组成,而且形成一定结构(数组是物理内存连续,链表是用指针相连)。而组成的elements可以是复杂结构,如一个结构体组成的数组,或者有嵌套结构的elements。

数据类型(data type)强调类型,一般分为两种,基本数据类型(int char等)和复杂数据类型(结构体等)。基本结构对应基本数据类型(如一个字符对应char型),复杂结构对应复杂数据类型(结构体)。这个概念是可以对应上面数据结构中的elements的类型。

想总结一下,数据放在elements中,每个elements一般都是线性地址相连的存储,elements的类型叫数据类型,由elements组成的更复杂的结构叫做数据结构。


补充一下,我觉得原子分子的比喻是不恰当的。确切的说,数据应该是原子,数据结构是分子。数据结构由数据组成(一般的数据结构的直接组成部分只有一种类型的数据)。而数据由于其表达方式不同,有着不同的数据类型,数据类型用来区分和表达不同元素。

理解这两个概念必须从数据入手,数据可以认为是在线性内存中连续存储的一段信息,这段信息在内存中不过就是不加区分的01串而已。而数据类型是让编程者和编译器识别这段数据表达方式的一种定义。数据结构是将数据用某种方式组合起来的一种结构。所以数据才是核心。

数据结构是数据的一种表现形式,我们把一个具体的人当做一个数据,这人都是由一个头两条腿组成。这头跟腿可以看成是具体的这个人的组成的数据项,他们的关系是头是在上面的腿是在下面的,所以具体的某个人这个数据的表现形式是头在上面两条腿在下面。而每个人都有这样的表现形式也就是都有这样的相同的数据结构,我们把每个具体的人归为同一类,把它叫做人类这种数据类型。这数据类型也可以看成是数据的一个属性,每个数据都有这样的一个属性。int a[3],int b[4]这a和b的数据类型的属性是相同的吗?他们的表现形式(数据结构)是一样的吗??我的回答是都不一样,a跟b一个是由3个连接的int组成,一个是由4个连接的int组成。如果拿人来做比较,其它所有的构成都一样,但一个是1颗脑袋,一个是2颗脑袋,那这两个我们会把它当成是相同的数据结构吗?数据结构都不同,那它们自然是不属于同一个数据类型了。在我看来数组类型,结构体类型是一个很大的概念,就像基本类型一样,我们可以说int是属于基本类型的,char也是属于基本类型的。但int跟char这两个不是属于同一个类型的。而int [3]这是属于数组类型,int [4]也是属于数组类型,但它们不是属于同一个数据类型。这有点像我们定义的类,我们用类声明的对象都是属于类类型,但类类型这个大的类型底下又分了无穷个自定义的类型

数据类型:类(指广义上的对象类,包括自定义类,int,float,char...)

数据结构:类之间的逻辑关系(包括类的集合,线性表,堆栈,队列,树,图...),

类之间的物理关系(包括数组和链表)

ps:数据结构一般重点指逻辑关系,物理关系只是具体计算机中的实现方式


接口:数据类型(或者类)的抽象,不用给具体实现

抽象数据类型:数据结构的抽象,不给具体实现



原创粉丝点击