为什么说程序=算法+数据结构!

本文将描述自己对算法的数学表达的理解。将使用提问的方式来引导大家思考,进而对问题一步一步的分析,是一个循序渐进的过程。本文侧重讲讲笔者的看法,没有什么实质的内容。但我相信,一些看法对于你从事编程工作来说,可能还是有帮助滴。废话少说,看题!

 

1.      什么是程序的构成?

代码?编程语言?编译器?链接器?不不不 ……。我想听到的答案是算法+数据结构。

没有算法的程序,只是一些代码的堆砌,谈不上是一个优秀的软件(即便一个简单的单片机流水灯的程序也应该有一个算法,当然可能你觉的太简单了没有必要)。传说!算法是软件的灵魂。这个还真不是传说。你看,某某云音乐对用户行为进行数据分析并通过一些算法进行个性化推荐,短时间就抢夺了多少的音频播放终端,广受用户欢迎。之所以称为,算法是软件的灵魂,得益于好的算法会给软件带来的往往都是质的变化,性能都是呈指数倍提高滴。

数据结构是什么?不要问我,数据结构用什么实现。因为那都不是事儿!我要告诉大家的是,如果没有它,你的软件系统就会变得极其不值钱。甚至于到你开发完成之后,你再也不想理他了。很多年前,我用java编写了一个类似QQ的软件,费了好大的劲才把开发完成,实现了低版本QQ的所有聊天功能,发文字、图片、表情、截图、文件以及抖动窗口等等。还有群聊功能,推送系统、会员积分系统等,可谓应有尽有。遗憾的是,后期我并不想维护它了,原因是软件模块实在难于管理,耦合性大。可能那是我学java的第一个项目,当时只关注语法并没有过多面向对象的设计,压根不知道其中的奥秘是没有合理的数据结构将各个模块串联起来管理。看了失败的例子,大家都知道的一个成功的例子:Linux。Linux数据结构可谓信手拈来。最重要的思想:一切皆文件!看,当所有模块使用“文件”这个数据结构时,你会发现Linux所有模块近乎相同。非要说会用数据结构的好处,数数Linux系统的好处就知道了,不必多说。

 

2.      算法

a.      怎么描述一个算法?

通常,我们描述一个算法使用的是伪代码。例如:

Insertion-sort(A[1, n])

for j = 2 to n

do

   key = A[j]

   i   = j-1

   while i > 0 and A[i] > key

   do

      A[i+1] = A[i]

      i = i-1

   A[i+1] = key

之所以选择伪代码是因为简洁,不需要做一些不必要的定义。一般采用缩进的形式来区分层次关系。值得一提的是,某些编程语言也采用缩进的方式来区分层次关系。但我觉得不如使用“{}”括号来的简单暴力。也许计算器编程书写影响不大,但是可能会影响编程书籍的跨页阅读。但是对于简单的程序来说,采用缩进又不失简约方便,就像用于描述算法。

采用伪代码的另一个好处,在于不用关心程序的具体实现(也有可能一种算法诞生之后,没有对应的语言能实现)。算法应当不依赖于某种编程语言的实现,像上面的插入排序算法,不管你使用C、Java还是Python都可以实现。

b.     相同算法间怎么比较?不同算法间又是如何比较?

上面所说,使用伪代码来描述的算法不依赖于具体编程语言。那么怎么比较C和Java实现的插入排序算法?又怎么比较使用C实现的插入排序算法和归并排序算法。那有怎么比较使用C实现的归并排序算法和使用Java实现的插入排序算法。

 

那么怎么比较C和Java实现的插入排序算法?(前提是同一台机器)

不用问阿贵都知道,Java的运行较慢些。原因是Java语言本身使用更多的系统资源用于为用户提供更好的面向对象特性。注意这句话并不是一味将这个黑锅扔到Java虚拟机身上,此中缘由此处不再深究。这需要分析语言本身的特性。

 

怎么比较使用C实现的插入排序算法和归并排序算法?

大家说插入排序算法的时间复杂度是多少?θ(n^2 )  。 归并排序算法呢?θ(log⁡n )。你说谁快?我只能说n比较大的时候,归并排序算法更快。这个要分析算法自身的特性。

 

那有怎么比较使用C实现的插入排序算法和使用Java实现的归并排序算法?

这个问题是上两个问题的综合体!满分100分。A君:你猜我得了多少分。B君:猜完了。A君:多少分?B君:你猜!首先,对于同一算法来说,C实现和Java实现的程序,性能来说差的只是一个常量,Java运行的更慢。对于两种算法的时间复杂性,我们发现归并排序算法更快。那么下面等式是否成立呢?

   C语言:          运行快+算法跑得慢=快?

  Java语言:     运行慢+算法跑得快=快?

      为此,我们高数的知识就要用的上了,无穷大+∞!当排序数组的输入规模很大的时候,即n →+∞,插入排序算法的时间复杂度增长速度远远大于归并排序算法,而因语言差异造成的一丁点影响也会忽略不计。所以最后算法占了主导作用。所以Java实现的归并排序算法会运行的更快!

3.      数据结构

此内容就不多讲。因为我从教材学到的这方面东西也并不多。即使修过“数据结构”相关课程,我也不认为课本的知识能让大家在数据结构的应用上融会贯通,即使做到有所感悟,我认为这也是难事。原因是目前大家都偏向于关注算法,而对于软件架构的设计,模块的耦合分析,程序的可扩展性等这方面内容缺乏深入研究。在这里我就扔下这块砖(曾经有个体会,先不说,今天写累了)。希望有大牛大神来为我解答一下数据结构对程序的影响。

 ————————————————————————————————————————————————————————————————————————————

算法比较厉害的~去做大数据分析,数据挖掘,数值分析……!

数据结构比较厉害的~去做软件架构师、操作系统设计……!

以后,别问人家问你什么职业。别回答成敲代码的,也不要简单回答软件工程师。这样显得自己不够专业。你一定要说清楚你是曾经侧重或者精于搞算法或者数据结构的软件系统建筑师(还是码农~)。

你可能感兴趣的:(嵌入式,算法)