应用算法的实际情况——简单就是美

应用算法的实际情况——简单就是美

实际上,高级算法未必是最优解,古典算法有时也不错。进一步说,与知名算法相比,简单算法更好的情况也不罕见。

Hatena Bookmark的Firefox扩展的搜索功能的尝试

介绍一个Hatena中的实际例子。Hatena Bookmark中有Firefox扩展这个工具,通过它可以将Hatena Bookmark与浏览器集成,十分方便。该扩展可以针对用户以前保存过的书签数据进行增量(incremental)搜索(如图7.1所示)。

我们团队讨论了该搜索功能的实现方法,最后结果是,由于增量搜索中搜索动作发生频率很高,而且又是在客户端计算,所以计算量必须少。一些人的数据量能达到一万条以上,所以选择了Suffix Array。

Suffix Array这个数据结构主要用于文本数据等的高速查找。查找本身很快,但必须事先花费很长时间创建数据结构。而且,要让Suffix Array在应用程序中达到实用程度,如何缩短这段时间,就成了要解决的课题。当时我们采用了刚刚发现的IS方法[1]解决。

多次尝试之后,我们用Firefox扩展中唯一可用的JavaScript语言实现了IS方法,但实际结合到应用程序之后并没有达到满意的效果。尽管速度有所提高,但预处理仍然需要花费很长时间,用户添加书签时进行的预处理会给机器造成很大负担。

经过痛苦的选择之后,我们放弃了Suffix Array,而是使用Firefox扩展内部的SQLite功能,用SQL的like进行部分查找(也就是线性查找)。这会让数据量大的人搜索速度降低,但也是没办法的事,只能妥协于这种方法了。

不过,实际完成后发现,使用上完全没有任何问题。曾经担心过的几万条数据量的问题,也由于现代计算机的性能提高,查找上完全没有问题……所以就这样了。

得到的经验

从这个例子中得到的经验就是,评测和估算非常重要,并且偶尔尝试一下简单的实现也很重要。为大规模数据进行优化固然很重要,但从本例中可见,数据较少时优化没有任何意义。而且它也说明,通过人的感觉来推断数据量多少是不可靠的。

灵活应用第三方实现——CPAN等

请不要忘记,大部分常用算法都有已发布的实现,供他人使用。

以前面所说的IS方法为例,当时JavaScript上Suffix Array

并没有好的实现,所以不得不自己编写,但如果是Perl,那么CPAN上有大量各种算法的开源实现函数库,其他语言也一样。

灵活运用这一类实现,可以缩短开发时间。话虽如此,我们不建议在不了解其内容的情况下使用。必须适当了解它做了哪些操作,否则就可能做出错误的选择。

例如,CPAN上有大量压缩算法的实现。压缩也有适合不适合之分,比如对较短文件有效的算法、花费时间很长但压缩比很高的算法、压缩比较低但速度快的算法等,算法的特性各不相同。为了正确选择算法,了解一些算法知识没有坏处。在CPAN上搜索“Algorithm”的结果如图7.2所示。

相反,这些函数库的API有时无法满足我们的规格要求,

或者实现的功能过多。这时可以仅实现必要的地方,既能抑制工作量,单位成本获得的效果也更高。重点就是平衡性。

本文节选自《大规模WEB服务开发技术》一书

图书详细信息:http://www.cnblogs.com/broadview/archive/2011/08/17/2143341.html

转载于:https://www.cnblogs.com/broadview/archive/2011/09/01/2162191.html

应用算法的实际情况——简单就是美相关推荐

  1. 简单之美——系统设计黄金法则

    最近多次看到系统设计与实现的文章与讨论,再加上以前读过的其他资料以及自己的一些实践教训,让我觉得应该把这些资料汇总整理一下.如果要从讨论不同系统的众多资料中总结一条黄金法则的话,那只有一个词--&qu ...

  2. 系统设计黄金法则:简单之美

    http://blog.sciencenet.cn/blog-414166-562616.html [注:本文已发表在2012年第5期<中国计算机学会通讯>.] 最近多次看到系统设计与实现 ...

  3. 转简单之美——系统设计黄金法则

    作者: 包云岗  发布时间: 2012-05-19 13:06  阅读: 3036 次  推荐: 1   原文链接   [收藏] 最近多次看到系统设计与实现的文章与讨论,再加上以前读过的其他资料以及自 ...

  4. 【排序算法】冒泡排序、简单选择排序、直接插入排序比较和分析

    [排序算法]冒泡排序.简单选择排序.直接插入排序比较和分析 写在前面: 本文简单介绍了冒泡排序.简单选择排序.直接插入排序,并对这三种排序进行比较,入参都是80000个随机数,比较算法耗时.进一步,我 ...

  5. 简单就是美--张小龙的产品的思路

    什么才是简单--从腾讯微信说起 我相信男生都用了,女生用了也不会告诉我们.大家都用了吧?我摇到了一个TINA的三公里以外的.如果大家想加我的话可以一起摇一下,我们可以互加一下.但是深圳的同事,你们在1 ...

  6. 量化交易中VWAP/TWAP算法的基本原理和简单源码实现(C++和python)(转)

    量化交易中VWAP/TWAP算法的基本原理和简单源码实现(C++和python) 原文地址:http://blog.csdn.net/u012234115/article/details/728300 ...

  7. 《简单之美》摘录和读后感

    <简单之美>之美一书,对于软件开发的过程,在很多地方可以启迪智慧.作者通过讲述软件开发中耳熟能详的种种问题,从思想层面深刻剖析,最后还是归结到以人为本这一核心思想.以人为本不是一句空话,核 ...

  8. 数学之美系列五 -- 简单之美:布尔代数和搜索引擎的索引

    数学之美系列五 -- 简单之美:布尔代数和搜索引擎的索引 [建立一个搜索引擎大致需要做这样几件事:自动下载尽可能多的网页:建立快速有效的索引:根据相关性对网页进行公平准确的排序.我们在介绍 Googl ...

  9. [原创]linux简单之美(二)

    原文链接:linux简单之美(二) 我们在前一章中看到了如何仅仅用syscall做一些简单的事,现在我们看能不能直接调用C标准库中的函数快速做一些"复杂"的事: 1 section ...

  10. 转:ReLU激活函数:简单之美

    纯粹学习收藏. 转载地址:https://blog.csdn.net/cherrylvlei/article/details/53149381 导语 在深度神经网络中,通常使用一种叫修正线性单元(Re ...

最新文章

  1. 实训C++语言设计——Date日期系统实现
  2. 从一个前端项目实践 Git flow 的流程与参考
  3. Docker 学习笔记之二
  4. 014_CSS伪类选择器
  5. linux 内核参数 杨,Linux 内核参数
  6. win7安装laravel
  7. finally块不被执行的情况总结
  8. java jxl 写 excel文件_java采用jxl写入一个Excel文件
  9. 学习Spark——那些让你精疲力尽的坑
  10. 原版英文书籍《Linux命令行》阅读记录6 | 重定向
  11. 思科、华为远程登录配置小结
  12. 【SpringMVC笔记】Ajax 入门(jQuery.ajax)
  13. 15muduo_base库源码分析(六)
  14. Go 2提上日程,官方团队呼吁社区给新特性提案提交反馈
  15. php匿名聊天室开源,[开源项目]基于WebSocket的匿名聊天室
  16. linux百度云下载脚本,百度网盘Linux版下载
  17. 网络编程工程实训(DVB+CentOS+libpcap+分析帧格式)
  18. 他发现了古老疟疾背后的元凶,也在质疑声中开创了致病生物的新时代
  19. 【图像处理算法常用数据集】整理第二弹
  20. unity塔防游戏怪物转向_英雄塔防物语游戏下载-英雄塔防物语官方版 v2.3.8最新版...

热门文章

  1. SCOM 2012 RC 升级到 SCOM 2012 RTM 手记
  2. 取出大文件里面的一部分数据
  3. 1次订单事故,扣了我3个月绩效!
  4. 大事件!35的程序员竟然失去了面试资格,这是为什么?
  5. 偷偷告诉你,互联网公司理想的技术架构!
  6. 十年风雨!看蚂蚁金服SOFA 分布式架构演进
  7. 趣图:SQL 版的喝椰汁,没想到吧
  8. 通知:小密圈暂停服务
  9. Configure Log Shipping
  10. zen-Coding