鱼龙混杂 · 数据结构学习笔记(01)

学习之前(Before Learning)

数据结构作为CS课程中的重中之重(其实CS的所有课程都很重要),作为打开“数据结构及其操作”的一把钥匙,实在是不敢大意。学习了半个学期,之前因为活动和其他一些琐事,一直没有完整的时间来学习这门课程(比较习惯大段大段的时间来学习,碎片化的时间会让我感到极大的不舒服)。现在手头上的事情逐步地少了,拖拉了这么久的学习笔记也终于可以一片一片地Pop出来了。总感觉自己的数据结构成了最早Push进去最晚Pop出来的栈帧。

话不多说,笔记大概会有12篇左右,主要参看了如下资料:

1.MOOC-陈越、何钦铭教授主讲《数据结构》;

2.《Data Structures and Algorithm Analysis in C》-Mark Allen Weiss ;

3.《C Prime Plus 中文版》- Stephen Prata(云巅工作室 译)

数据结构基础入门(Base of Data Sructures)

数据结构概念

  • 在《Data Structures and Algorithm Analysis in C》(以下简称DSAAC)一书中并未提及数据结构的具体定义。

    与数据结构定义比较接近的我认为应该是在第3章:表、栈和队列中提及的抽象数据类型(Abstract Data Type,ADT),书中将抽象数据类型看作是一些操作的集合,并认为ADT中无需设计如何实现操作的集合,其可视为模块化设计的补充。

    并举例:表、集合、图和它们的操作一起可以看作是抽象数据类型

  • 在陈越老师主讲的《数据结构》(以下简称《数据结构》)中,陈越老师认为数据结构并没有统一的官方定义。

    但是陈老师通过对比各类数据结构相关数据所下定义提取了关键字。

通过图片可以看到关键字为“数据结构”和“算法”,可见数据结构是与算法密不可分的(看到这里的时候我只是觉得数据结构却是和算法结合的很紧密,但并没有明白数据机构到底是什么)。

紧接着陈老师通过举例:如何在书架上摆放图书,引入了

“解决问题方法的效率跟数据的组织方式有关”这一观点。

至此,我大概了解了陈老师所想表达的观点,即:

数据通过不同的算法进行组成成为有结构的数据,再通过不同算法对数据进行操作,结构化的数据与对数据的操作集共同形成了数据结构(自己总结的,如有不妥还请指出)

在陈老师的课中,还举例了设计打印函数PrintN并对循环及递归算法进行比较

通过比较即可发现循环和递归算法实现时,数据量对于递归算法的效率影响是十分大的,并且在数据量达到1e7级别时,内存随即崩盘。

如果对于C语言有一定了解的话,可以知道:编译器是被分配一个默认大小的堆栈空间,一旦堆栈超过这个空间随即就会崩溃(虽然我们可以通过调整编译器默认空间来解决这一问题,但这个比较还反映了利用递归算法时造成的空间复杂度过高的问题)我们在如下代码中可以发现

void Print(int N){
if(N!=0){
Print(N-1);
printf("%d\n",N);
 }
}

一旦使用此递归算法,意味着无论数据量多大,程序都会一路递归到N=0的情况,才会讲栈帧逐个Pop出去,这样带来的巨大问题就是堆栈占用量超出了编译器所拥有的默认空间,导致程序甚至编译器崩溃

陈老师由此导出了另一个结论:

解决问题方法的效率,跟空间的利用效率有关

紧接着陈老师利用clock()函数对不同算法计算多项式进行了比较

并得出了另一个观点即:解决问题方法的效率,跟算法的巧妙程度有关

陈老师最后给出了什么是数据结构???这一问题的回答,即:

  • 数据对象在计算机中的组织方式

    • 逻辑结构

    • 物理存储结构

  • 数据对象必定与一系列加在其上的操作相关联

  • 完成这些操作所用的方法就是算法

C语言实现(C-Support)

  • 《C Prime Plus》(以下简称《CPP》) 一书中在第14章:结构和其他数据形式对数据结构做了较为详细的C语言实现讲解。14章关键字为:struct , union , typedef。

  • 在讲解数据结构的基础概念时,《CPP》中利用了book.c及manybook.c两个渐进的例程来对数据结构进行具体的说明。其中,manybook.c的功能为录入library中书籍信息,并将其打印出来。笔者接下来也利用经过笔者注释的manybook.c程序进行相关概念的阐述

struct book{ //定义book结构
char title[MAXTITL];//定义结构第一个成员字符组title
char author[MAXAUTL];//定义结构第二个成员字符组author
float value;//定义结构第三个成员浮点变量value
};
  • 通过上述例程我们可知,该Book结构中包含了三个成员(member)或者叫做字段(field),定义一个结构有如下三个重要技巧:

    • 建立结构的格式或布局
    • 声明遵循该布局的变量(上述程序由于是节选自manybook.c并未声明)
    • 获取对一个结构变量各个部件的访问
  • 在manybook.c的主程序部分我们声明了相应的library变量

    struct book library[MAXBKS]; //定义结构变量

    并通过访问结构变量中的成员完成对图书的管理,如:

while(count < MAXBKS && gets(library[count].title)!=NULL&&library[count].title[0]!='\0'){ /*while循环条件分别为:1.当前输入数本册书小于书库最大可容纳书本册书
	                 2.library[count].title当前值不为空
	                 3。title首字符不为'\0'*/
	printf("Now enter the author.\n");
	gets(library[count].author);
	printf("Now enter the value.\n");
    scanf("%f",&library[count++].value);
	while(getchar()!='\n')
		continue;//遇上换行符时跳出while循环
	if(count < MAXBKS)
		printf("Enter the next title.\n");
}

通过上述程序完成对书本信息的录入,值得关注的是:

gets(library[count].author);

这行代码,为:对于library结构变量中第(count+1)个变量中author成员的赋值。

  • 通过示例程序的演示,很好地了解了如何定义一个结构,以及结构中含有的成员,对于数据结构C语言的初步实现有了较好的了解。

学习之后(After Learning)

数据结构之后的学习能否开展得顺利,极大程度上取决于对于数据结构(Data Structures)理解得是否透彻,下一篇笔记应该是着重讲算法分析方面,Flag:这周末将第二篇笔记发出来。

一点小废话

给上次评论我我博文的@ffl老师裂墙推荐Typora这款macOS X上的markdown编辑器,即时预览效果等等,易用和UI设计比娄老师推荐的Markdown Pad2确实好了很多(无意冒犯),下面上两个截图:


如果老师喜欢的话,也可以试着用一用,在这上面写感觉是一种艺术行为,摆脱了那些HTML标签的状态,真自由。

所有学习相关代码均已git到我的码云:

BIGCATCODE/Data Structures

文章中如有写得错误或不尽如人意的地方,烦请您指出。

请您喝咖啡哈

posted @ 2016-10-28 01:35  Magic_Tsang  阅读(728)  评论(1编辑  收藏  举报