代码改变世界

算法还重要吗?

2010-09-19 16:42  chenkai  阅读(12237)  评论(55编辑  收藏  举报

算法还重要吗?

我为什么要问这个问题呢?其实这最近一周时间都在看算法在数据挖掘和存储处理性能上运用. 当然这也引起我个人的一些对算法的思考.正好昨天晚上看到张洋同学算法杂货铺——分类算法之贝叶斯网络(Bayesian networks)一篇文章.更是激发我要去写这篇文章,躺在床上一直在想这个问题怎么能清楚的说出来. 也许你看到这个标题 你也工作了几年 回过头在来看这个问题 也许一时间会感到疑惑. 算法还重要吗? 

<1>什么是算法?

我们先不要给算法是否还重要就轻易下了一个结论. 到这我也先不着急给算法下定义做解释. 我们现在先来看看一种现象:  哪种语言是开发者们可以高高兴兴的用来编程的?近日,一位美国的开发者通过Twitter对开发者们进行了一项调查 :你是否喜爱XX语言 调查结果分析图:

200904141721242268511421

 

 

 

 

 

 

 

 

 

 

基本上每个月都会有一些相关对语言使用程度做了一个排名. 大家业见怪不怪了. 编程语言又能体现出算法相关价值,也许你会好几种语言, 但随着工作时间增加和对技术深入研究你会发现:  不是具体的技术而是算法这些基本的东西成为了技术深入的软肋, 特别是在紧要关口 这个软肋往往就会更疼.

起码我认为自己目前工作创造性东西比以前少了很多.  很多算法已经被包装到了语言和工具中, 作为一个开发者也就不想以前那样费力去学习. 而往往有些算法只适用于本语言或工具而且只能解决某些问题,移植到别的情况下则无法使用, 这也是我在开始学习Ruby后才感到算法适用范围有所不同. 最为别扭的是你发现以前在用Asp.NET和Visua4l Studio开发工具中对于有些问题已经界定好思路. 人都是懒惰 既然有现成的东西不用 为何要费力去创新.  这也就导致长期适用单一编程开发者视野上狭隘.  开发者很难有属于自己的思维方式. 这就是为什么有些人说自己做到一定程度后成了熟练“代码工人”也不难解释. 起码这个问题让我感到很悲哀.

Ruby之父松本行弘[日本同行]就曾表示,注重的是算法而不是工具, 如果没有自己的思维方式和编程逻辑,很容易对某种具体的技术或者工具产生依赖性, 而这些编程工具和技术往往是国外开发. 假设有一天我们没有这些现成的工具 和技术  我们该怎么办? 岂不是成了一穷二白了吗?但是如果有了稳固的算法思维 编程世界里东西都不可怕.

算法是一种本质的回归.

今天出了JAVA 明天出了一个C#. 后天还不知道要出了一个什么 XXX¥¥语言和新技术. 于是乎你也成了那赶潮大军中一员 一路疲惫被人牵着鼻子走,  到头来你发现越深入步伐走得越慢. 越是吃力.往往技术了解得越多、做得东西越深,这样的体会越明显, 借用一位网友的话说就是"内功”不到位. C# java Ruby 只是两个你用来练习武功的招式, “内功”则是这些花哨武功招式后本质, 招式可以很多种  如果没有 ”内功” 招式变换再多也只是表面文章 罢了. 注定你是成不了一个名副其实的”武林高手”

看完了这个现象后 在回头来说算法定义. 算法(Algorithm)说白了就是是解决问题的步骤.可以把算法定义成解决一个分类问题的任意一种特殊的方法. 

编程世界中 算法+数据结构=程序.

而数据结构往往是封装在不同编程语言中. 求解一个给定的可计算或可解的问题,不同的人可以编写出不同的程序,来解决同一个问题,这里存在两个问题:一是与计算方法密切相关的算法问题;二是程序设计的技术问题。算法和程序之间存在密切的关系的. 

<2>算法还重要吗?

 算法还重要吗? 我为什么要加一个“还”来形容这个问题.  上周在网上论坛有一个网友曾说过”现在数据存储技术和计算机运算速度已经是很快了 这也是将来一个趋势 算法还重要?”这突然引起我对算法重要性的兴趣,当然我也默默问自己这个问题.

其实也许我们忽略一个问题. 从去年到今年就拿我们行业里一个非常小地方来看看目前我们要面对问题: 就说说Twitter从2008年开始到现在每月要处理发送数据信息量 统计图:

0051090

 

 

 

 

 

 

 

 

 

 

 

 

美国调研公司Royal Pingdom最新统计报告表明,目前Twitter的每月平均信息发送量正以超过10亿的速度快速增长.

天那小小的一个社交SNS社交站点从2008到现在短短两年时间 数据量增长基本是以数量级的方式来增加.这只是目前行业一个小角落. 可想而知未来信息量更会以爆炸方式增长. 而要解决这些问题我们不仅不需要好的设备. 好的技术 更 需要很多卓越的算法来解决这些问题.

说了这么多 下面说一个简单例子.例如在ArcGis地里空间信息系统中 常常会处理一个关于到导航的小问题. 问题很简单:   你想从地图的任意的A点城市 到达任意的B点城市 列出最快的达到路线 并计算最省钱的行进方式:2010-09-19_154646

 

 

 

 

 

 

 

 

 

系统设计中: 如果一下子把全国所有上亿条道路信息依次进行逐条比对在进行计算. 反映时间太长. 如果给多个用户 服务器的压力就太大了 基本立马崩溃掉.如果我们需要设计一个算法:

首先从全国道路信息数据库中 调出 从任意A点到任意B点所要经历省市的道路信息数据.  这就剔除一大部分没用数据信息. 缩小了我们数据检索的范围.

这样的话还是不行. 访问压力依然存在. 这时我们可以把数据按照省市进行分区.处理.  用户输入数据后从任意的A点到任意的B点首先确认 是否A点到B点是否在同一个区 如果同一个区 直接在数据库中这个区域内调取数据进行计算. 至于距离最近路线算法中图论中有很好解释 .

这时问题又来: 西北和沿海地区发展速度不一. 道路信息数据沿海城市偏大 用户量偏多 出行需求量高. 西北地区道路偏少  人口稀缺 远距离出行量少等特点 再次优化算法。

对核心沿海需求量居多城市和省份 区域数据再次进行分区处理. 最顶层的是省份 下级市区 再到县级.
方便用户点对点精确搜索和距离计算. 如果底层访问量较小 类似树形结构 向上可以延展放大搜索范围.

上面大概满足基本需求. 如果用户提出不同交通方式 乘车/飞行/水路 而且道路也分为高速 国道 省道. 航线非为国际和区域航线. 这样的话我们计算距离的算法就需要更加细化了. 从上面实例可以看到用户需求总是不断变化的. 一个好的算法是解决复杂问题核心关键. 可见算法在将来解决数据处理依然是不可替代的.

有人又会问.为什么我日常工作中很少用到算法? 

<3>算法适用范围?

 很多人疑惑我的日常编程中很少用到算法. 我个人认为,好的算法是每个程序都应该尽力去实现的, 也许一个程序百分之90以上被项目UI和实现业务逻辑给占据了. 但是总是有那么一部分决定你的产品核心竞争力.

为什么你没有用到算法?

人们之所以说算法很重要,是因为任何的程序,任何的软件,都是由很多的算法和数据结构组成的。从这点上说算法确实很重要,但是这不意味着算法对于每个软件设计人员的实际工作都是很重要的。其实,软件行业是可以分为算法密集型典型的比如一个搜索引擎 Cache底层,/三维场景中实时渲染算法.例如Google。每天Google的网站要处理十亿个以上的搜索,GMail要储存几千万用户的2G邮箱, Google Earth要让数十万用户同时在整个地球上遨游,并将合适的图片经过互联网提交给每个用户。如果没有好的算法,这些应用都无法成为现实

业务逻辑密集型,典型的比如一个CRM/ERP业务系统 项目中我们把更多的时间放到业务逻辑的实现和UI层数据呈现上 至于算法使用只有在性能受到限制或是出现性能访问瓶颈时加以算法优化。 这通常的情况,而对于基于运用实际问题 往往面临问题较多  使用算法地方也就相对偏多.

使用体验密集型,典型的比如娱乐行业Silverlight站点 注重的使用用户体验上快捷。所以并不是每个软件开发者都要求有很好的算法功底。关键是看遇到问题解决问题的能力,算法在一定程度积累思维模式上经验.。这也是很多程序员说自己到了 30岁 在技术上创新陷入瓶颈.

每个项目特点和需求特殊也导致算法运用场景上不同. 有人说过算法重要,但不是最重要 这句话在某些特定运用场合时可以讲得通的 得灵活使用  

<4>最后

最后至于这个问题 算法还重要吗?无论IT行业内多么朝夕莫测、新技术 新语言层出不穷,计算机和软件发展背后的根基却岿然屹立、经年不变,算法便是基础之一. 而对于那些已经历经技术变幻开发者而言算法同是也是一种本质的回归.

无觅相关文章插件,快速提升流量