1.1 数据概念
数据:数据是描述客观事务的符号,是计算机中可以操作的对象,是能被计算机识别并输入给计算机处理的符号集合。
例如:整型、实数等数值类型可直接输入,字符类型需要进行非数值处理输入到计算机,而声音、图像、视频等需要通过编码手段转换为字符数据来处理。
1.2 数据对象、数据元素、数据项概念
数据对象:是数据元素的集合。例如:一群人。
数据元素:是组成数据的有一定意义的基本单位。例如:一个人。
数据项:多个数据项构成一个数据元素。例如:一个人的眼、耳、口、鼻。
1.3 数据结构是什么?
相互之间存在一种、或多种特定关系的数据元素的集合。和原始数据的逻辑结构,物理结构有关。例如:地图数据,适合使用图结构存储;族谱数据,适合使用树结构存储。
1.4 逻辑结构和物理结构
逻辑结构:数据对象中数据元素之间的关系,面向实际问题。例如:一群人之间,他们的关系。
(1)集合结构:所有元素之间没有关系,仅同属一个集合。
(2)线性结构:数据元素之间一对一关系。
(3)树形结构:数据元素之间存在一对多关系。
(4)图形结构:数据元素之间存在多对多关系。
在解决实际问题时,需要选择合适的逻辑结构表示现实数据元素之间的关系。
物理结构:数据的逻辑结构,在计算机中的存储形式,面向计算机。例如:线性表如何存储在计算机中。
(1)顺序结存储构:把数据元素存放在地址连续的存储单元中。
(2)链式存储结构:把数据元素存储在任意存储单元中,存储单元直接可连续,可不连续。例如:使用链式存储结构实现逻辑上顺序存储结构时,需要使用指针存放数据元素地址。
1.2 数据结构有哪些?
- 线性表。可细分为顺序表、链表、栈和队列;
- 树结构。包括普通树,二叉树,线索二叉树等;
- 图结构。包括有向图,无向图等。
Note:数组和顺序表
- 顺序表:一种数据结构,属于数据结构理论知识范畴。
- 数组:不同于顺序表,数组属于编程语言范畴。例如,在java中,数组是一种数据类型。又或者说,数组是java语言中,对顺序表数据结构的实现。
1.3 数据结构和算法有什么关系?
(1)算法:解决问题的某种方式(同一个问题的不同解决方法),且往往是针对特定的数据结构操作的。
(2)算法和数据结构相辅相成,良好的数据组织结构,对算法解决问题很有帮助。例如:计算1+2+3+...+1000000,使用顺序表(支持数据随机访问)存储数据,相比于使用链表存储数据,更能提升算法效率。
1.4 算法相关概念
算法所需的合适的数据结构,往往和算法实现的业务紧密相关。例如:
- 算法实现的业务需要大量插入元素、移动元素,且数据量极大时,此时链表数据结构更适合存储数据。
- 算法实现的业务需要大量的访问元素时,顺序表数据结构更适合存储数据。
算法的优劣:时间测算、空间测算
时间复杂度O:随着问题(数据)规模的扩大,算法时间耗费变化的规律。
例如:数据规模为1时,某种操作耗费多长时间,规模为100时,同样操作耗费多长时间。
O(1):时间随着问题规模扩大不变
O(n):时间随着问题规模扩大线性扩大
时间复杂度计算标准:估算程序指令执行的次数
时间复杂度计算示例:
注:下面的计算方式,是按照人类世界理解方式计算程序指令执行次数的,真正到cpu执行时,一条比较操作可能需要多个指令执行才能完成。
for (int i=1;i<arrayRandomCalcul.length;i++){//i=1执行1次,i<len执行n+1次,i++执行n次,共2n+2次
for (int j = i;j > 0;j--){//j=i执行1次,j>0执行i+1次,j--执行i次,共2i+2次
if (arrayRandomCalcul[j] < arrayRandomCalcul[j-1])//执行1次
swap(arrayRandomCalcul,j,j-1);//执行3次
else break;//加了break会在不满足条件下及时退出,减少程序程序指令执行次数
}
}