看算法导论有感(1)——谈谈算法的五性对用户体验的影响

简介:

做程序的人,都知道了算法的5性——可行性,健壮性,有穷性,高效性,可读性。

这15个字谁都会说了,但是,你是否真正的思考过这个对当今程序界最最重要的用户体验的思考。

过去,我也没多做思考,但是,看了mit的算法导论公开课,我却是觉得一个好的算法, 确实严格遵从算法算法五性。

①可行性——算法原则上能够精确地运行,而且人们用笔和纸做有限次运算后即可完成。算法肯定要可行的,不可行的话,是一坨shit,一般可行性是与硬件息息相关。比如,10年前,你要先像现在的搜索引擎一样能够做视搜索,做各种各样的算法搜索。那时候,不是算法可行的,而是硬件而达不到要求。再比如所说,我们经常写出许多算法都是就会出现这个问题——数据溢出的问题。这也是一般硬件的问题,如果计算机是位数足够的大,程序一般不会出现这样的问题。 那你写一个连可行性都不可行的算法的话,那这样就无用户体验而言了。

②健壮性——就是算法要有足够健壮的,这个性质与一个安全性息息相关了。一个好的程序的好的健壮性,就是你的程序怎么搞就搞不死了。这难道不是与程序的安全的骨肉相随吗?尤其,到了21世纪以后,一个个程序安全尤其重要了。我们看以下案例。(1)2011年,花旗银行披露其北美地区银行网站在5月初受到黑客恶意攻击,21万北美地区银行卡用户的姓名、账户、电子邮箱等信息可能被泄露。(2)2003年的冲击波病毒,2005年的qq尾巴病毒,2007年的熊猫烧香病毒。近这些年,病毒的肆掠。 (3)在公司中,上班打卡一般难不倒我们这些程序员们,主要,我们可以进数据库中篡改我们的上班时间。这些活生生血粼粼的例子,就是因为算法的健壮性做的很不好了。如果,你的健壮性足够强,那真的不会出现这样的事情了。 至于碰到健壮性不够的程序的话,你会不会敢用一个连安全性都不能保证的,你敢使用吗?一个全部使电脑病毒的操作系统,你愿意使用吗?这样也能够看到健壮性与用户体验息息相关。

③有穷性——有穷性(有限性)。任何一种提出的解题方法都是在有限的操作步骤内可以完成的,“哪怕是失败的解题方法。”我们这些初学者写算法与有穷性最背道而驰——就是死循环。死循环存在的意义就是让程序永不停息的计算,然而有得不到我们最终所要的结果。这真是“瞎子点灯白费蜡”。如果一个程序是无穷的,用户只有没办法的白等,最终也只有干瞪眼。这样就会把用户逼疯,这样的程序绝对没有回头客。

④高效性——就是程序运算足够的快了,这与硬件,软件都有蛮密切的关系。与硬件的关系,我们就没有必要再说了,但是,与算法的关系。有必要说一说,同样问题,不同的算法当然实现的效率大相径庭了。比如说,我当年做实习生的时候,完成一个几千万人都是登录的问题时候,效率极其地下了。但是我们的老大(技术总监)——使用了一种常用数据结构链表,将其连起来,比较其中的位数大小的方法,这样,程序就如飞一般的感觉,非常的稳定。即使一个简单的排序,有的人可以做出时间的复杂度是O(n㏒n),有的只人能做出时间复杂度是O(n2),小数据没有多少差别,但是面对海量数据的时候,却又天壤之别。一个高效程序与一个低效程序,用户体验不用自明吧。

⑤可读性——就是源代码可读,意思明了,朗朗上口。这主要是针对于我们这些苦逼的开发人员而言了。做了软件的人都应该明白软件开发的人员都应该明白软件的主旋律就是——变。客户需求,就如小孩子脸说变就变。而软件的升级不断进行,这一定要在原先的源代码上的基础上不断的进行了。但是,你要知道,一个好的算法,必要有一个好的可读性,这样才能不断而且快速满足客户的需求,不断而快速的升级。可读性对一个好的用户体验也必不可少。否则,算法犹如天书,这样会严重影响开发效率,这样的程序鬼才要。

总之,良好用户体验的算法——必须有一个十足的可行性,足够的健壮性,并且是有穷的,性能其高的,并且对开发人员意思明了。

目录
相关文章
|
8月前
|
算法
算法导论(第三版)具体算法解析与理解
算法导论(第三版)具体算法解析与理解
|
机器学习/深度学习 自然语言处理 算法
『算法导论』什么是算法?什么是程序?
算法(Algorithm)是指解决问题的方法或过程,它包含一系列步骤,用来将 输入数据转换成输出结果 算法具有以下性质: • 输入:有零个或多个输入 • 输出:至少有一个输出 • 确定性:组成算法的每条指令清晰、无歧义 • 有限性:算法中每条指令的执行次数有限,执行每条指令的时间也有限
564 0
|
存储 机器学习/深度学习 人工智能
【算法导论】第2章 算法基础
【算法导论】第2章 算法基础习题
148 0
【算法导论】第2章 算法基础
|
存储 算法
算法导论——基本的图算法
  对于图G=(V,E),V代表点,E代表边。图有两种标准的表示方法:邻接矩阵法和邻接链表法。   邻接链表法适合表示边的条数少的稀疏图,可以节约存储空间。对于有向图G来说,边(u,v)一定会出现在链表Adj[u]中,因此,所有链表的长度之和一定等于|E|。
1697 0
|
算法
算法导论——贪心算法
贪心算法(greedy algorithm)是指,在每一步都做出当时看起来最佳的选择,也就是局部最优的选择,期望这样的选择能够导向全局最优解。所以并不是所有的问题都能得到全局最优解。          典型的例子如分数背包问题:背包容量为50kg,有三个商品分别是重60元/10kg、100元/20kg、120元/30kg,商品可以分割,如何选取商品使背包价值最大。
1447 0
|
存储 算法
重读算法导论之算法基础
重读算法导论之算法基础 插入排序 ​ 对于少量数据的一种有效算法。原理: 整个过程中将数组中的元素分为两部分,已排序部分A和未排序部分B 插入过程中,从未排序部分B取一个值插入已排序的部分A 插入的过程采用的方式为: 依次从A中下标最大的元素开始和B中取出的元素进行对比,如果此时该元素与B中取...
1026 0
|
算法 Python 机器学习/深度学习
|
机器学习/深度学习 搜索推荐 算法
【算法导论】排序算法总结
排序算法总结         从六月初开始看算法导论,陆陆续续看了有2个月了,但实际看的时间只有半个月左右。这期间都忙着找导师、期末考试,同时还回家修养了十来天。
1236 0
|
算法 安全
算法导论——课程简介及算法分析
1.学习算法主要是性能的需要,必要时牺牲性能以确保安全等。 2.用$符号表示例子(such that) . 3.直接插入排序;插入排序分为直接插入排序(最坏情况是逆序)和折半插入排序。 public void InsertionSort(int[] arr) { for (int i = 1; i < arr.
835 0