【考研数据结构如何学习才最高效(一)】

2023-12-13 04:07:29

考研如何学好数据结构这门专业课?

前提:计算机作为考研的热门专业,无论你是自命题/408考试,基本上都得学习一些和数据结构相关的知识,即便是初试不考,复试也得考,因此对于这门专业课的学习就看起来十分重要了。书写本篇博客的目的在于帮助一些在数据结构的学习上有困难的同学,帮助大家能够采用高效的方式顺利通过数据结构相关的考试!



第一章、绪论和时间复杂度

1. 什么是数据结构

  • 数值计算问题的数学模型

    从具体问题抽象出一个适当的数学模型,进行分析问题,用数学方程加以描述。

  • 非数值计算问题的数学模型

    不能用数学方程,而是用表、树、图之类来描述。如:

     交通、道路问题的数学模型是图
     棋盘对弈问题的数学模型是树。
     图书馆的书目检索的数学模型是表。
    
  • 结论
    数据结构是一门研究非数值计算的程序设计问题中计算机的操作对象以及它们之间的关系和操作等的学科。

2. 基本概念和术语

数据结构概念图

  • 数据

    是对客观事物的符号表示 ,经数字化存入计算机中

  • 数据元素

    是数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理

  • 数据项

    数据的最小单位,一个数据元素由若干个数据项组成

  • 数据对象

    是性质相同的数据元素的集合,是数据的一个子集

  • 逻辑结构

    集合:数据元素之间同属于一个数据集中

    线性结构:数据元素之间存在一对一的关系

    树形结构:数据元素之间存在一对多的关系

    图/网状结构:数据元素之间存在多对多的关系

  • 存储结构

    存储结构又分为两种:顺序存储结构和链式存储结构

    顺序存储结构的特点:借助元素在存储器中的相对位置来表示数据元素之间的逻辑关系

    链式存储结构的特点:借助元素存储地址的指针表示数据元素之间的逻辑关系

3. 抽象数据类型的表示和实现

  • 数据结构的形式定义

    数据结构是一个二元组:(D,S)

    其中:D是数据元素的有限集,即数据对象,S是D上关系的有限集。

  • 数据类型

    按“值”的不同特征,高级程序语言中的数据类型可分为两类:

    原子类型:原子类型的值是不可分解的,如C语言中的整型、字符型、指针类型等。
    结构类型:值是由若干成分按照某种结构组成的,可以分解。

  • 抽象数据类型(Abstract Data Type 简称ADT)

    是指一个数字模型以及定义在该模型上的一组操作

    抽象数据类型可用三元组(D,S,P)来表示。其中:D是数据对象,S是D上的关系集合,P是对D的基本操作集。

    采用以下格式定义抽象数据类型:

    ADT 抽象数据类型名{
     	数据对象:<数据对象的定义>
     	数据关系:<数据关系的定义>
     	基本操作:<基本操作的定义>  
      }ADT抽象数据类型名
    

4. 算法和算法分析

  • 算法的概念

    是对特定问题求解步骤的描述,它是指令的有限序列,其中每一条指令表示一个或多个操作。

  • 算法的五个重要特性

    有穷性:必须在一定时间内执行完成

    确定性:不产生二义性,对于相同的输入只能得到相同的输出

    可行性:算法能够实现

    输入:提供算法所需的数据

    输出:算法执行后的结果数据

  • 算法分析(算法的评价标准)

    正确性:算法与描述是否正确

    可读性:有注解,变量名、函数名比较规范,采用结构化程序设计

    健壮性:对非法输入的数据有相应的处理

    高效率和低存储:运行所花费的时间(称为算法的时间特性),所占用存储空间的大学(称为算法的空间特性)

  • 算法的时间特性

    算法的时间性能以时间复杂度来衡量, 以算法中基本语句的执行次数来衡量

    n为算法计算量或称为规模。一般考虑最坏情况,两个函数为同一个数量级,强调的
    是在n趋向无穷大时,两者“接近”。

    例如(1-100求和):

#累加
int main(){
	int sum = 0;//执行一次
	int n = 100;//执行一次
	for(int i = 0;i<n-1;i++){//判断语句执行n+1次
		sum += i;//执行n次数
	}
	print("sum=%d",sum);
}
#执行2n+3次
#大O记法O(n)
#____________________________________________________
#高斯公式
void mian(){
	int sum = 0;//执行1次
	int n = 100;//执行1次
	sum = (n+1)n/2;//执行1次
	print("sum=%d",sum);
}
#执行3次
#大O记法O(1)
—————————————————————————————————————————————————————
#最坏情况,直接查找
int search(int num){
	int arr[] = [11,10,8,9,7,22,23,0];
	for(int i=0;i<arr.length;++i){
		if(num == arr[i])
			return i;
	}
	return -1;
}

最好情况:查找的第一个数字就是期望数字——O(1)
最坏情况:查找的最后一个数字,才是期望数字——O(n)
平均情况:任何数字查找的平均代价为——O(n)

  • 算法经常呈现的时间复杂度有:

    常量阶O(1)、线性阶O(n)、对数阶O(logn)、对数阶O(nlogn)、平方阶O(n^2)、 指数阶O(2^n)等

  • 时间复杂度排序
    时间复杂度排序

5. 常见算法时间复杂度总结

时间复杂度总结


备注:希望通过我分享的学习经验和学习资料,有帮助到一些对数据结构学习有感觉到困难的同学。其中加粗部分为常考知识点,需要记忆

文章来源:https://blog.csdn.net/qq_44774893/article/details/132729714
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。