OSC 第 79 期高手问答精彩互动汇总 —— 算法和软件的关系

OSCHINA 本期高手问答(6月17日- 6月24日)我们请来了 @王-晓华(王晓华)为大家解答关于 算法和软件的关系 方面的问题。

原帖:http://www.oschina.net/question/865233_240128 

王晓华,@王-晓华  毕业于华中科技大学,目前在中兴通讯上海研发中心从事光纤接入网通讯设备开发,担 EPON(以太网无源光网络)业务软件开发经理,参与开发的 PON 设备在全球部署过亿线,为数亿家庭提供宽带接入服务。最大的乐趣就是用程序解决生活中的问题: 为了方便使用 Visual Studio 6.0 开发软件,曾特意编写并开源了一个 tabbar 插件; 为了文档安全,开发了一个基于 layerFSD 技术的透明文件加密系统; 使用 Source Insight 软件觉得不习惯,于是以外挂的形式开发了 TabSiPlus 插件…… 

算法之大,大到可以囊括宇宙万物 的运行规律;算法之小,小到寥寥数行代码即可展现一个神奇的功能。算法的应用和乐趣在生活中无处不在: 历法和二十四节气计算使用的是霍纳法则和求解一元高次方程的牛顿迭代法;音频播放器跳动的实时频谱背后是离散傅立叶变换算法; DOS时代著名的PCX图像文件格式使用的是简单有效的RLE压缩算法;RSA加密算法的光环之下是朴实的欧几里德算法、蒙哥马利算法和米勒-拉宾算法; 井字棋、黑白棋、五子棋和俄罗斯方块游戏背后是各种有趣的AI算法; 华容道游戏求解的简单穷举算法中还蕴藏着对棋盘状态的哈希算法;遗传算法神秘不可测,但用遗传算法求解0-1背包问题只用了60多行代码……

算法可以做的事情还有很多,期待我们会有更多发现!

本期问答已经结束,正在进行的是  OSC 第 80 期高手问答 —  使用 React Native 开发原生 App,URL:

http://www.oschina.net/question/865233_241314

问答精华汇总:

@purely:看过的算法如果不是经常用的,过后就忘怎么办?

@新de代码:大道无形,道法自然,算法,代码都只是一种手段,他们背后还有更深层次的东西,掌握了他,就掌握了全部的推导过程,所谓手中无剑,心中有剑。顺便说一句,搞程序的批判性的看看《庄子》,是有好处的。

@王-晓华:算法忘了没关系,只要能记住对某类问题有个什么算法比较有效就行了,遇到此类问题的时候你就知道去哪里找解决方法了

@lazymather:您好,王先生,请教一个很简单,但是也是很现实的问题。算法是否能在我们平时的软件开发中派上用场,如果有那大概在哪些方面?我知道算法很重要,但是其实它的学习曲线也是最大的,所以能不能请您给出具体学习的路线呢?那肯定会造福很多小伙伴的。

@王-晓华:生活中的算法很多啊,你用过微软的project软件吧,就需要有向图的拓扑排序和关 键路径算法。音频播放器中跳动的跳动的频谱用的是离散傅立叶变换算法,一打开Windows操作系统都是计算机图形学中的算法,判断两篇文档是否有相似 性,最简单的算法是使用余弦定理。你无法掌握,也没有必要学习全部算法,遇到就学一点,慢慢积累

@茶壶:在一个软件里多个算法的藕荷怎么协调?使用算法的目的是处理时间尽量短,还是使用的内存尽量小?

@王-晓华:使用算法的目的是解决问题,对时间还是空间的考虑取决于问题域,根据问题域选择合适的算法即可。你说的算法的耦合我理解应该是算法之间有依赖关系吧,这个可能是软件架构层面的东西,单纯的堆积算法有时候并不奏效

@西南茂:王先生,算法看起来都需要很扎实的数学功底,但是我的数学功底比较差,请问是不是无法学好算法呢

@王-晓华:我理解不是这样的。专业类算法,比如FFT,曲线拟合,确是需要数据理论的支撑,但是 通用类算法和实用类算法有很多与数学的关系并不大,比如通用类算法中的遗传算法,其实只要掌握遗传算法的原理就可以使用了,实用类算法更是如此。数学的作 用是培养了抽象思维能力,这是设计算法需要的能力,当然,要理解你使用的算法也需要这种能力

@饼干怪兽:现在在企业级应用开发中。是否很少涉及到算法?算法感觉都是在底层应用上

@王-晓华:不是这样的,微软的project软件会用到有向图的拓扑排序和关键路径算法,这些应该都不算底层吧

@BugTermina:30岁以后想在技术上有所提升,算法能不能作为一个选择或者说是目标

@王-晓华:程序员除了提升软件能力,还要提升业务能力,要争取成为某一领域的专家。算法是个不错的方向,但是最重要的是要结合自己的工作和专业领域选择合适的方向。

@TymonHuang:算法和软件的关系,这让我联想到计算机程序设计语言,所以了 解一下这本书主要是基于哪种编程语言写的,还是说凌驾于语言之上,只是概念。所以请问作者,什么样的软件需要算法,现在框架技术很成熟,程序员大都工作在 二线,三线,在别人的框架下加工成品,接触或者直接用到算法的机会在减少,有什么建议可以给到对算法有兴趣的程序员;另外,我个人觉得算法是软件的灵魂, 用来算法来解决工作中的问题是乐趣,我们通过本书,能达到什么样的目的,数学功底一般,对这本书的吸收和理解会有影响吗?

@王-晓华:我将算法分为专业类算法、通用类算法和实用类算法,这本书对这三类算法都有展示。算法应该和语言无关的,用代码展示算法只是算法的一种表达形式,你还可以用流程图描述算法,所以最重要的是理解算法的设计思想。本书的算法用的是C++,并不是说这些算法只能用C++实现

@SimonYe:大多数Javaer,日复一夜CRUD。在互联网公司,算法主要在什么地方体现

@lixin3811:按照”软件=数据+算法“推导,CRUD是一个固定、单一、普遍使用的算法;如果你的算法是指"算法"教材中的那些,日常工程类软件是不会用到的;如果说日常可能用到的,可能是常见算法的核心-分治,是系统设计、嵌套调用的基础

@王-晓华:互联网恰恰是算法最集中的地方啊,算法决定了你用Google搜索的结果;算法决定了 新浪微博每天给你推送的话题和推荐的联系人;算法决定了京东和淘宝每天向你展示的广告;优酷会向猜你可能喜欢的视频或电影;百度新闻会把你喜欢看的新闻排 在前面;算法决定了你的导航软件为你选择的道路;

@烽火云烟:请问一个普通程序员,应该学习哪些算法。算法的学习可以在遇到相应问题之后再学习么。

@王-晓华:多数人都是遇到问题后才研究问题的,否则你也没有什么方向,对吧。需要学习一些基础的算法,比如常见的数据数据结构以及与这些数据结构有关的算法。线性表遍历,排序,二叉树查找,二分(折半)查找,树的遍历

@z_y2008:你好,感觉算法学起来比较枯燥,很多原理不懂,很多公式没有用过,对于像我这样的菜鸟,该如何学习算法?恶补数学吗?

@王-晓华:不是所有的算法都会用到数学公式,先从一些有意思的游戏算法入手是个不错的选择,比如书中介绍的A*算法、井字棋游戏

@tinyhare:前辈你好,我想学习算法,看过麻省理工的算法导论公开课(只看了前边后边还没看完),里边经常有时间复杂度的相关东西,我想请问这些大O表示的时间复杂度重要吗,我不做学术研究只想应用,是不是只要理解这些算法的原理就可以了呢?谢谢。

@王-晓华:时间复杂度的目的不是用于直接比较两个算法的运行时间,而是对同一个算法,当问题的规 模n增大以后,运行时间随之增加的程度。O(n)复杂度的算法,当问题的规模扩大10000倍之后,运行时间是原来的10000倍,但是O(n^2)复杂 度的算法,其运行时间是原来的100000000倍。很多情况下,问题的规模是算法的最大敌人,当规模超出处理能力时,算法实际就变得不可用了

@徐庆-neo:大神您好,我的程序员之路是从 c 开始的,从业后写过关于 epon 的一个小小测试功能,当时对 otdr 划平滑曲线很好奇,于是了解了12阶窗函数等一系列东西。看那些业界很牛的算法基本上都是用 c 实现的,单纯看代码学习成本灰常大,而且不利于扩展和教学,不知道这方面我们应该如何应对呢?

另外一个小问题,开发过程中很多情况需要面向应用层编程,面向接口编程,那些高深的算法取而代之的是基础的数据结构和简单的设计模式,为了可读性采用面向对象的语言和抽象的表达方式,是否与学习算法这个宏大的话题所冲突呢?

最后,通过阅读您的资料,了解到您有制作插件的喜好,说明您偏向实用主义,请我们这些半瓶子酱油的程序员们一些务实的编程建议吧~

@王-晓华:因为C语言算是比较古老的语言了,许多已知的算法都用C也不奇怪,实际 上,很多算法最初是Fortran写的,后来翻译成C语言的。对于一些有理论支撑的算法来说,先搞懂其背后的理论要比硬啃代码好。算法和面向对象并不矛 盾,对于一个已经公认的高效算法实现,可以将其看做是一个黑盒,只需对外围的输入、输出进行适当的抽象和封装就可以重用了。最后,你说的太对了,我是个 “实用主义者”,我做的很多事情都是冲着我面对的实际问题去的,我理解算法的本质也是解决问题,这点比较一致。参加算法比赛不是我的特长,我手太慢,呵 呵,很多时候都是刚看懂题,正准备下手做,或找到模板正准备修改的时候,别人都已经提交了。如果一定要提点建议,那就是手勤快一点,多写点代码。在公司给 老板写代码,在家也给自己写点代码,解决一些自己面临的问题,够实用了吧,嘿嘿

@kimown:您好,我是一位以JS为职的前端,我想问下前端和后端的发展方向相反,编写JS给我的感觉是几乎用不到任何算法,但是算法真的很重要,疑惑:前端是不是和算法绝缘了?

@王-晓华:Hi,现在最流行的词是什么?“全栈工程师”对吧,不要把自己框在一个小范围内,前端后端后研究研究吧。我的基于layerfsd的透明文件加密软件就是从界面到驱动全做了,需要多花点时间,这是肯定的

@moya:你好,请问在处理现实问题时候,要有一个什么样的思路来应用算法?必须要经常分析并熟悉基本的算法吗?多谢。

@王-晓华:工作中遇到的大多数问题都不需要复杂的数学理论,就是应用问题,比如如何组织和管理一 个设备端口下连接的所有用户终端,首先将终端抽象成数据定义,然后想好用什么数据结构组织这些数据,最后根据数据结构选择合适的算法。如果用户需要频繁的 添加和删除终端,那就避免使用数组,如果用户需要对终端进行有序管理,那就需要排序算法,等等,自然而然地就用上各种算法了,不需要刻意 背一些算法,然后拿着算法去套问题


@西夏一品堂:今年面试了几家公司,其中每家公司都有算法笔试,最严重的一次是,笔试题就三道题,三道算法题。请问,这样的公司,他们的这个岗位工作重点是什么,为什么如此重视算法,有哪些业务需要如此依赖算

@王-晓华:他们考察的是你解决问题的能力,出算法题目是最简单直接的做法,同时还能考察你对数据结构的掌握和使用。

@bug58:哪些公司用算法比较多,像我们这种企业系统的项目极少用到什么算法

@王-晓华:真正处处都用算法的软件不多,多数公司其实需要的是程序员独立解决问题的能力,他们喜 欢考算法题目,因为这是考察一个人解决问题的简单直接的方法。有很多程序员做了多年编程,都是跟着别人做事情,缺少独立解决问题的抽象思维能力,一些小公 司需要能独挡一面的人,用算法题目可以区分出这样的人

@empireghost:感觉算法就是少部分人的技巧,现在公司都是软件工程化,大家按部就班的写代码。实际开发中很少自己写算法

@王-晓华:你对算法的理解有点狭隘,算法的本质是解决问题,能解决问题的一个过程都可以理解为一个算法。可能你写了,但是你没有意识到,人们开发软件就是为了解决各种各样的问题

资源推荐:

@leoxu:有没有能提起人们学习算法兴趣的网站,老师给推荐几个,谢谢!

@王-晓华:www.gamedev.net http://theory.stanford.edu/~amitp/GameProgramming www.gamasutra.com www.sudoku.com 俄罗斯方块游戏的算法网站 http://gforge.inria.fr/projects/mdptetris http://colinfahey.com/tetris/tetris.html

@何胜超:我想学习算法,有什么资源可以推荐的吗,大神

Cormen的《算法导论》、Knuth的《计算机程序设计艺术》、Weiss的《数 据结构与算法分析》、Levitin的《算法设计与分析基础》、Kleigberg的《算法设计》、刘汝佳等人编写的《算法艺术与信息学竞赛》,以及 《ACM国际大学生程序设计竞赛题解》,这些书应该够了

当前进行的是第 80 期高手问答 —— 使用 React Native 开发原生 App,React Native一 经推出,就获得众多开发者的关注。React Native 使得 JavaScript 能够开发真正的 APP, 它不仅有着与原生应用相媲美的体验,同时拥有着 web 应用的优势和开发效率。详情请看:http://www.oschina.net/question/865233_241314。

你可能感兴趣的:(OSC 第 79 期高手问答精彩互动汇总 —— 算法和软件的关系)