编程珠玑,字字珠玑

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

 

最近,我终于有了一个明确的答案,在这些算法相关的书籍中,最让我爱不释手的是《编程珠玑》这本薄薄的小册子,因为它真正激发起了我对学习算法的热 情。不愧是培养了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 ]

基于若依的ruoyi-nbcio-plus支持VForm3表单字段数据保存到数据库的一种方法——全网首创(三) 阅读详情

相关推荐

耕地质量评价软件实操指南:如何用Excel+ArcGIS一键生成土壤普查报告(附避坑技巧)

本文提供了一套融合Excel数据处理与ArcGIS空间分析的耕地质量评价实战工作流。详细讲解了从数据规范化预处理、高效数据桥接,到在ArcGIS中实现指标评分、综合指数计算与等级划分的全流程,旨在帮助土壤普查工作者大幅提升报告生成效率与准确性,并分享了关键的避坑技巧。

weixin_28455801的博客 492

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

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

菜鸟的自留地-mooyang 1万+

手把手教你理解特斯拉Model 3的域控制器架构:RBCM如何成为“多面手”?

本文深入解析特斯拉Model 3的域控制器架构,重点介绍右车身域控制器(RBCM)如何整合车身电子系统功能。RBCM作为多任务处理中枢,管理空调系统、尾部电气设备和超声波雷达等关键功能,展现了特斯拉在汽车电子架构上的创新设计。文章详细探讨了RBCM的硬件架构、功能版图及信号网络,揭示其如何通过高性能MCU和智能开关技术实现功能集中与效率提升。

weixin_30919429的博客 384

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

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

jmhIcoding 746

高频面波成像实战:从频散曲线到全波形反演

面波勘探是近地表工程勘察的重要手段,其核心原理在于不同频率的面波对地下介质的敏感深度不同,由此形成的频散曲线能够反映浅层剪切波速结构。相较于传统钻探与折射波法,高频面波成像具有无损、高效、对低速夹层敏感等优势,广泛应用于路基检测、空洞探测、滑坡调查等领域。在实际工程中,从野外采集的排列设计、震源选型,到频散谱提取与频散曲线反演,每一步都直接影响成像精度。然而频散反演受限于一维层状假设,难以刻画横向剧烈变化的地质体。全波形反演通过拟合完整波形信息,能够突破频散曲线的分辨率边界,获得更精细的近地表速度模型。本文

weixin_29090917的博客 270

emwin与Modbus通信结合:项目实例

通过实际项目讲解emwin界面设计与Modbus通信协议的融合应用,深入剖析数据交互流程。掌握emwin在工业控制场景中的实用技巧,提升系统人机交互与稳定通信能力。

weixin_34618526的博客 483

读《编程珠玑》有感

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

weixin_30677475的博客 395

稳定双共轭梯度法BiCGSTAB流程

稳定双共轭梯度法BiCGSTAB流程

abner361的博客 1154

编程珠玑有感!

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

fly_best的专栏 681

【ROS机器人系统】自主导航+YOLO目标检测+语音播报

完成自主导航功能,并在小车移动至指定地点的过程中,通过机器人的摄像头检测导航途中所见物体,识别出物体的种类(框选出不同物体并标注识别结果),结合科大讯飞语音合成模块对识别结果进行语音播报。..............................

南京大学软件工程硕士在读 2万+

华为OD机考双机位C卷 - 员工派遣 (Java & Python& JS & C/C++ & GO )

华为OD机考双机位C卷 - 员工派遣 (OD上机考试双机位C卷)。提供在线OJ刷题。Java、C++、Python、GO语言、C语言、JavaScript题解,并提供完整思路讲解。

算法大师! 1035

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

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

cpongo5 191

实战交易策略 篇二十二:情绪流龙头交易策略

在股票市场中,机构主导趋势,游资驱动热点,散户易被情绪裹挟,形成“金字塔”式生态链,并存在情绪传递、强者恒强、物极必反的规律特点。股市是资金驱动的情绪博弈场,价格波动由群体心理、资金博弈和预期差共同驱动,核心是资本逐利性与人性贪婪恐惧的交织,兼具资源配置、财富再分配与风险定价功能。涨停加速与逃逸缺口(主升强化)凹字板/平台突破(趋势延续)天量弱转强(分歧买点)不参与首波(二波策略)情绪周期(道术合一)主线思维(聚焦核心)开盘抢筹(竞价博弈)一字助攻(情绪强化)分批进出(滚动操作)

生活在别处 1500

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

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

weixin_34346099的博客 93

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

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

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

weixin_34354945的博客 144

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

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

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

程序IT圈 286

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

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

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

白马负金羁 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、付费专栏及课程。

余额充值