您的位置:首页 > 理论基础 > 数据结构算法

三剑客学习之路——数据结构(一)计算模型与算法分析(1)

2016-08-31 21:31 459 查看
    这是我开始学习数据结构的第一次分享博客,本来就是打算早些就把博客发出来的,但是找不到时间,一直拖延了下来,以后一定还是不能拖延。这次主要是数据结构中一些概念的问题,比如计算,计算模型,迭代与递归,算法分析。我的主要知识来源是学院在线的一门课程与《数据结构与算法分析》这门经典的教材。

  一,计算

   (a) 什么是计算机技术?这是一个最基本的问题,新手往往执着于语言特性,技术框架,比如javaEE,安卓应用,IOS,php等等等等,稍微理解一些的,会去理解操作系统,编译器,计算机组成原理。但是这些也只是就计算机这个层面。究其根源,计算机科学比起computer science更应该称为computing science,计算机科学,不是研究计算机这一种特定的机器的科学,而是研究计算的规律和技巧。计算机只是工具手段,种种的不可思议的应用,追根到底,不过是计算的方式的不同和计算速度的不同。计算才是真正的目的,那么研究计算的目的又是什么呢?除了能够正确地解决问题,我们的主要目的可以概括为两个词:高效,低耗。

(b)相信大家都听过一句话,数据结构+算法=程序。但是大家都真正理解了数据机构是什么,算法又是什么吗?先从计算说起,什么是计算,

计算,借助某种工具(计算模型)遵照一定规则(算法),以明确而机械地形式解决问题。

这里有几个概念,计算模型,可以理解为一种信息处理工具,用于执行操作,比如常见的计算机,再比如算盘,古埃及的绳索计算机,尺规计算机。现在所用的计算机,只是其中的一种,关于计算机这种计算模型的详细了解,请左转《深入理解计算机系统》。

第二个概念,算法,特定的计算模型下,旨在解决特定问题的指令序列。

特定的计算模型,当然你不能用算盘去执行java代码,其实计算机也不能,计算机只能执行机器语言,我们所用的高级语言其实是给人看的,或者说给编译器看的;

这里先不讨论计算模型,毕竟计算模型不是我们的事情。

(c)算法的特性;

1,输入。算法可以有0个或者多个输入。

2,输出,至少有一个输出(不然用它干什么)。

3,正确性,在合理的输入下,能够给出正确的结果

4,确定性,算法的每一步骤必须有确切的定义;不能说,加上若干数,这个数必须是确定的,计算机可以理解的,计算机不知道什么是若干。

5,可行性,这个定义借用老师的一个例子,一个小品中有一个笑话,把大象装进冰箱的步骤是什么,一,打开冰箱,二,把大象装进去,三,关上冰箱。但是,就算法的角度来看,这个算法是有问题的,因为第二步是做不到的。

6,有穷性,算法必须能在执行有限个步骤之后终止;

(d)有穷性

这里对于有穷性,需要单独举例说明;

Hailstone序列,



这就是一个著名的序列,输入一个特定值的时候,当有些时候,很容易就将其解出,比如42,很明显,序列为{42,21,64,32,16,8,4,2,1},这是一次很简单的例子,如果有一个算法是输入n获取其hailstone序列,我们可以用java,C ++,C ,等种种语言去实现它,这是一个程序吗?毋庸置疑,这是一个算法吗?答案是不,因为虽然在一些情况下,序列是有穷的,但是也存在一些情况,我们无法返回一个有穷的序列。由此可见程序不等于算法。

(e)什么是好的算法?

1,正确,符合语法,能够编译链接,能够正确处理简单的输入,大量的输入,退化的输入,一般的输入,任意合法的输入。

2,健壮,这是非常重要的,在实际的场景中,你无法限制程序的使用者会做出什么白痴的事情。但是如果如果他的输入让你的程序做出了白痴的响应,那这个白痴就是你了。在工程中,会有专门的测试人员来挑错误,在此不赘述了。

3,可读,博主非常赞同一句话,程序不是写给计算机看的,而是写给人看的,如果没有注释和文档,一个月后,你自己都看不懂自己的代码,而且实际上,代码都是分批开发的,你随意的一写,功能倒是实现了,你的后继者怕是都想去死了(某位维护过一次没有注释,没有文档的程序的码农愤怒脸),在写代码时候,最好把维护你代码的人想象成一个知道你家地址的杀人狂。

4,效率,对于初学者而言,很多算法都是显而易见的,我们凭着直觉就选择了它,在我们完成老师布置的作业时,往往效果还不错,那是因为对于作业,往往计算量是非常非常小的。算法的优劣看不出来,但是实际应用中,将有着质的区别,

一个重要的观念,写出一个可以工作的程序并不够,如果这个程序在巨大的数据集上运行。

在之前的特性中,效率是我们着重研究的对象,换句话说,速度尽可能快,消耗内存尽可能小。接下来的几章,都将围绕这一特性来研究。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息