数据结构基础(一)

        我们今天来学习下数据结构,那么为什么要学习数据结构呢?学习它的意义可以使我们培养专业的程序设计思维,训练使用程序语言描述解决方案的能力。它是算法分析专业课的先修课程,也就是说,如果我们以后想学习算法类的课程,我们就必须得学好数据结构。我们先来看看程序的本质,程序是为了解决实际问题而存在的,从本质上而言,程序是解决问题的步骤描述。

        我们在进行问题分析时,首先得确认问题类型,如数值计算,求最小值个数等;其次是确认求解步骤,如打开文件,读数据,关闭文件,计算和等。那么我们如何判断问题求解步骤的好坏呢?1、用尽量少的时间解决问题;2、用尽量少的步骤解决问题;3、用尽量少的内存解决问题。数据结构主要的研究范围是:1、非数值计算类型的程序问题;2、数据间的组织和操作方式;3、数据的逻辑结构和存储结构。我们经常会听到:程序 = 数据结构 + 算法。那么对于数据结构和算法的研究而言,语言不重要,重要的是思想。但是它们是有前提的,我们绝对不能忽视它们的前提条件。

        数据便是程序的操作对象,用于描述客观事物。它的特点是可以输入到计算机,可以被计算机程序处理。那么在数据中,分为三类:数据元素、数据项以及数据对象。数据元素是组成数据的基本元素,一个数据元素则是由若干个数据项组成,数据对象是由性质相同的数据元素的集合。它们的关系如下如所示

图片.png

        数据结构是指数据对象中数据元素之间的关系,数据元素之间不是独立的,存在特定的关系,这些关系即结构。如数组中各个元素之间存在固定的线性关系。那么我们在编写一个好的程序之前,必须分析处理问题中各个对象的特性以及对象之间的关系。下来我们来看看数据结构中的一些结构。集合结构是指数据元素之间没有特别的关系,仅属性相同的集合;线性结构是指数据之间是一对一的关系;树形结构是指数据元素之间存在一对多的层次关系;图形结构则是指数据元素之间是多对多的关系。如下图所示

图片.png

         我们来看看其中的物理结构,便是逻辑结构在计算机中的存储形式。它分为两种:1、顺序存储结构,是将数据存储在地址连续的存储单元里;2、链式存储结构,是将数据存储在任意的存储单元里,通过保存地址的方式找到相关联的数据元素。它们的结构示意如下图所示

图片.png

        那么数据结构是什么呢?它是相互之间存在特定关系的数据元素的集合,数据结构可以分为逻辑结构和物理结构。逻辑结构是指包括集合结构、线性结构、树形结构以及图形结构。物理结构便是指顺序结构和链接结构。数据结构静态的描述了数据元素之间的关系,高效的程序需要在数据结构的基础上设计和选择算法。总结为:高效的程序 = 恰当的数据结构 + 合适的算法。算法是特定问题的求解步骤的描述,在计算机中表现为指令的有限序列。算法是独立存在的一种解决问题的方法和思想,我们经常听到的一句话:语言并不重要,重要的是思想。这句话是由前提的,那便是对于算法而言的。

        下来我们来看看算法的特性:

        1、输入:算法具有 0 个或多个输入;

        2、输出:算法至少有 1 个或多个输出;

        3、有穷性:算法在有限的步骤之后会自动结构而不会无限循环;

        4、确定性:算法中的每一步都有确定的含义,不会出现二义性;

        5、可行性:算法的每一步都是可行的。

        算法对于合法数据能够得到满足要求的结果;算法能够处理非法输入,并得到合理的结果;算法对于边界数据和压力数据都能得到满足要求的结果。注意:正确性是算法最需要满足的基本准则,但是作为计算机程序,不可能无限制的满足这条准则。

        程序的三大特性:1、可读性,算法要方便阅读理解和交流;2、健壮性,算法不应该产生莫名其妙的结果;3、性价比,利用最少的资源得到满足要求的结果。算法的可读性是最容易被忽视的,因为我们经常会追求高效的算法,从而不会去注意它的可读性。然而,程序是写给人看的,而不是计算机。在两个算法都满足功能性要求的前提下,我们最关心的其他特性是什么呢?如何进行比较评判呢?

        性价比也就是效率是工程中最关注的算法附加特性!我们经常会用到事后统计法比较不同算法对同一组输入数据的运行处理时间。它的缺陷:1、为了获得不同算法的运行时间必须编写相应的程序;2、运行时间严重依赖于硬件以及运行时的环境因素;3、算法的测试数据的选取是相当困难的。还要一种就是事前分析估算依据统计的方法对算法效率进行估算。影响算法效率的主要因素有:1、算法采用的策略和方法;2、问题的输入规模;3、编译器所产生的代码;4、计算机执行速度。

        下面进行一个算法的简单估算,如下

图片.png 图片.png

图片.png

        程序效率估算练习中的关键部分的操作数量为 n*n;三种求和算法中关键部分的操作数量分别为 2n,n和 1;随着问题规模 n 的增大,它们操作数量的差异会越来愈大,因此实际算法在效率上的差异也会变得非常明显!如下

图片.png

        我们来看看算法操作数量的对比,如下

图片.png

        结论:当 n <= 3 时,算法 B 优于算法 A;当 n 越来越大时,算法 A 相对算法 B 的优势明显

图片.png

        结论:当 n == 1 时,算法 C 和算法 D 的操作数量相同;当 n 越来越大时,算法 C 的效率远高于算法 D。

图片.png

        结论:判断一个算法的效率时,操作数量中的常数项和其他次要项是可以忽略的,只需要关注最高阶项就能得出结论


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章