#自己考研复习,用于自己梳理知识,谢谢#
1.1数据结构的基本概念
1.1.1一些基本概念
1.数据
是对客观事物的符号表示。
2.数据元素
是数据中的基本单位,在计算机程序中作为一个整体进行考虑和处理。
3.数据对象
是性质相同的数据元素的集合,是数据的一个子集。
4.数据类型
是一个值的集合和定义在此集合上的一组操作的总称。
- 原子类型。其值不可再分的数据类型。
- 结构类型。其值可以在分解成为若干成分的数据类型。
- 抽象数据类型。一个数学模型以及定义在该模型上的一组操作。
5.数据结构
是相互之间存在一种或多种特定关系的数据元素的集合。包括三个方面:逻辑结构、存储结构、数据的运算。
1.1.2数据结构三要素
1.数据的逻辑结构
逻辑结构是数据之间的相互逻辑关系,他与数据的存储无关。是独立于计算机的。
数据的逻辑结构分为以下四种:
1、集合结构:结构中数据元素除了同属于一个集合外没其他关系。
2、线性结构:数据元素间只存在一对一的关系。
3、树状结构:数据元素间存在一对多的关系。
4、网状结构:数据元素之间存在多对多的关系。
2.数据的存储结构
存储结构是数据结构在计算机中的表示(又称映像),也称物理结构。包括数据元素的表示和关系的表示。分为四种。
1.顺序存储。
2.链式存储。
3.索引存储。
4.散列存储。
3.数据的运算
1.2算法和算法评价
1.2.1算法的基本概念
算法是对特定问题求解步骤的一种描述,它是指令的有限序列,其中每一条指令表示一个或多个操作。一个算法还具有下列五个重要特性:
- 有穷性:一个算法对任何合法的输入值必须总是执行有穷步之后结束,而且每一步都可在有穷时间内完成。
- 确定性:算法中每一条指令必须有确切的含义,阅读时不会产生二义性。
- 可行性:算法中描述的操作都可以通过已经实现的基本运算执行有限次来实现。
- 输入:一个算法有n(n>=0)个数据的输入。
- 输出:一个算法必须有一个或多个有效信息的输出,他是与输入有某种特定关系的量。
设计一个“好”的算法应该考虑以下目标:
- 正确性:算法应能够正确解决求解问题、
- 可读性:算法应具有良好的可读性,以帮助人们理解。
- 健壮性:算法能对输入的非法数据作出反应或处理,而不会产生莫名其妙的输出。
- 高效率与低存储量需求:效率是指算法执行的时间,存储量需求是指算法执行过程中所需要的最大存储空间,这两者都与问题的规模有关。
1.2.2 算法效率的度量
1.时间复杂度(重点)
一个语句的频度是指该语句在算法中被重复执行的次数。算法中所有语句的频度之和记为T(n),时间复杂度主要分析T(n)的数量级。一般地,把算法中包含基本操作的执行次数称为算法的时间复杂度。
方法:抓大头
T(n)=n^2+n-1 --> O(n^2)
T(n)=n+20000 --> O(n)
T(n)=M+N --> O(M+N) //M和N的影响性不确定
T(n)=M+N --> O(M) //M的影响远大于N或者N与M的影响持平
T(n)=M+N --> O(N) //N的影响远大于M或者N与M的影响持平
T(n)=10000 --> O(1)
有多种情况的算法的时间复杂度,即存在最好的情况、最坏的情况、平均情况,此时以最坏的情况的时间复杂度为主。
#define _CRT_SECURE_NO_WARNINGS 1
//时间复杂度 - 大O的渐进表示法:
//1.只保留最高阶项
//2.用1取代常数次
//3.最高阶项系数为1
//eg.1
//void Func1(int N)
//{
// int count = 0;
// for (int i = 0; i < N; i++)
// {
// for (int j = 0; j < N; j++)
// {
// ++count;
// }
// }
//
// for (int k = 0; k < 2 * N; k++)
// {
// ++count;
// }
//
// int M = 10;
// while (M--)
// {
// ++count;
// }
//
// printf("%d\n", count);
//}
//Func1的执行次数为F(N)=N^2 + 2*N + 10 --> O(N^2)
//eg.2
//void Func2(int N)
//{
// int count = 0;
// for (int k = 0; k < 2 * N; k++)
// {
// ++count;
// }
//
// int M = 10;
// while (M--)
// {
// ++count;
// }
//
// printf("%d\n", count);
//}
//结果:O(N)
//eg.3
//void Func3(int N, int M)
//{
// int count = 0;
// for (int k = 0; k < M; k++)
// {
// ++count;
// }
//
// for (int k = 0; k < N; k++)
// {
// ++count;
// }
//
// printf("%d\n", count);
//}
//结果:O(M+N)
//eg.4
//void Func4(int N)
//{
// int count = 0;
// for (int k = 0; k < 100; k++)
// {
// ++count;
// }
//
// printf("%d\n", count);
//}
//结果:O(1)
常见的渐进时间复杂度为:
2.空间复杂度
引入空间复杂度的概念:空间复杂度作为算法所需存储空间的度量,记作
S ( n ) = O ( f ( n ) ) S(n)=O(f(n))
S(n)=O(f(n))
其中n nn为问题大小的规模。算法要占据的空间包括,算法本身要占据的空间,输入/输出,指令,常数,变量等,算法在执行时所需的辅助空间。