亮网络解锁器,解锁网络数据的无限可能 了解详情
写点什么

阅读者(十七):编程珠玑,字字珠玑

  • 2011-11-21
  • 本文字数:1629 字

    阅读完需:约 5 分钟

无论你自称是“程序猿”还是“攻城师”,只要在写程序,都免不了要和算法打交道。说起算法,第一本从你的记忆中检索出的图书是什么呢?是经典的大部头《算法导论》?还是之前大红大紫的《编程之美》?以前它们几乎是同时映入我脑海的,分不清谁先谁后,这两本书我都读过,前者是在学校的算法课上,而后者则是在毕业求职前。

最近,我终于有了一个明确的答案,在这些算法相关的书籍中,最让我爱不释手的是《编程珠玑》这本薄薄的小册子,因为它真正激发起了我对学习算法的热情。不愧是培养了 James Gosling(Java 之父)、Charles Leiserson(《算法导论》作者)等众多大师的“超级大师”的传世之作。与学校里接触的“教材式”的书不同,《编程珠玑》更像是“问答式”的,抛出一个由实际问题简化而来的问题,然后一步步进行分析解答,作者将想要传达给读者的知识与技巧贯穿其中,期间还经常让人发自内心地感叹一下,原来还能这么做。

以书中第 8 章为例,我把问题简单描述为“输入一个长度为 n 的数组 x,求其中任意连续子元素相加的最大和”。最常规的思路就是写一个三层嵌套的循环,算法的执行时间为 O(n3),时间似乎有点长,做点优化,充分利用之前的计算结果,可以节省一层循环,于是得出了一个 O(n2) 的算法。如果引入“分治”的思路,将数组拆开,分别求解,然后再合并起来,这样只需O(nlogn) 的时间。别以为这样就结束了,终极方案总是出现在最后的,直接从头开始扫描数组,一次扫描得出结果(具体算法请允许我卖个关子),O(n) 时间内就能解决问题,神奇吧。千万不要以为这是专门用来教授算法知识的假想的“教学问题”,这可是源自布朗大学的 Ulf Grenander 曾经遇到过的真实问题,可见设计一个好的算法是多么重要。

在日常工作中,估计大多数人都不太有机会遇到太复杂的算法,就算遇到了,也可以侥幸依靠强大的计算和存储能力来解决问题。诚然现在的服务器计算能力越来越强,1 个内核可以抵得上从前的几个庞然大物,更何况 CPU 还是多核的,内存都按 GB 计算,但不能因为这样就认为现在算法和数据结构的重要性不如从前了。假设上文提到的问题中不是计算数组元素,而是每次循环需要操作数据库或者调用远程服务,一次操作就要耗时几毫秒,甚至是几百毫秒,那么 O(n3) 和 O(n) 的区别就显而易见了。加服务器不是唯一的解决方案,有时简单地调整算法能让你省下大把的金钱和时间。

再来说说空间的问题,节省空间似乎已经不再重要了,对某些人来说是这样,但不可否认还是存在很多场景,需要锱铢必较,仔细地设计算法和数据结构。嵌入式设备就不说了,来说说眼下流行的 Redis,为了能最大限度地使用好服务器的内存空间,减少浪费,antirez 在编写 Redis 时就煞费苦心地改良数据结构,真的是能省 1 字节算 1 字节。HDFS 和 BigTable 面向海量存储,照理说它们都是不缺空间的主,可是其中还是提供了 LZO、Snappy 等众多压缩算法,用“闲置”的 CPU 运算时间来换取更多的空间……类似的例子还有很多,所以在编写代码时,如果条件允许,请再多考虑一下自己的实现。

多数 Java 程序员应该都有 GC 调优的经历,遇到 GC 过于频繁,耗时太长的情况,通常会对 JVM 的堆配置做调整,如果调整的效果都不明显呢?来看看代码吧,也许对代码稍作修改,优化下算法,就能把陡峭的内存增长曲线将下来了。啊哈,算法!

书中还时不时地回顾下历史,比如二分搜索,相信大多数人都知道是怎么回事,可是你知道么,第一篇二分搜索的论文 1946 年就发表了,可是直到 1962 年才有人写出了第一个完全正确的二分搜索程序,太让人惊讶了,这个可是如今算法教材上的标配啊。还有那些在编码规范中经常出现的最长不要超过 80 个字符,其中 80 的由来原来和早期的打孔卡有关(如果对这个话题感兴趣,可以阅读阮一峰的这篇文章)。

薄薄的《编程珠玑》,两百多页捧在手上完全没有板砖的压力,可以将其作为教材以外的辅助读物,工具书以外的休闲读物,亦或者是和我一样,将其作为睡前读物,每晚睡前读上几页,和算法聊上几句,和数据结构打个招呼。

2011-11-21 08:297411
用户头像

发布了 135 篇内容, 共 58.8 次阅读, 收获喜欢 43 次。

关注

评论

发布
暂无评论
发现更多内容

AI for Good | 从女性力量,到AI公平

澳鹏Appen

人工智能

API 网关日志的价值,你了解多少?

API7.ai 技术团队

实践,制作一个高扩展、可视化低代码前端,详实、完整

悠闲的水

前端 低代码 前端框架 低代码开发 低代码平台

一文搞懂面试官常问的:SpringBoot自动配置原理

做梦都在改BUG

Java Spring Boot 自动装配

电商 SaaS 全渠道实时数据中台最佳实践

Apache Flink

大数据 flink 实时计算

企业内部即时通讯软件,提供安全的组织管理和办公协作方式

WorkPlus

如何开发基于电报的TRX交易机器人?源码曝光

加密先生

彻底搞懂贝叶斯的本质

侠之大者

机器学习 贝叶斯公式 概率论

数据资产与勒索病毒之间,华为立起一张安全盾牌

脑极体

安全

WorkPlus|可定制、可扩展的私有化即时通讯办公平台

WorkPlus

适配PyTorch FX,OneFlow让量化感知训练更简单

OneFlow

人工智能 深度学习

周六直播|StarRocks 参与数据湖架构峰会,揭秘最新湖仓分析新范式!

StarRocks

数据库 大数据

CleanMyMac X4.20免费版Mac系统垃圾清理工具

茶色酒

CleanMyMac X

终于说有人清楚了BI仪表板和大屏的区别

搞大屏的小北

数据分析 数据可视化 数据大屏 仪表板 可视化展示

OpenAI竞争对手Anthropic融资:1融资易估值难2背后谷歌云3侧重安全

B Impact

从新手小白到运维大咖,SysOM 多场景宕机实例解析 | 龙蜥技术

OpenAnolis小助手

运维 操作系统 服务器 龙蜥技术 SysOM

150行代码创建一个多签钱包,智能合约实战项目

加密先生

智能合约 DAPP智能合约交易系统开发 多签钱包

云计算之-弹性伸缩

天翼云开发者社区

一图读懂《2023 年全球互联网通信云行业研究报告》

融云 RongCloud

互联网 通讯 图片资源

模块八作业

张贺

架构训练营

电商平台的商品价格管理的产品设计

产品海豚湾

产品设计 SaaS 商品管理 电商 产品分析

Swift 里 的 Struct 和 Class

刿刀

前端开发框架React技术如何与小程序结合,进行页面构建

兴科Sinco

小程序 taro 前端开发 前端框架 React Native

【深度挖掘RocketMQ底层源码】「底层问题分析系列」深度挖掘RocketMQ底层那些导致消息丢失的汇总盘点透析([REJECTREQUEST]system busy, start flow control for a while)

洛神灬殇

RocketMQ OOM 消息队列 3月日更

虚拟主机和云服务器的区别

天翼云开发者社区

「中华田园敏捷开发」,是老板无能还是程序员无力?

引迈信息

前端 敏捷开发 后端 低代码

微服务为什么要用到 API 网关?

API7.ai 技术团队

让AI上车,车企如何借势2023上海国际车展硬核出圈

Geek_2d6073

ListView Item多布局的实现

智趣匠

ListView item QQ界面

全国首个算力互联互通验证平台发布,天翼云推动算力智能调度再提速

天翼云开发者社区

研发提效利器:聊聊mock服务化

老张

Mockito 服务化 Mock

阅读者(十七):编程珠玑,字字珠玑_Book Review_丁雪丰_InfoQ精选文章