1.数据结构的基本概念
1.1数据结构基本概念以及术语
(1)数据结构是相互之间存在一种或多种特定关系的数据元素的集合。
(2)数据对象是具有相同性质的数据元素的集合,是数据的一个子集。
(3)数据元素是数据的基本单位,一个数据元素可以由若干数据项组成,数据项是构成数据元素的不可分割的最小单位。
(4)数据类型是一个值的集合和定义在此集合上的一组操作的总称。
1)原子类型:其值不可再分的数据类型。
2)结构类型:其值可以再分解为若干分量的诗句类型。
3)抽象数据类型(Abstract Data Type,ADT),抽象数据组织以及与之相关的操作。
1.2数据结构的三要素
逻辑结构,存储结构,数据的运算
1.2.1数据的逻辑结构
逻辑结构是指数据元素之间的逻辑关系,可以分为线性结构和非线性结构。
1.2.2数据的存储结构(物理结构)
存储结构是指数据结构在计算机中的表示,也称物理结构。它包括数据元素的表示和关系的表示。数据的存储结构主要包括顺序存储,链式存储,索引存储和散列存储。
(1)顺序存储:把逻辑上相邻的元素存储在物理位置上也相邻的存储单元中,元素之间的关系由存储单元的邻接关系来体现。
(2)链式存储:逻辑上相邻的元素在位置上可以不相邻,借助指示元素存储地址的指针来表示元素之间的逻辑关系。
(3)索引存储:在存储元素信息的同时,还建立附加的索引表。索引表中的每一项成为索引项。(一般由关键字,地址组成)
(4)散列存储:根据元素的关键字直接计算出该元素的存储地址,又称哈希存储。
1.2.3数据的运算
施加在数据上的运算包括运算的定义和实现。运算的定义是针对逻辑结构的,指出运算的功能;运算的实现是针对存储结构的,指出运算的具体操作步骤。
1.2.4总结
2.算法的基本概念
2.1基本概念
2.1.1什么是程序?
程序=数据结构+算法
2.1.2算法的五个重要特性
(1)有穷性:一个算法必须要在执行有限步结束,并且每一步时间都是有穷的。
(2)确定性:算法中的每条指令都有特定的含义,对于相同的输入只能得到相同的输出。
(3)可行性:算法中的操作都可以通过有限次基本运算来实现。
(4)输入:输入个数>=0
(5)输出:输出个数>=1
2.1.3好算法具有的特点
(1)正确性(你不能十进制下1+1=3吧)
(2)可读性(不要出现“我的程序只有我能看得懂”)
(3)健壮性:输入不规范数据时,算法可以做出反应,引导操作者出入正确的数据。(比如输入手机号,身份证号的时候,位数不够时界面会显示“输入不规范”)
(4)高效率,低内存
3.算法评价
3.1算法效率度量基本概念
3.1.1相关定义
(1)时间复杂度T(n):运行完程序所需要的时间。
(2)空间复杂度S(n):运行完一个程序所需要的临时内存的大小。
3.1.2算法时间复杂度的估算方法
算法的执行时间 = 基本操作(i)的执行次数 * 基本操作(i)的执行时间。
算法的执行时间与基本操作执行此时之和成正比。
算法的时间复杂度用该算法中起决定性作用的基本操作的执行次数估算。
int oneprint(void){printf("UPC\n"); //输出一次return 0;
}
上面的片段T(n)=O(1)
再比如,下面的片段时间复杂度就是O(n)了。
int prints(int n){for(int i=0;i<=n-1;i++){ //执行n次printf("UPC\n");}return 0;
}
但是这种情况呢?
int prints(int n){printf("UPC\n"); //执行1次for(int i=0;i<=n-1;i++){ //执行n次printf("UPC\n");}return 0;
}
这里我们就要抓住主要矛盾:O(n)+O(1)->O(n).
3.1.4时间复杂度的两条规则
(1)加法规则:O(m) + O(n) = O(max(m,n);
(2)乘法规则:O(m) * O(n) = O(m * n);
3.1.5常见的时间复杂度排序
例如:
i=1;
while(i<=n){ //1 2 3....k (执行次数)i*=2; //2^1 2^2 2^3 2^k (时间复杂度)
}
最后i=2^k,即2^k > n时结束,那么2^k = n时,就是临界条件,此时k = log2^n;
所以,T(n) = O(log2^n).
3.1.6Fibonacci的特殊说明
简要说明一下,后续在树形结构详细阐述。
空间复杂度S(n) = O(n);
时间复杂度T(n) = ?
T(n) < 2^0 + 2^1 + 2^2 + ...+ 2^(n-1) = 2^n - 1.
根据量级判断,T(n) = O(2^n)
第一章绪论就到此为止啦,下一章是线性表,敬请期待...