数据结构第二版重点知识内容1-陈越

第一章:概述

  • 1.1 引子
    • (1)数据结构的概念:
    • (2)概念解读:
    • (3)代码讲解:

1.1 引子

(1)数据结构的概念:

 1. SartajSahni在其《数据结构、算法与应用》中定义:数据结构是数据对象,以及存在于该对象的实例和组成实例的数据元素之间的各种联系、这种联系可以通过定义相关的函数来给出。
 2. Clif-ford A.Shaffer在其《数据结构与算法分析》中定义:数据结构是ADT(抽象数据类型,Ab-stract Data Type)的物理实现。
 3. 中文维基百科写道:数据结构(Data Structure)是计算机中存储、组织数据的方式。

(2)概念解读:

 1. 为什么使用数据结构?
  以一个班上的学生为例,我们要存储一个班学生的信息,需要存储 什么?需要存储每个学生的姓名、学号、性别、身份证号等。
  学过结构化数据类型我们都知道,每个学生是最基本的数据对象,即数据元素。而每个数据元素都有其数据成员,即姓名、学号等。在未学数据结构之前,我们使用结构类型的数组很简单的就可以存储一个班的信息。那么为什么还需要数据结构呢?
  因为这样的简单表示是“不规则”的。比如一个数组是一个班,但数组体现不出数据之间的关系,只是我们编程者自己知道哪个数组是什么意义。并且对于一些复杂的数据是无法简单表示的,如家族族谱的亲系关系。并且选择适当的数据结构可以使对数据的操作的算法效率达到最优。
 2. 什么是数据结构?
  定义一重点讲解说数据结构是数据对象(如示例中的学生)之间的联系(如示例中的同班),还有数据结构是数据对象的实例(某个学生)之间的联系(某种关系),以及数据组成实例(某个学生的学号等数据成员)之间的关系。它说明数据结构存储的是彼此之间存在某种逻辑关系的数据元素,数据结构是数据元素的集合。
  定义二重点讲解说数据结构是抽象数据类型(如示例中的班级就说抽象的数据类型,学生也是),而数据结构要做的就说把抽象的数据类型实现在计算机中,即让计算机能够存储这种数据类型(如示例中的班级被示例未数组,数组每个数据元素就是班级中的一个学生)。
  定义三重点讲解说数据结构就是在计算机中把抽象的类型定义为规则的实现,为了“规则的”存储数据,组织数据(安排数据的结构等)。

拓展链接:学习数据结构的意义和作用:

(3)代码讲解:

 1.打印从1到N的整数

//非递归(循环)求解
void PrintN(int N)
{
     
	int i;
	for(i=1;i<=N;i++)//从1到N输出
		printf("%d\n",i);
	return;	
} 
//递归求解
void PrintN(int N)	//打印从1到N的整数
{
     
	if(N<=0)return;	//如果N不大于等于1则无解直接结束函数
	PrintN(N-1);   	//否则打印从1到N-1的整数
	printf("%d\n",N);//再打印N,完成了打印从1到N
} 

递归函数:
 定义:函数在内部调用自己的函数被成为递归函数。
 分治问题:递归函数常用于分治问题,分治指分而治之,即问题可被划分为多个子问题(子问题中可以是原问题类型,也可以不是),所有子问题的解合起来就是问题的解。
 代码问题分析:我们要打印从1到N的解,可以分解成怎样的子问题?分解问题为打印从1到N-1的问题和打印N两个子问题。可以看出打印从1到N-1和原问题的类型相同(同为打印从1到某一个数的),而打印N非原问题类型。
 递归与分治的联系:由上可知,打印从1到N可以划分为两个与原问题等价的子问题,所以原问题打印从1到N的整数为分治问题,我们就可以考虑用递归函数求解。为什么分治可考虑用递归求解呢?考虑用一个函数解决分治类型问题,那么要是分治求解,分解的子问题中为原问题类型的直接用此函数求解即可(因为是此函数就是求解此类型的,只是可能传入参数不同了),所以分治常考虑用递归求解。
 代码讲解:在递归求解中,将原问题分解为打印从1到N-1的整数和打印N,打印从1到N-1为原问题类型可直接用此函数求解(不过参数是从1到N-1哦),而且顺序也很重要,要先解决子问题打印从1到N-1再打印N。
 递归深度解析:
  递归函数就是进入函数 递归到调用的函数 进入函数 递归到调用的函数,所以递归函数一定要有一个结束函数的return语句在递归调用之前,用来判断是否再继续递归。比如示例代码,如果没有判断 if(N<=0)return,那么就会一直递归下去,N会一直减小,不会结束!
  初学者对于递归函数往往感觉望而生畏,建议试着取N较小如N等于4的时候模拟程序允许一遍即可解惑。在此分析N=3时,当N=3时,判断是否小于等于0,否,所以继续运行,递归调用函数解决子问题打印从1到2,再判断,再继续运行到递归解决子问题(打印从1到2的子问题)打印从1到1,再继续,再判断,再继续运行递归解决子问题打印从1到0,再判断,满足条件所以直接return结束(终止递归,即不可再分解),返回到调用打印从1到0的函数即打印从1到1的函数的递归调用语句末尾(因为调用执行完),执行下一句,即打印1,再结束函数返回到打印从1到2的函数,再打印2,同理再打印3。最后打印完3结束打印从1到3的函数,即原问题,递归函数结束,原问题解决。
  递归的优缺点:优点是在解决某些问题(尤其是分治问题时)简单简洁。缺点是递归会反复申请空间占用程序可使用内存空间(因为调用函数,函数的形参是需要新申请的,而一层层递进,外层的函数在等待内层函数递归结束返回所有空间一直占用着不会释放),当内存空间使用完再调用函数就会出现错误,比如示例递归函数当n=100000时就会主函数直接返回错误的值。
数据结构第二版重点知识内容1-陈越_第1张图片
->>章节补录

你可能感兴趣的:(数据结构,c语言,数据结构,算法,递归算法,分治算法)