数据表示有多种, 数据结构(data structural representation)的表示形式是其中一种.
数据的本质是差异,每一种差异是一个值。数据的意义是用来对比。
最简单的表示数据的方式是使用二值位串。这也是计算机使用的方式。位串这种东西很常见,例如阿拉伯数字。
这里强调一点:数据没有类型。如,“1”是一个数字还是字符?只有在被使用的时候才知道。数据的类型在于使用其的方式。人类认知事物的典型方式是加标签,或者说分类。这种方式便于人类理解,但同样也只是人类的主观意愿。举个例子,一个狼人以人的形态走在路上,如何判断他是人还是狼人。如果你告诉我狼人也是人,那我无话可说。
可能因为受到了面向对象思想的影响,我用了很长时间才意识到这一点。
接下来考虑数据的解释。
如何判断“123456”是一个数字还是两个数字?这里需要使用约定。需要事先约定好一个数字是三位还是六位。
也就是说,在解释一组数据之前需要对数据的表示方式做好约定。
接下来考虑数据存储。
受那位匿名同学的启发,数据的存储方式也就是数据结构。
回想我们在数据结构课上学到的东西,数据结构考虑的通常是效率和空间这些问题。而这些东西绝对是由数据的存储方式决定的。通常一种高效的算法会使用专门为这种算法设计的数据结构。这也就是数据结构的意义。
可能最开始数据类型出现的目的是为了减少由于程序员不小心造成的错误。还有可能就是受到面向对象思想的影响。或者干脆就是别人有我也应该有的想法。
- 数据结构:是相互之间存在一种或多种特定关系的数据元素的集合,包括逻辑结构和物理结构。
- 数据类型:是一个值的集合和定义在这个值集上的一组操作的总称。
- 抽象数据类型:是指一个数学模型以及定义在该模型上的一组操作
数据类型强调类型,即作用于元素的合法操作
数据结构是数据元素的关系及对这种关系的操作。数据元素是有类型的,但是数据结构撇开了这种元素具体的类型,只考虑数据元素间的相互关系。
数组是数据结构也是数据类型,要看你用什么角度看
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,float,char...)
数据结构:类之间的逻辑关系(包括类的集合,线性表,堆栈,队列,树,图...),
类之间的物理关系(包括数组和链表)
ps:数据结构一般重点指逻辑关系,物理关系只是具体计算机中的实现方式
接口:数据类型(或者类)的抽象,不用给具体实现
抽象数据类型:数据结构的抽象,不给具体实现