精华内容
下载资源
问答
  • 数据结构学习心得

    千次阅读 多人点赞 2018-12-31 14:09:19
    本文链接:数据结构学习心得 山不在高,有仙则灵;水不在深,有龙则灵;要学好数据结构,有数据结构学习网才行! 首先,恭喜您发现了这个网站:一个神奇的学习数据结构的网站! 其次,感谢您打开这个网页阅读这...

    来源:我是码农,转载请保留出处和链接!

    本文链接:数据结构学习心得

    山不在高,有仙则灵;水不在深,有龙则灵;要学好数据结构,有数据结构学习网才行!

    image.png

    首先,恭喜您发现了这个网站:一个神奇的学习数据结构的网站!

    其次,感谢您打开这个网页阅读这篇文章,实在太感谢啦!

    再次,正在激动中......哽咽了。还是让我先来介绍一下我自己吧:

    我就是江湖上人见人爱、花见花开、车见车载,人称上天入地、无所不能、英俊潇洒、风流倜傥、玉树临风、学富五车、高大威猛、拥有千万粉丝、迷倒万千少女,号称一朵梨花压海棠的玉面小黄驴,帅到掉渣!一个见过我的女孩儿曾对我说:“如果世界只剩下十分钟的话,我会和你一同回忆你帅时的样子;如果世界只剩下三分钟的话,你要再摆一下你最最最帅的造型给我看;如果世界只剩下一分钟的话,我会对你对你说60次—小黄驴,你真帅!”还有一个女孩儿每天早晨都站在教室门口,痴痴地望着我,呆呆状喃道:“世间本无沙漠,只是我每看到一次你帅的样子,天上便会落下一粒沙,从此便有了撒哈拉。”唯心主义说:“我说你帅,你就是帅。”唯物主义说:“因为你帅,所以我说你帅。”总而言之一句话—我,就是帅。一个不帅驴子的标志是他愿意为自己的不帅英勇地死去,一个帅气驴子的标志是他愿意为自己的帅而卑怆地活着,所以,至今我还为自己的帅坚强的活着。

    本人没什么优点,唯一的优点就是没有缺点;本人基本全是缺点,最大的缺点就是只有优点;如果靓仔是一种罪,我已经罪犯滔天;如果有型是一种错,我已经一错再错;如果聪明要受惩罚,我岂不是要千刀万剐;如果谦虚都要受折磨,我又怎能逃得过?

    吹了这么半天驴掰,相信大家一定已经对我有好感了,下面该说点严肃的事情了:

    天将降大任于斯人也:据说,我出生时,天空的北方,出现祥云一片,渐渐由远至近,飘到我家房顶后,幻化成几个大字:“我是码农”。在接下来的若干年中,我一直在驴不停蹄地努力打造这个人类历史上、整个宇宙中最经典、最驴掰的可供大家免费学习数据结构的网站,这个网站的出现,是顺应天意的结果,更是历史的必然!

    那么,上天为什么委托我建造这个前无古人后无来者、举世无双、屌爆了的网站呢?学习数据结构到底有啥用?数据结构到底该咋学?

    数据结构是计算机科学与技术专业、计算机信息管理与应用专业,电子商务等专业的基础课,是十分重要的核心课程。所有的计算机系统软件和应用软件都要用到各种类型的数据结构。因此,要想更好地运用计算机来解决实际问题,仅掌握几种计算机程序设计语言是难以应付当前众多复杂的课题。要想有效地使用计算机、充分发挥计算机的性能,还必须学习和掌握好数据结构的有关知识。打好“数据结构”这门课程的扎实基础,对于学习其他专业课程是十分有益的。

    对于怎么能学好这门课程,我个人觉得基本上就是上课前看看书、上课时认真听课、下课以后复习复习、当然还有做作业时很认真的去做。根本谈不上什么好方法,不过我还是有一些话要送给大家:

    一、打好基本功

    不管学习什么,概念是基础,所有的知识框架都是建立在基础概念之上的。所以,第一遍看课本要将概念熟记于心,然后构建知识框架。比如看了一遍书后你至少应该知道数据结构包括线性结构、树形结构、图状结构或网状结构。线性结构包括线性表、栈、队列、串、数组、广义表等,栈和队列是操作受限的线性表,串的数据对象约束为字符集,数组和广义表是对线性表的扩展:表中的数据元素本身也是一个数据结构。除了线性表以外,栈是重点,因为栈和递归紧密相连,递归是程序设计中很重要的一种工具。树状结构中的重点自然是二叉树和哈弗曼树了。对于二叉树的很多操作都是基于对二叉树的遍历,掌握了如何遍历,很多问题也就迎刃而解了,比如对二叉树结点的查找访问、统计二叉树中叶子结点的数目、求二叉树的深度等。哈弗曼编码也有着很广泛的应用。对于图状结构,主要学习图的存储结构及图的遍历。

    二、不能看不起自己

    “我能行!”

    个人觉得这句话非常重要,不知道大家是怎样看待数据结构这门课的,有多少人觉得数据结构很难呢?我知道还是有一些同学这样觉得的,有时候我跟我的朋友讲要怎样学,讲了一大堆以后,他就向我抱怨:我以前c++都没有学好,数据结构更学不好了,这哪跟哪的话啊,数据结构与c++没有什么关系,我想假如抱有这样的心态,自己就不相信自己,那是不可能学好的,那些觉得数据结构很难的同学,我想他们应该会很看重数据结构的吧,然后他们就一天到晚捧着一本数据结构,这样不会觉得很累吗?而且因为觉得很难,就容易不相信自己,学的效率也不会很好,或许这有点太妄自菲薄了吧。个人认为数据结构很好学,很容易学,因为我觉得很容易,当然就会觉得自己没问题,学得很轻松,效果也还可以。大家都是从高考走过来的,应该知道心态的重要性吧,两种不同的心态,完全就是两种不同的效果。学习数据结构我们到底要学些什么呢?不知道大家有没有想过,那现在我们现在来归纳一下我们学习的内容吧,其实我们也就学了几种普通的数据结构,像二叉树,树,图还有排序的问题,前面的线性表和字符串也就是一些概念,当然还有一个很重要的KMP算法,然后在每种数据结构中我们也就是学到了若干处理的算法,我想真正数起来也就是几十个算法吧。学习数据结构也就是要掌握这几十种算法,多简单!至于如何掌握每个算法呢,我想就是多看看书,重要的是能够理解。个人认为,学习的难易程度很大程度上决定于个人的兴趣。把一件事情当做任务去做会很痛苦,当做兴趣去做会很快乐。如果想让自己在学习数据结构的过程中更轻松一些,就应该先培养对这门学科的兴趣。

    三、坚持独自完成作业的好习惯

    有一些同学总是喜欢先问好别人算法,然后再自己写,虽然这个不算抄袭作业,但自己基本上没有一个思考问题的过程,虽然要理解算法也会要思考很多,但是因为没有自己独立的思考过程,要自己写程序、写算法的时候根本写不出来,所以我想如果真的想学好数据结构的话,最好是能够自己思考问题,不要刚想了一会就觉得做不出来,然后就去问其他人。其实老师给我们的作业大多数还是基于我们的水平的,我绝对相信我们自己能够独自想出算法,虽有可能会比较长时间吧,但是这样肯定会比问其他人学到更多的东西。当然我并不是说不要问同学,有时候就是脑筋转不过来,一问别人就懂了,当然问了别人不能只是我知道了这个算法,还应该去想如何思考才能得到这个算法,这样水平会提高很多。

    对算法的学习是学习数据结构的关键。在看课本的过程中,要注重对算法的掌握。对于一个算法,读一遍可能能读懂,但不可能完全领会其中的思想。掌握一个算法,并不是说将算法背过,而是掌握算法的思想。我们需要的是耐心。每看一遍就会有这一遍的收获。读懂算法之后,自己再默写算法,写到不会的地方,看看课本想想自己为什么没有想到。反复练习,直到能顺利写出算法为止。个人认为,这是行之有效的方法。这样,不仅可以更加深入的领会算法思想,还会逐渐发现算法的巧妙之处,从而对数据结构产生兴趣。

    四、多动手实验

    这个就没有太多理由了,我一直觉得编程是一门熟练科学,多编程,水平肯定会提高,最重要的是能够养成一种感觉,就是对程序对算法的敏感,为什么那些牛人看一个算法一下子就看懂了?而自己要看很久才能弄懂,而且弄懂了过了一阵子又忘记了?其实这个是因为牛人们以前看的程序很多,编得也很多,所以他们有了那种感觉,所以我觉得大家应该多看程序,多写程序,培养自己的感觉。数据结构是实践很强的一门课程,光是“听”和“读”是绝对不够的,必须加强实践。在写算法的过程中,可能会出现很多问题,而不断修改的过程便是学习的过程。在这个过程中,只要全身心的投入了,便会发现很多乐趣。

    五、关于复习和考试的一些技巧

    我想大家应该都有这样的感觉,就是觉得自己什么都掌握了,但是在考试的时候就是会犯晕,有时候一出考场就知道错在哪个了,然后考完以后一对答案,发现其实考得很简单,应该都是自己会做的,这个就是与自己的复习和考试的技巧有关系了。

    首先就是复习,前面已经说过其实我们学的算法也就是几十个,那么我们的任务也就是理解这几十个算法,复习也就是要加深你的理解。如何理解算法,然后理解到什么程度呢?是能默写出整个算法吗?其实不是这样的,数据结构的考试有它的特点,考过期末考试了,大家应该都发现数据结构其实不要求你把整个算法背出来,它注重考察你的理解,那么怎么考察呢?其实也就是两种方式吧,一种就是用实例,就是给你一个例子,要你用某个算法运行出结果,我想这个期末考试的时候仍然会有很多这样的题目,比如排序那块就很好出这样的题目,要复习这种题目我觉得很简单,就是每个算法都自己用例子去实践一下,以不变应万变,我当年期末复习的时候就是这样去做的,而且考试之前我就觉得排序类的题目就很有可能会考,于是就自己编写各类排序算法运行了一遍。另外一种考察方式就是算法填空和算法改错,可能有一些同学觉得这种题目很难,其实我们首先可以确定这两种题目肯定是与书上算法有关系的,只要理解了书上的算法就可以了,有人觉得看完书以后什么都懂了,而且要默写也默写得出来,其实不是这样的,算法改错和填空主要是考察的细微处,虽然你觉得你默写得出来,那是能够默写出算法的主体部分,很多细微的地方你就会很容易忽略。我想大家考过期末考以后应该都有这种感觉吧?那要怎样解决这种问题呢?我觉得有两种方法,一种就是自己去编程实现,这种方法比较有意义,还能够提高编程水平,另外一种就是用实例分析算法的每句话,我认为这种方法是最有效的。

    然后还有一种题目,就是最后的写算法的题目,我觉得这种题目还是很好解决的,只要是能够自己做出作业的,基本上都会很容易做出来,这也是为什么我前面觉得平时做作业应该自己独立思考的原因,同时做这种题目千万要小心,尤其是题目简单的时候,那肯定会有一些小地方要考虑清楚,一不小心就会被扣掉很多分,这样很不值。

    我觉得考试的时候没有太多要讲的,只要复习好了,考试的时候细心一点就可以了,然后就是做一个题目开始就要尽量保证正确,如果觉得留在那里等后面做完了再来检查,这样错误还是很有可能检查不出来,我期末考试的时候就基本上没有检查,因为我做每个题目都是确保正确,用的时间也挺多的,然后也觉得没有检查的必要了。

    五百年回眸才换来今生的擦肩而过,一万年方得今日在此相聚,我希望大家能记住我的名字—小黄驴,因为我将会和大家成为最好的朋友。我希望大家能记住我的网站—数据结构学习网,因为她将会成为一个让大家可以依赖的学习港湾。我们将风雨无阻一起走过一段美好的时光,祝大家学习愉快!学有所得!

    展开全文
  • 数据结构学习记录第一章 绪论1.1 数据结构的基本概念数据结构的三要素:逻辑结构、存储结构(物理结构)、数据的运算。 逻辑结构分为线性结构和非线性结构。

    第一章 绪论

    1.1 数据结构的基本概念

    1. 数据结构的三要素:逻辑结构、存储结构(物理结构)、数据的运算
    2. 数据的逻辑结构分为线性结构非线性结构,线性表是典型的线性结构,集合、树和图是典型的非线性结构。
    线性结构
    一般线性表
    受限线性表
    线性表推广
    栈和队列
    数组
    广义表
    非线性结构
    集合
    树形结构
    图状结构
    一般树
    二叉树
    有向图
    无向图
    数据的逻辑结构
    1. 数据的存储结构主要有顺序存储、链式存储、索引存储和散列存储。
    2. 顺序存储:优点是可以实现随机存取,每个元素占用最少的存储空间;缺点是只能使用相邻的一整块存储单元,因此可能产生较多的外部碎片。
    3. 链式存储:优点是不会出现碎片现象,能充分利用所有存储单元;缺点是每个元素因存储指针而占用额外的存储空间,且只能实现顺序存取
    4. 索引存储。在存储元素信息的同时,还建立附加的索引表。索引表中的每项称为索引项,索引项的一般形式是(关键字,地址)。其优点是检索速度快,缺点是附加的索引表额外占用存储空间。另外,增加和删除数据时也要修改索引表,因而会花费较多的时间。
    5. 散列存储。根据元素的关键字直接计算出该元素的存储地址,又称哈希(Hash)存储。优点是检索、增加和删除节点的操作都很快;缺点是若散列函数不好,则可能出现元素存储单元的冲突,而解决冲突会增加时间和空间开销。
    6. 可以用抽象数据类型(ADT)定义一个完整的数据结构。
    7. 在存储数据时,不仅要存储数据元素的值,而且要存储数据元素之间的关系。

    1.1 练习题

    1. 以下属于逻辑结构的是()
      A、顺序表
      B、哈希表
      C、有序表
      D、单链表
      解析:有序表是指关键字有序的线性表,仅描述元素之间的逻辑关系,它既可以链式存储也可以顺序存储,故属于逻辑结构。顺序表、哈希表、单链表是三种不同的数据结构,既描述逻辑结构,又描述存储结构和数据运算。
      答案:C
    2. 以下与数据的存储结构无关的术语是()
      A、循环队列
      B、链表
      C、哈希表
      D、栈
      解析:循环队列(易错点)是用顺序表表示的队列,是一种数据结构。栈是一种抽象数据类型,可采用顺序存储或链式存储,只表示逻辑结构。
      答案:D
    3. 以下关于数据结构的说法中,正确的是()
      A、数据的逻辑结构独立于其存储结构
      B、数据的存储结构独立于其逻辑结构
      C、数据的逻辑结构唯一决定了其存储结构
      D、数据结构仅由其逻辑结构和存储结构决定
      解析:数据的逻辑结构只采用抽象表达方式,独立于存储结构,数据的存储方式有多种不同的选择;而数据的存储结构是逻辑结构在计算机上的映射,它不能独立于逻辑结构而存在。数据结构包括三个要素,缺一不可。
      答案:A
    4. 链式存储设计时,结点内的存储单元地址()
      A、一定连续
      B、一定不连续
      C、不一定连续
      D、部分连续,部分不连续
      解析:链式存储设计时,各个不同结点的存储空间可以不连续,但结点内的存储单元地址必须连续。
      答案:A
    5. 对于两种不同的数据结构,逻辑结构或物理结构一定不相同吗?
      解答:应该注意到,数据的运算也是数据结构的一个重要方面。
      对于两种不同的数据结构,它们的逻辑结构和物理结构完全有可能相同。比如二叉树二叉排序树,二叉排序树可以采用二叉树的逻辑表示和存储方式,前者通常用于表示层次关系,而后者通常用于排序和查找。虽然它们的运算都有建立树、插入结点、删除结点和查找结点等功能,但对于二叉树和二叉排序树,这些运算的定义是不同的,以查找结点为例,二叉树的时间复杂度为O(n),而二叉排序树的时间复杂度为O(log2n)。
    6. 试举一例,说明对相同的逻辑结构,同一种运算在不同的存储方式下实现时,其运算效率不同。
      解答:线性表既可以用顺序存储方式实现,又可以用链式存储方式实现。在顺序存储方式下,在线性表中插入和删除元素,平均要移动近一半的元素,时间复杂度为O(n);而在链式存储方式下,插入和删除的时间复杂度都是O(1)。

    1.2 算法和算法评价

    1. 算法是对特定问题求解步骤的一种描述,是指令的有限序列,它还具有5个重要特性:有穷性、确定性、可行性、输入、输出。通常,设计一个“好”的算法应考虑达到以下目标:正确性、可读性、健壮性、效率与低存储量需求。
    2. 算法的时间复杂度记为T(n)=O(f(n)),通常采用算法中基本运算的频度f(n)来分析算法的时间复杂度,基本运算的频度不仅与问题规模n有关,而且与输入中各元素的取值有关。
    3. 空间复杂度是问题规模n的函数,记为S(n)=O(g(n)),算法原地工作是指算法所需的辅助空间为常量,即O(1)。

    1.2 练习题

    1. 一个算法应该是()
      A、程序
      B、问题求解步骤的描述
      C、要满足五个基本特性
      D、A和C
      解析:本题是中山大学某年的考研真题,容易误选C,五个特性只是算法的必要条件,不能成为算法的定义。
      答案:B

    第2题代码:

    	x=2;
    	while(x<n/2)
    	x=2*x;
    
    1. 【2011统考真题】设n是描述问题规模的非负整数,下面的程序片段的时间复杂度是()。
      A、O(log2n)
      B、O(n)
      C、O(nlog2n)
      D、O(n2)
      解析:每执行一次,x乘2,设执行次数为t,则有2t+1 < n/2,所以 t < log2(n/2) - 1 = log2n - 2,得T(n) = O(log2n)
      答案:A

    第3题代码:

    	int fact(int n){
    		if(n<=1) return 1;
    		return n*fact(n-1);
    	}
    
    1. 【2012统考真题】求整数n(n≥0)的阶乘的算法如下,其时间复杂度是()
      A、O(log2n)
      B、O(n)
      C、O(nlog2n)
      D、O(n2)
      解析:计算阶乘n!的递归代码,一共执行 n 次递归调用,T(n)=O(n)。
      答案:B
    2. 【2013统考真题】已知两个长度分别为m和n的升序链表,若将它们合并为长度为m+n的一个降序链表,则最坏情况下的时间复杂度是()。
      A、O(n)
      B、O(mn)
      C、O(min(m,n))
      D、O(max(m,n))
      解析:两个升序链表合并,两两比较表中元素,每比较一次,确定一个元素的链接位置(取较小元素,头插法)。当一个链表比较结束后,将另一个链表的剩余元素插入即可。最坏的情况是两个链表中的元素依次进行比较,所以时间复杂度为O(max(m,n))。
      答案:D

    第5题代码:

    	count=0;
    	for(k=1;k<=n;k*=2)
    		for(j=1;j<=n;j++)
    			count++;
    
    1. 【2014统考真题】下列程序段的时间复杂度是()。
      A、O(log2n)
      B、O(n)
      C、O(nlog2n)
      D、O(n2)
      解析:和第2题差不多,内层循环的时间复杂度是O(n),外层循环的时间复杂度是O(log2n),根据乘法规则可知,该段程序的时间复杂度T(n)=T1(n) × T2(n) = O(n) × O(log2n) = O(nlog2n)。
      答案:C

    第6题代码:

    	int func(int n){
    		int i=0, sum=0;
    		while(sum<n) sum += ++i;
    		return i;
    	}
    
    1. 【2017统考真题】下列函数的时间复杂度是()
      A、O(log2n)
      B、O(n1/2)
      C、O(n)
      D、O(nlog2n)
      解析:每执行一次,i自增1,我们如果把 i 当作一个首项为0,公差为1的等差数列的话,那么sum就是等差数列的和,由等差数列求和公式得,sum=(i+1)*i/2,设循环次数为 t ,则 t 满足(t+1)*t/2<n,因此时间复杂度为O(n1/2)。
      答案:B

    第7题代码:

    	x=0;
    	while (n>=(x+1)*(x+1))
    	x=x+1;
    
    1. 【2019统考真题】设n是描述问题规模的非负整数,下列程序段的时间复杂度是()
      A、O(log2n)
      B、O(n1/2)
      C、O(n)
      D、O(n2)
      解析:假设第 k 次循环终止,则第 k 次执行时,(x+1)2 > n,x 的初始值为0,第k次判断时,x=k-1,即k2 > n,k > n1/2,因此该程序段的时间复杂度为O(n1/2),因此选B。
      答案:B
    2. 某算法的时间复杂度为O(n2),表明该算法的()。
      A、问题规模是n2
      B、执行时间等于n2
      C、执行时间与n2成正比
      D、问题规模与n2成正比
      解析:时间复杂度T(n)=O(n2),执行时间与n2成正比。T(n)是问题规模n的函数,其问题规模仍然是n而不是n2
      答案:C

    第9题代码:

    	int m=0, i, j;
    	for(i=1;i<=n;i++)
    		for(j=1;j<=2*i;j++)
    			m++;
    
    1. "m++"的执行次数为()。
      A、n(n+1)
      B、n
      C、n+1
      D、n2
      解析:m++语句的执行次数为i=1nj=12i1=i=1n2i=2i=1ni=n(n+1)\sum_{i=1}^{n}\sum_{j=1}^{2i}1=\sum_{i=1}^{n}2i=2\sum_{i=1}^{n}i=n(n+1)
      答案:A

    第二章 线性表

    2.1 线性表的定义和基本操作

    1. 线性表的定义。线性表是具有相同数据类型的 n (n ≥ 0)个数据元素的有限序列,其中 n 为表长,当n = 0时线性表是一个空表。若用 L 命名线性表,则其一般表示为 L = (a1,a2,…,ai,ai+1,…,an)式中,a1是唯一的“第一个”数据元素,又称表头元素;an是唯一的“最后一个”数据元素,又称表尾元素。除第一个元素外,每个元素有且仅有一个直接前驱。除最后一个元素外,每个元素有且仅有一个直接后继。这种线性有序的逻辑结构正是线性表名字的由来。
    2. 线性表的基本操作。
      线性表的主要操作如下:
      InitList(&L):初始化表。构造一个空的线性表。
      Length(L):求表长。返回线性表 L 的长度,即 L 中数据元素的个数。
      LocateElem(L,e):按值查找操作。在表 L 中查找具有给定关键字值的元素。
      GetElem(L,i):按位查找操作。获取表 L 中第 i 个位置的元素的值。
      ListInsert(&L,i,&e):插入操作。在表 L 中的第 i 个位置上插入指定元素e。
      ListDelete(&L,i,&e):删除操作。删除表 L 中的第 i 个位置的元素,并用 e 返回删除元素的值。
      PrintList(L):输出操作。按前后顺序输出线性表 L 的所有元素值。
      Empty(L):判空操作。若 L 为空表,则返回 true ,否则返回 false 。
      DestroyList(&L):销毁操作。销毁线性表,并释放线性表 L 所占用的内存空间。
      注意:①基本操作的实现取决于采用哪种存储结构,存储结构不同,算法的实现也不同。②“&”表示C++中的引用调用。若传入的变量是指针型变量,且在函数体内要对传入的指针进行改变,则会用到指针变量的引用型。在C中采用指针的指针也可达到同样的效果。
    3. 总结:线性表的特点:表中元素的个数有限,表中元素具有逻辑上的顺序性,表中元素有其先后次序。表中元素都是数据元素,每个元素都是单个元素。表中元素的数据类型都相同,这意味着每个元素占有相同大小的存储空间。表中元素具有抽象性,即仅讨论元素间的逻辑关系,而不考虑元素究竟表示什么内容。

    2.1 练习题

    1. 线性表是具有 n 个()的有限序列。
      A、数据表
      B、字符
      C、数据元素
      D、数据项
      解析:线性表由具有相同数据类型的有限数据元素组成的,数据元素由数据项组成的。
      答案:C
    2. 以下()是一个线性表。
      A、由 n 个实数组成的集合
      B、由100个字符组成的序列
      C、所有整数组成的序列
      D、邻接表
      解析:线性表定义的要求为:相同数据类型有限序列。选项C的元素个数是无穷个,错误;选项A集合中的元素没有前后驱关系,错误;选项D属于存储结构,线性表是一种逻辑结构,只有选项B符合要求。
      答案:B

    2.2 线性表的顺序表示

    1. 线性表的顺序存储又称顺序表。它是用一组地址连续的存储单元依次存储线性表中的数据元素,从而使得逻辑上相邻的两个元素在物理位置上也相邻。第 1 个元素存储在线性表的起始位置,第 i 个元素的存储位置后面紧接着存储的是第 i + 1 元素,称 i 为元素 ai在线性表中的位序。因此,顺序表的特点是表中元素的逻辑顺序与其物理顺序相同
    2. 线性表中元素的位序是从 1 开始的,而数组中元素的下标是从 0 开始的。
    3. 假定线性表的元素类型为 ElemType,则线性表的顺序存储类型描述为
    #define MaxSize 50				//定义线性表的最大长度 
    typedef struct
    {
    	ElemType data[MaxSize];		//顺序表的元素 
    	int length;					//顺序表的当前长度 
    }SqList;						//顺序表的类型定义 
    
    1. 一维数组可以是静态分配的,也可以是动态分配的。在静态分配时,由于数组的大小和空间事先已经固定,一旦空间占满,再加入新的数据将会产生溢出,进而导致程序崩溃。而在动态分配时,存储数组的空间是在程序执行过程中通过动态存储分配语句分配的,一旦数据空间占满,就另外开辟一块更大的存储空间,用以替换原来的存储空间,从而达到扩充存储数组空间的目的,而不需要为线性表一次性地划分所有空间。
    #define InitSize 100			//表长度的初始定义 
    typedef struct
    {
    	ElemType *data;				//指示动态分配数组的指针 
    	int MaxSize, length;		//数组的最大容量和当前个数  
    }SeqList;						//动态分配数组顺序表的类型定义 
    
    1. C的初始动态分配语句为L.data=(ElemType*)malloc(sizeof(ElemType)*InitSize);
    2. C++的初始动态分配语句为L.data=new ElemType[InitSize];
    3. 动态分配并不是链式存储,它同样属于顺序存储结构,物理结构没有变化,依然是随机存取方式,只是分配的空间大小可以在运行时决定。
    4. 顺序表最主要的特点是随机访问,即通过首地址和元素符号可在时间O(1)内找到指定的元素。
    5. 顺序表的存储密度高,每个节点只存储数据元素。顺序表逻辑上相邻的元素物理上也相邻,所以插入和删除操作需要移动大量元素,平均时间复杂度为O(n)。
    6. 按值查找操作(顺序查找)在顺序表L中查找第一个元素值等于e的元素,时间复杂度为O(n)。

    2.2 练习题

    1. 线性表的顺序存储结构是一种()
      A、随机存取的存储结构
      B、顺序存取的存储结构
      C、索引存取的存储结构
      D、散列存取的存储结构
      解析:本题易误选B。存取方式是指读写方式。顺序表是一种支持随机存取的存储结构,根据起始地址加上元素的序号,可以很方便地访问任意一个元素,这就是随机存取的概念。
      答案:A
    2. 一个线性表最常用的操作是存取任一指定序号的元素并在最后进行插入删除操作,则利用()存储方式可以节省时间。
      A、顺序表
      B、双链表
      C、带头结点的双循环链表
      D、单循环链表
      解析:只有顺序表可以按序号随机存取,且在最后进行插入和删除操作不需要移动任何元素。
      答案:A
    3. 在 n 个元素的线性表的数组表示中,时间复杂度为O(1)的操作是()。
      I、访问第 i (1 ≤ i ≤ n)个结点和求第 i (2 ≤ i ≤ n)个结点的直接前驱
      II、在最后一个结点后插入一个新的结点
      III、删除第 1 个结点
      IV、在第 i (1 ≤ i ≤ n)个结点后插入一个结点
      A、I
      B、II、III
      C、I、II
      D、I、II、III
      解析:在最后位置插入新结点不需要移动元素,时间复杂度为O(1);被删结点后的结点需依次前移,时间复杂度为O(n)。
      答案:C
    4. 设线性表由 n 个元素,严格说来,以下操作中,()在顺序表上实现要比链表上实现的效率高。
      I、输出第 i (1 ≤ i ≤ n)个元素值
      II、交换第 3 个元素与第 4 个元素的值
      III、顺序输出这 n 个元素的值
      A、I
      B、I、III
      C、I、II
      D、II、III
      解析:对于II,顺序表上实现仅需 3 次交换操作;链表上则需要分别找到两个结点前驱,前 4 个结点断链后再插入到第 2 个结点后面,效率较低。
      答案:C
    5. 若长度为 n 的非空线性表采用顺序存储结构,在表的第 i 个位置插入一个数据元素,i 的合法值应该是()。
      A、1 ≤ i ≤ n
      B、1 ≤ i ≤ n + 1
      C、0 ≤ i ≤ n - 1
      D、0 ≤ i ≤ n
      解析:线性表元素的序号是从 1 开始,而在第 n + 1 个位置插入相当于在表尾追加。
      答案:B
    6. 【2010统考真题】设将 n(n>1)个整数存放到一维数组 R 中。设计一个在时间和空间两方面都尽可能高效的算法。将R中保存的序列循环左移p(0<p<n)个位置,即将R中的数据由(X0,X1,…,Xn-1)变换为(Xp,Xp+1,…,Xn-1,X0,X1,…,Xp-1,)。要求:
      (1)给出算法的基本设计思想。
      (2)根据设计思想,采用C或C++或Java语言描述算法,关键之处给出注释。
      (3)说明你所设计算法的时间复杂度和空间复杂度。
      解答:
      (1)算法的基本设计思想:可将这个问题视为把数组 ab 转换成数组 ba (a代表数组的前 p 个元素,b代表数组中余下的 n - p 个元素),先将 a 逆置得到 a-1b ,再将 b 逆置得到 a-1b-1 ,最后将整个a-1b-1逆置得到 (a-1b-1)-1 = ba。设 Reverse 函数执行将数组元素逆置的操作,对 abcdefgh 向左循环移动 3 (p=3)个位置的过程如下:
      Reverse(0, p - 1)得到 cbadefgh;
      Reverse(p, n - 1)得到 cbahgfed;
      Reverse(0, n - 1)得到 defghabc;
      注:Reverse 中,两个参数分别表示数组中待转换元素的始末位置。
      (2)使用C语言描述算法如下:
      (3)上述算法中三个Reverse 函数的时间复杂度分别为O(p/2)、O((n-p)/2)、O(n/2),故所设计的算法的时间复杂度为O(n),空间复杂度为O(1)。
    //第2小问代码
    void Reverse(int R[], int from, int to)
    {
    	int i, temp;
    	for(i = 0; i < (to - from + 1) / 2; i++)
    	{
    		temp = R[from + i];
    		R[from + i] = R[to - i];
    		R[to - i] = temp;
    	}
    }
    void Converse(int R[], int n, int p)
    {
    	Reverse(R, 0, p - 1);
    	Reverse(R, p, n - 1);
    	Reverse(R, 0, n - 1);
    }
    

    1. 【2011统考真题】一个长度为L(L≥1)的升序序列S,处在第\lceilL2\frac{L}{2}\rceil个位置的数称为S的中位数。例如列S1=(11,13,15,17,19),则S1中的中位数是15。两个序列的中位数是含它们所有元素的升序序列的中位数。例如,若92=(2,4,6,8,20),则.S1和S2的中位数是11。现有两个等长升序序列A和B,试设计一个在时间和空间两方面都尽可能高效的算法,找出两个序列A和B的中位数。要求:
      (1)给出算法的基本设计思想。
      (2)根据设计思想,采用C或C++或Java语言描述算法,关键之处给出注释。
      (3)说明你所设计算法的时间复杂度和空间复杂度。
      解答:
      (1)算法的基本设计思想如下:
      分别求两个升序序列A、B的中位数,设为a和b,求序列A、B的中位数的过程如下:
      ①若a=b,则a或b即为所求中位数,算法结束。
      ②若a<b,则舍弃序列A中较小的一半,同时舍弃序列B中较大的一半,要求两次舍弃的长度相等。
      ③若a>b,则舍弃序列A中较大的一半,同时舍弃序列B中较小的一半,要求两次舍弃的长度相等。
      在保留的两个升序序列中,重复过程①、②、③,直到两个序列中均只含一个元素时为止,较小者即为所求的中位数。
      (2)本题代码如下:
      (3)算法的时间复杂度为O(log2n),空间复杂度为O(1)。
    int M_Search(int A[], int B[], int n)
    {
    	int s1 = 0, d1 = n - 1, m1, s2 = 0, d2 = n - 1, m2;
    	//分别表示序列A和B的首位数、末位数和中位数 
    	while(s1 != d1 || s2 != d2)
    	{
    		m1 = (s1 + d1) / 2;
    		m2 = (s2 + d2) / 2;
    		if(A[m1] == B[m2]) return A[m1];	//满足条件① 
    		if(A[m1] < B[m2])					//满足条件② 
    		{
    			if((s1 + d1) % 2 == 0)	//若元素个数为奇数 
    			{
    				s1 = m1;		//舍弃A中间点以前的部分且保留中间点 
    				d2 = m2;		//舍弃B中间点以后的部分且保留中间点 
    			}
    			else					//若元素个数为偶数 
    			{
    				s1 = m1 + 1;	//舍弃A中间点及中间点以前的部分
    				d2 = m2;		//舍弃B中间点以后的部分且保留中间点 
    			}
    		}
    		else								//满足条件③ 
    		{
    			if((s2 + d2) % 2 == 0)			//若元素个数为奇数 
    			{
    				d1 = m1;		//舍弃A中间点以后的部分且保留中间点 
    				s2 = m2;		//舍弃B中间点以前的部分且保留中间点 
    			}
    			else					//若元素个数为偶数 
    			{
    				d1 = m1;		//舍弃A中间点以后的部分且保留中间点 
    				s2 = m2 + 1;	//舍弃B中间点及中间点以前的部分 
    			}
    		}
    	}
    	return A[s1] < B[s2] ? A[s1] : B[s2];
    }
    

    1. 【2013统考真题】已知一个整数序列A=(a0,a1,…,an-1),其中0 ≤ ai < n(0 ≤ i < n)。若存在ap1=ap2=…=apm=x且m>n/2(0 ≤ pk < n,1 ≤ k ≤ m),则称 x 为A的主元素。例如A=(0,5,5,3,5,7,5,5),则5为主元素;又如A=(0,5,5,3,5,1,5,7),则A中没有主元素。假设A中的n个元素保存在一个一维数组中,请设计一个尽可能高效的算法,找出A的主元素。若存在主元素,则输出该元素;否则输出-1。要求:
      (1)给出算法的基本设计思想。
      (2)根据设计思想,采用C或C++或Java语言描述算法,关键之处给出注释。
      (3)说明你所设计算法的时间复杂度和空间复杂度。
    2. 【2018统考真题】给定一个含n(n≥1)个整数的数组,请设计一个在时间上尽可能高效的算法,找出数组中未出现的最小正整数。例如,数组{-5, 3, 2, 3}中未出现的最小正整数是1;数组{1, 2, 3}中未出现的最小正整数是4。要求:
      (1)给出算法的基本设计思想。
      (2)根据设计思想,采用C或C++或Java语言描述算法,关键之处给出注释。
      (3)说明你所设计算法的时间复杂度和空间复杂度。

    最后一次更新时间:2021/03/09 23:20

    展开全文
  • Java数据结构学习

    千次阅读 2014-03-13 21:11:01
    java 数据结构学习
    Set
    无序不重复,遍历只能使用迭代器或增强for循环(对java编译器而言,等价)。
    1)hashSet:用hash表实现;
    2)TreeSet:用排序二叉树实现;
    当通过contains方法判断set集合中是否包含某个对象时,需要首先根据该对象的hashCode值索引到特定的空间,然后再和空间中的对象调用equals方法进行比较。这种针对性的查找方式不同于线性表的逐个比较,有较高的效率。
    对于重写equals方法的对象,一般要妥善重写继承自object类的hashCode方法(),不然有可能值相等的两个对象,equals对比后,返回为false.如:
    Point p1 = new Point(1,2);
    Point p2 = new Point(1,2);

    如果没有妥善写好hashCode方法,p1和p2的hashCode值可能不等,那它们就根本没有比较的机会。


    待续...


    展开全文
  • 数据结构学习笔记

    千次阅读 2013-04-19 16:10:20
    数据结构学习笔记   程序=数据结构+算法   数据结构=数据+结构   结构的本质是关系   数据之间的关系包含逻辑关系和物理关系   算法的设计要依据数据的逻辑关系   算法的实现要依据数据的物理关系   物理关系...

    数据结构学习笔记

     

    程序=数据结构+算法

     

    数据结构=数据+结构

     

    结构的本质是关系

     

    数据之间的关系从不通风层面上分为逻辑关系和物理关系

     

    算法的设计要依据数据的逻辑关系

     

    算法的实现要依据数据的物理关系

     

    物理关系是逻辑关系的基础和载体

     

    算法实现时需要先依据问题抽象出数据模型,即初步确定待处理数据的逻辑结构,再用伪代码将该逻辑结构转化为抽象数据类型,最后用计算机语言实现抽象数据类型,转换成可执行的存储结构。

     

    逻辑结构确定数据的基本关系是一对一(线性)、一对多(树),还是多对多(图)关系。

    抽象数据类型以类的形式用伪代码确定数据类型的数据成员和成员函数接口

    物理结构即选用顺序存储或链式存储方式用计算机语言具体实现抽象数据类型

     

    对一种数据类型的原子操作包括 构造、析构、增、删、查、改、排等。操作实现的关键是正确使用数据的地址。当用顺序存储实现时需注意各元素的存储顺序,边界元素的确定最关键;当用链式存储实现时需注意各元素的对应的指针和指针依赖关系。

     

    一般同一种逻辑结构既可以用顺序存储实现又可以用链式存储结构实现,权衡两种方式时需要依据对数据的操作类型,一般顺序存储更利于静态操作,链式操作更利于动态操作。

     

    评判算法依据主要包括时间性能和空间性能。时间和空间往往可以转换即牺牲时间换取空间或牺牲空间换取时间。

     

    算法是程序的灵魂,而数据结构是算法的载体,合理的数据结构是良好算法的基础。


    展开全文
  • 数据结构学习总结

    千次阅读 2011-11-16 01:31:00
    今天终于把严蔚敏数据结构C语言版的最后一个算法搞定了,回想数据结构的学习...一块大石头放下了,把一些相关的代码都放在了博客中【数据结构学习笔记】一栏中了。  记得这本书是去年买的,买的时候有8成新,现在连
  • 数据结构学习感悟

    千次阅读 多人点赞 2016-10-14 10:29:30
    数据结构渐进式学习  数据结构毫无疑问的是在编程上非常重要的一部分内容,在我的学习过程中,我经历了迷茫,入门,熟悉等阶段,我以个人经历为例子,讲解一下我对数据结构从惧怕到熟悉的过程。  我是一个学习编程...
  • 数据结构学习书籍

    万次阅读 2018-03-28 09:49:55
    1.《大话数据结构》 2.《数据结构与算法分析--Java语言描述》 3.《数据结构和抽象问题求解--Java语言描述》 4.《算法导论》
  • (一)Android数据结构学习之链表

    千次阅读 2017-08-02 16:24:42
    - (一)Android数据结构学习与算法之链表 - (二)Android数据结构学习与算法之数组 - (三)Android数据结构学习与算法之队列前言我们都知道Android是基于java的,Java中实现了很多数据结构,像我们最常使用的数组...
  • 关于数据结构学习方法

    千次阅读 2011-12-13 16:14:55
    在网上搜集到的数据结构学习方法,请同学们参考。   谈数据结构学习方法(转帖) 我在这里只是谈谈自己的学习体会现在咱们学的的数据结构是C++版本的 所以C++的一些基础知识应该先看会 尤其是指针那一部分 很多...
  • 数据结构学习网站

    千次阅读 2020-02-17 10:03:46
    数据结构演示网站https://www.cs.usfca.edu/~galles/visualization/Algorithms.html
  • 数据结构学习笔记:封底估算

    千次阅读 2019-04-27 17:46:33
    之前介绍的大O记号法模糊定性地去估算一个算法的复杂度之外数据结构学习笔记:算法复杂度的度量之“大O记号” 还有一种可以精细定量地估计算法复杂度的方法之一就是封底估算!! 这种估算几乎不需要比较,只需要用...
  • (三)Android数据结构学习之队列

    千次阅读 2017-08-07 15:30:46
    (一)Android数据结构学习与算法之链表 (二)Android数据结构学习与算法之数组 今天的文章我们来一起学习一下数据结构之队列。正文对于队列稍有耳闻的同学肯定会知道它有一个特点:先进先出。正是这个特点使得队列在...
  • 数据结构学习整理

    千次阅读 2016-06-06 23:25:00
    数据结构是相互之间存在一种或多种特定关系的数据的集合。 1、抽象层-逻辑结构数据元素之间的逻辑关系称为数据的逻辑结构。数据的逻辑结构可以看作是从具体问题抽象出来的数学模型,它与数据的存储无关。 1.1、集合...
  • 数据结构学习心得体会

    万次阅读 2017-12-14 11:26:52
    时间转眼即逝,一转眼一学期的数据结构课就已经快要结束了,我对第一节课的时候老师向我们介绍云班课时的场景还历历在目,老师兴致勃勃的介绍着数据结构课的作用,重要性。老师每节课都充满活力让我们每节课都...
  • 买了不少数据结构书 不知道哪些适合我 目前准大二 即将开数据结构数据结构与算法分析 c语言描述 数据结构与算法分析 java语言描述 算法四 就红色那本书 算法导论 大话数据结构 感觉有点贪多了 目前...
  • (二)Android数据结构学习之数组

    千次阅读 2017-08-04 17:11:54
    前言上一篇文章讲述了数据结构的基本知识以及链表的相关知识,地址:(一)Android数据结构学习与算法之链表,本文是系列文章的第二篇,讲的是数组概述数组的使用数组在java中的实现为下:String[] arr1 = new String...
  • 数据结构学习路线

    千次阅读 2019-10-24 10:32:01
    Treap Splay树 划分树 左偏树 线段树 树链剖分 动态树 主席树 Trie树 RMQ 二分查找 树状数组 滚动数组 逆序数 带权值的并查集 Chtholly Tree (珂朵莉树) ODT SBT算法 AVL树 ......
  • 数据结构学习心得总结

    千次阅读 2016-01-29 21:35:03
    开篇经过近一个月的学习,终于将郝斌老师讲的数据结构视频看完了~学习完成后,受益良多,也非常喜悦,非常开心,好像终于打了一场胜仗一样!我打算将这一个月的学习心得做一个汇总,记录下来。 希望能给初学者带来...
  • c#数据结构学习总结

    万次阅读 2017-03-12 10:44:10
    c#常用数据结构解析 http://blog.csdn.net/suifcd/article/details/42869341 前言: 可能去过小匹夫博客的盆油们读过这篇对于数据结构的总结,但是小匹夫当时写那篇文章的时候略有匆忙,所以今天进行了一些增改,...
  • 数据结构学习路线+笔记

    千次阅读 多人点赞 2016-03-22 17:14:24
    在学校学习过后感觉数据结构学完之后还是迷迷糊糊的,而数据结构已经有很多位前辈说过其重要性,于是下决心再来一遍“复习”。代码会陆续贴上来,轻喷,都是些简单的基础知识。 ————学习来源为郝斌老师的视频 ...
  • 数据结构学习笔记(1)

    千次阅读 2019-11-20 20:13:56
    基本概念和术语 数据:指所有能输入到计算机中并被计算机程序处理的符号的总称。如 图像,声音等都可以通过编码归之于数据。...数据结构:相互之间存在一种或多种特定关系的数据元素的集合。数据元...
  • 算法与数据结构学习网址

    千次阅读 2018-09-26 17:30:34
    数据结构和算法动态可视化 (Chinese) https://visualgo.net/zh 算法与数据结构 https://www.itcodemonkey.com/category/TheAlgorithm/ 用python实现基本数据结构和算法 ...
  • 数据结构学习--希尔排序

    千次阅读 多人点赞 2020-11-20 00:00:21
    算法描述:希尔排序是插入排序的一种改进,主要是为了解决当较小的数据大都出现在数组后面时导致的移动次数明显增多的问题,思想是使用一个不断缩小的增量gap将数组元素分组,在每个分组内部先进行插入排序,当gap...
  • 数据结构学习心得——单链表

    千次阅读 2017-08-17 18:36:14
    一、线性表的存储结构 顺序表(顺序表操作见上一篇博客) 链表 在链表存储中,每个结点不仅包含所有的元素的信息,还包含元素之间逻辑关系的信息,如单链表中前驱结点包含后继结点的地址信息,这样就可以通过前驱...
  • 数据结构学习推荐教材

    千次阅读 2016-12-15 20:42:40
    记得当年学数据结构的课程用的那本烂教材让我非常恼火,后来干脆就把书给扔掉, 在网上找那些英文的讲义来看. Data structures in C 这本教材国内几乎没有看到发行, 作者把源代码都放到网上了. 如果你现在还在用C语言...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 128,558
精华内容 51,423
关键字:

数据结构学习

数据结构 订阅