编程珠玑,字字珠玑

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

 

最近,我终于有了一个明确的答案,在这些算法相关的书籍中,最让我爱不释手的是《编程珠玑》这本薄薄的小册子,因为它真正激发起了我对学习算法的热 情。不愧是培养了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的由来原来和早期的打孔卡有关(如果对这个话题感兴趣,可以阅读阮一峰的这篇文章 )。

 

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

 

 

P.S.之前一篇文章说了要把一些自己原创发表在InfoQ上的内容放到自己的博客里,这就是第一篇 。

[首发于InfoQ中文站:http://www.infoq.com/cn/news/2011/11/programming-pearls ]

中兴U30air随身WiFi刷机全攻略:从ABD开启到系统调试(附工具包) 本文提供中兴U30air随身WiFi刷机全攻略,从ADB开启到系统调试的详细步骤,包括必备工具清单、ADB调试模式解锁、Bootloader解锁及自定义ROM刷入与调优。适合技术爱好者深度定制设备,提升网络性能和功能扩展。 阅读详情

相关推荐

OCTF2016--piapiapia

知识点: php反序列化长度变化尾部字符串逃逸 目录扫描发现www.zip,下载得到源码 源码有index.php,输入账号密码后会进入profile.php,还有register.php、updata.php、class.php和config.php flag值在config.php中,想办法访问到其内容 通过seay代码审计找到一点线索 看到profile.php中存在任意文件读取漏洞,前面还有反序列化 现在我们有个大体思路了,update.php中有一个$prof..

Oavinci的博客 474

《编程珠玑》---笔记。浏览此文,一窥此书。

第一章: 磁盘排序:对于一个提出的问题,不要未经思考就直接给出答案。要先深入研究问题,搞清楚这个问题的特点,根据这个特点,可能有更好的解决方案。   比如:文中:最初的需求只是“我如何对磁盘文件排序”。 我们首先想到了经典的归并排序。 但,进一步了解到排序的内容是10000000个记录,每条记录都是一个7位整数,且只有1M可用的内存。每条记录不相同。   【位示图法,详见我的关于排序

菜鸟的自留地-mooyang 1万+

模糊控制——基本原理(附MATLAB程序)

模糊化:使用隶属函数将实际输入转换为模糊集合的隶属度值。规则库:利用“如果-那么”规则将模糊输入映射到模糊输出。推理机制:通过规则的模糊化和模糊集合的合成,生成模糊输出。去模糊化:将模糊输出转换为具体的控制信号,常用的方法包括质心法和最大隶属度法。这些步骤综合起来,实现了模糊控制系统对复杂和不确定系统的有效控制。模糊控制系统通过结合模糊逻辑和规则库来处理复杂系统中的不确定性和模糊性。它的核心在于模糊集合和隶属函数,通过推理机处理模糊规则,并最终通过去模糊化生成具体的控制信号。

qq_35623594的博客 5559

《编程珠玑》——读书笔记1

前言 今天来读读《编程珠玑》,预计未来若干个月会有一系列博客记录《编程珠玑》的读书笔记。 读书笔记 第一章是本书的开篇,主要讲述了如何解决这么两个问题: 一. 如何对实际问题进行抽象,找出问题的独特性质。 很多低级的程序员,一上来就使用普适性的方法来解决问题,而不去认真学习实际问题的性质。具体来说,实际问题的特性包括:输入数据的特征,内存的特征,运行时间的限制,问题本身的特征。 根...

jmhIcoding 746

STM32以太网通信-STM32以太网外设(ETH)

通过 DMA 控制器进行介质访问控制 (MAC) STM32F4xx系列控制器内部集成了一个以太网外设,它实际上是一个通过DMA控制器进行介质访问控制(MAC),它的功能就是实现MAC 层的任务。 借助以太网外设,STM32F4xx 控制器可以通过ETH 外设按照IEEE 802.3-2002 标准发送和接收MAC 数据包。 ETH 内部自带专用的DMA 控制器用于MAC,ETH 支持两个工业标准接口介质独立接口(MII)和简化介质独立接口(RMII)用于与外部PHY 芯片连接。MII 和RMII 接口用于

暖暖_的_纠结的博客 2万+

世界坐标系/相机坐标系/图像坐标系 转换

目录一、各坐标系简要介绍二、坐标系转换2.1 世界坐标系转为相机坐标系2.2 相机坐标系转为物理图像坐标系2.3 物理图像坐标系转为图像坐标系2.4 总结2.5 为什么要使用齐次坐标参考文献 一、各坐标系简要介绍 首先介绍数字图像处理领域中的图像坐标系,如上图左图所示,坐标系O_0为图像坐标系,其原点是在图像的左上角,每一个像素通过其所在位置的列数和行数索引 (u,v) 来表示。 另外需要建立图像坐标与物理单位的关系,而后才能将目标的真实世界坐标转换为图像坐标。即建立以物理单位表示的物理图像坐标系(有些文

流觞时光 1万+

读《编程珠玑》有感

书很薄,内容虽然数据结构算法书上都有,但是讲得更深入,也更加贴近实用。书中的技术偏向于做大规模数据处理,高效率编程之类的。 书的内容虽然不错。但是书后的习题,真是让人煎熬,有的题出出来都不知道它想干嘛,是不是我老了啊?看不懂,奇怪了? 还有中文版翻译比较拗口,一句简单的话翻译得惨不忍睹,就不举例子了。粗略看了一遍之后真的想骂人!!!! 但总体说来是本好书吧,面搜索公司必看。 哎!习题大部分...

weixin_30677475的博客 395

ZYNQ PL通过EMIO ETHE1外接PHY由GMII转RGMII

1,设置EMIO方式引出ETHE1 2,从GMII过度到RGMII GMII: 发送 gmii_tx_clk gmii_tx_d[7:0] gmii_tx_en gmii_tx_er 接收 gmii_rx_clk gmii_rx_d[7:0] gmii_rx_dv gmii_rx_er RGMII: 发送 tx_clk tx_d[3:0] tx_ctrl 接收 rx_clk rx_d[3:0] rx_ctrl 首先数据总线从时钟单边沿采样8bit转变为了双边沿采样4bit,从88E1

wangjie36的博客 1万+

编程珠玑有感!

乔恩,宾利老爷子的神书,我在刷leedcode过程中突然发现,二分查找,二分搜索树之类的东西很牛逼-------使用太多了。于是好好学习,偶然看到编程珠玑,在书堆中找出了编程珠玑。看了一下深以为然!老爷子的水平实在是高,程序验证这门研究生的课,也被他单独列了出来,二分查找更是第一章列出。爱不释手,要深入研读这本书。开篇问题 :磁盘文件排序? 文件最多包含1千万条记录,没条记录都是7位的整数。

fly_best的专栏 681

【专栏导引贴】100+智能优化算法:从背景原理到代码实战(持续更新)

本专栏系统整理100+种现代优化算法,涵盖粒子群优化(PSO)、遗传算法(GA)、鲸鱼优化(WOA)等经典方法,以及白鲸优化(BWO)、非洲秃鹫优化(AVOA)等新兴算法。每篇详解包含生物启发原理、数学模型、代码实现及工程应用,采用统一编程风格,提供可直接运行的实例代码。专栏持续更新,旨在为研究者提供系统化的智能优化算法参考资料,实现从理论到实践的完整知识链。目前已收录23种算法,包括蚁群系统(ACS)、蝙蝠算法(BA)、天牛须搜索(BAS)等自然启发式优化方法。

qq_42212808的博客 3662

【深度学习新浪潮】Nano Banana(Gemini 2.5 Flash Image)技术解析与开发者实操指南

重新定义了 AI 图像生成的产业标准。它不仅是“平民化的视觉工厂”,更是推动内容生产从“创意试错”转向“精准制造”的关键工具。未来,随着视频生成能力的加入(谷歌计划支持“文字指令 - 动态场景 - 多平台适配”全流程),Nano Banana 有望进一步颠覆影视、广告等领域的创作范式。:批量生成多场景图,模特姿态自然,服装褶皱和材质细节高度一致,节省 90% 拍摄成本。模型的非正式代号,是一款革命性的 AI 图像生成与编辑工具,主打。:生成细节丰富的厨师特写,光影自然,皮肤纹理和刀具反光逼真。

专注:太空算力、AI infra、异构调度、大模型成本工程 894

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

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

cpongo5 191

手把手教你学Simulink--基于光伏(PV)系统的建模与仿真场景:-不同天气条件下光伏系统的输出性能分析

本文介绍了使用Simulink和Simscape Electrical工具箱进行光伏系统建模与仿真的完整流程。内容涵盖准备工作、模型构建、仿真分析三大步骤,重点演示了如何模拟不同天气条件(光照强度、温度变化)对光伏输出性能的影响。通过添加PVArray模块、配置参数、设置环境变化条件、连接测量仪器等操作,实现了光伏系统在动态天气条件下的输出特性分析。文章还提供了仿真参数设置建议和结果分析方法,帮助用户理解环境因素与光伏性能的关联性,为光伏系统设计和优化提供参考。

MHD0815的博客 189

《编程珠玑,字字珠玑》读书笔记完结篇——AVL树

写在最前面的 手贱翻开了《珠玑》的最后几章,所以这一篇更多是关于13、14、15章的内容。这篇文章的主要内容是“AVL树”,即平衡树,比红黑树低一个等次。捣乱真惹不起红黑树,情况很复杂;而AVL思路比较清晰。《编程珠玑,字字珠玑》910读书笔记——代码优化更新了,做了点关于“哨兵”的笔记。在这篇文章的末尾,笔者还加了对引用调用的“大彻大悟”。 4篇读书笔...

weixin_34346099的博客 93

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Spring Boot街道办管理系统实战:从数据库设计到权限鉴权与部署排坑

在政务数字化转型的背景下,基层管理系统的建设往往面临业务场景复杂、流程追踪难、权限管控弱等挑战。Spring Boot作为Java后端的主流框架,以其自动装配和快速开发特性,成为构建此类系统的首选。结合MyBatis Plus简化单表CRUD操作,配合Vue与Element UI实现前后端分离,MySQL存储核心数据,能够高效落地一套涵盖居民信息、工单流转、网格管理、RBAC权限控制的完整解决方案。数据库设计上遵循业务主线和通用字段约定,后端通过分层结构、统一响应、状态机与乐观锁保障代码质量与数据一致性。实

weixin_34354945的博客 144

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

【送书福利】编程大师近40年前的两本书,今天看来仍然是字字珠玑

关注我们丨文末赠书珍珠是一种古老的宝石,它们产于珍珠贝类和珠母贝类软体动物体内,经过贝类长时间分泌物质包裹外来颗粒聚合,最终形成一颗颗具有不同光泽、不同形状美丽的珍珠。在计算机领域中,有那么一些经典思想或者图书,也像珍珠一样,经过多年的磨砺,慢慢成为被所有人认可并追随的璀璨经典。小异认为,乔恩·本特利和他的编程思想,还有作品“编程珠玑”系列就把这些表现得淋漓尽致。▲ 畅销三十多年的经典《编程珠玑》...

程序IT圈 286

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

关于编程与数学的名言金句——字字珠玑

在终极的分析中,一切知识都是历史;在抽象的意义下,一切科学都是数学; 在理性的基础上,所有的判断都是统计学。编程中最没用的东西是源代码,最有用的东西是算法和数据结构

白马负金羁 1万+

《编程珠玑,字字珠玑》1234读书笔记——多路归并排序

写在前面的 2012年3月25日买下《编程珠玑》,很期待但不知道它能给我带来什么!编程珠玑,字字珠玑。但是翻译有点拗口,有时候整句话读下来都不知道在讲什么,多少有点掩饰了珠玑的魅力,真怀疑是不是直接有道翻译了。 位图数据结构法 在“开篇”的里,讲述了排序的一个问题,大意就是,对一个“最多占n位的(就是n位的整数),随机的,无重复的(互异无序)”的整数序列进行排序,那么这个序列的总...

weixin_30588675的博客 122

《编程珠玑,字字珠玑》45678读书笔记——编程技巧

写在最前面的 就像上一篇文章说的,“编程永远是后话”!在有了可靠的问题分析过程和数据结构的选择,能正确运行的“二分搜索”代码出现之前,把其主要的思路先在草稿上实现,即伪代码。但由于伪代码执行结果的不确定性,需要有一个验证的过程。笔者非常不喜欢这个过程,因为这个过程很繁琐,而且推出的结论不一定是正确的(毕竟没有实实在在在机器上运行得到正确的结果),在笔者...

weixin_34123613的博客 84
上一篇: 我有一个梦想
下一篇: 编程珠玑,字字珠玑
dingx
博客等级 码龄24年 67粉丝 112原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值