数据结构--综合设计

综合学习设计

 

总体结构

  1. 分析问题,明晰类别
  2. 选择结构,定位算法
  3. 算法操作
  4. 结论归纳与分析

 

分析问题,明晰类别

在确定数据结构这门课程的方向,首先对一个题目进行分析,我们拿背包这个案例来说,背包问题有三种大类,第一种是01背包,第二种是完全背包,第三种是多重背包。背包问题属于NP优化问题,可以描述为,有一堆物品,每种物品都有自己的重量和对应的价格,如何分配,才能使有限的重量内获取最大的价值,也即总价格。01背包问题是最简单的一种,物品定义为只有一个,完全背包里面物品是无限量,多重背包里面物品有限个,这里只以01背包为例。

参数阀值和格式化输入考虑

参数阀值为该题上下界考虑,输入输出为题目指定按照某种形式输入。

 

选择结构,定位算法

在分析问题题意之后,我们来确定如何用数学方式来表达,设定f[i][v]表示前i件物品放入容量为v的背包的最大价值,我们能用中文来理解,前i-1件物品的最大价值为f[i-1][v],所以这个时候放入第i件物品,我们可以假设放进去后符合最大价值,那么f[i-1][v-w[i]+v[i]]表示放入后的最大价值,所以我们只要比较这两者的最大值即可,表达式为f[i][v]=max{ f[i-1][v], f[i-1][v-w[i]]+v[i] }。

 

复杂度考虑,应为使用的是遍历i、v两个变量,所以时间和空间复杂度为o(N*V)。

 

结构学习和复杂度(排序)为整体思路,具体到细节部分应该结合题目考虑。

排序复杂度通常应用最广,大部分题型都有应用。

 

算法操作

 

这一块具体表现为,如何将数学语言转化为代码实现以及如何优化。在上述的背包案例中,状态转移方程f[i][v]=max{ f[i-1][v], f[i-1][v-w[i]]+v[i] },进一步可以优化为f[v]=max{f[v],f[v-w[i]]+v[i]};,空间复杂度降为o(V)。

 

C代码:

数据结构--综合设计_第1张图片

 

优化过后的代码:

数据结构--综合设计_第2张图片

 

问题特征                         

代码写完后,进行测试,从健壮性和可行性以及其他特性方面进行分析,多次算法迭代,进行大量数据测试来确定这种算法思路能有效解决问题。

 

最后进行结论归纳与分析

同样以01背包问题为例,从背包问题本质入手,此类型的问题通常使用动态规划来解决,也即使用上面说的状态转移方程。从解决此类问题的过程我们就能分析,使用动态规划,空间效率上大,存储结构是二维数组的形式,但是因为问题可以分解为,当前的解只和上一层的解相关,所以在优化空间之后,使得复杂度从o(N*V)降为o(V),但是经过分析,空间优化之后,只能得到最终解,而得到解的整个过程没有保存下来,所以在实际应用过程中,依然是根据题目的要求来选择更符合题意的解法。

 

数据结构课程

从归纳角度来看,数据结构整个综合设计框架,应该围绕各类典型案例来分析,通过一个案例的剖析,来突出使用的数据结构和算法思路,以我的观点来看,程序=数据结构+算法,而我们在设计数据结构这门课的时候,不光考虑数据结构本身,而且要懂得使用,数据结构离不开算法,两者的关系好比HTML和JS,我们需要的是能灵活使用的工具,而不是一堆废铁。数据结构是内在修养,相比来说,考研基础课里面,数据结构是大头,重要性可见一斑。

 

数据结构—重点理解

数据结构--综合设计_第3张图片

 

上面这张图是算法竞赛(刘汝佳)书上的一部分,自认为是数据结构入门最适合理解的知识内容。

内容分为三部分,排序、dp、贪心。

排序是贯穿整个数据结构的核心内容,主要分为内部排序和外部排序,在实际教学过程中,结合案例,优先讲解实现简单的冒泡和插入排序,然后逐步引入复杂的归并排序,快速排序等。

动态规划是处理最优解问题的最佳思路,当前的解和上一个解之间存在联系,找到联系之后,构建状态转移方程,求解简单的dp问题。

贪心属于算法里面的一种思想,每次求解过程,都选择最有利的一个解,在层层递归后达到最终的解,贪心算法结合排序能解决大部分简单问题,而复杂一点的问题通过构建合适的模型以及代码层面上进行合理的剪枝处理,从而达到解决主要问题。

 

总而言之,数据结构学完之后,你会感觉很空,因为里面全是知识点的学习,或者说是单个知识点的应用,如果要掌握数据结构这门课,必须得结合大量算法试题去编写代码,在编写代码的这个过程中,会遇到各类细节问题,(书上的代码敲进去不能运行,题目参数的变化可能算法使用不一样,一题多解等),综合过来人经验,完成题量在200左右,逐渐入门数据结构,500左右熟悉数据结构,1000左右常用算法能运用自如,独立解决问题的想法更加广,2000到5000之间是大牛级别,5000以上是神犇级别。再给个参考,普通985、211高校计算机专业毕业生一般是入门到熟悉这块,应付数据结构考研,500题量以上搓搓有余。

 

你可能感兴趣的:(读研)