码迷,mamicode.com
首页 > 其他好文 > 详细

数据结构基础(一)

时间:2018-08-07 00:32:43      阅读:165      评论:0      收藏:0      [点我收藏+]

标签:之间   数据对象   其他   type   编译器   时间   输出   莫名其妙   term   

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

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

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

技术分享图片

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

技术分享图片

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

技术分享图片

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

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

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

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

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

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

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

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

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

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

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

技术分享图片 技术分享图片

技术分享图片

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

技术分享图片

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

技术分享图片

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

技术分享图片

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

技术分享图片

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


         欢迎大家一起来学习数据结构,可以加我QQ:243343083

数据结构基础(一)

标签:之间   数据对象   其他   type   编译器   时间   输出   莫名其妙   term   

原文地址:http://blog.51cto.com/12810168/2155485

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!