摘要: 问题来自于《程序员面试宝典(第三版)》第12.2节面试例题9,主要是结合原书代码和解析,讨论malloc(0)的行为,对原书没说清的地方进行补充。 阅读全文
posted @ 2013-07-27 16:07 五岳 阅读(20809) 评论(15) 推荐(4) 编辑
摘要: 对于《编程之美》4.5磁带文件存放优化一般情况的最优解给与证明,并发掘解法与选择排序的关系。 阅读全文
posted @ 2013-07-25 15:28 五岳 阅读(2102) 评论(2) 推荐(2) 编辑
摘要: 本文来自于《编程之美》4.3节买票找零问题的启发,和网络上多如牛毛的介绍卡特兰数的文章不同,本文的主要目的不是向读者再一次介绍它的性质和应用,也不是相关内容的简单复制粘贴拼凑,而是一个完整的体系,帮助读者跨越《编程之美》留下的陷阱,找寻一般化的卡特兰数,从而解决更一般的问题,并给出证明和程序实现。 阅读全文
posted @ 2013-07-16 09:57 五岳 阅读(24727) 评论(10) 推荐(25) 编辑
摘要: 简单介绍判别两个链表在无环/有环情况下是否相交的判别法,并收集了找出相交的第一个节点、求链表倒数第k个结点等相关问题,然后对单链表找环算法和找单链表环入口算法给出形式化的证明 阅读全文
posted @ 2013-07-14 09:21 五岳 阅读(8234) 评论(7) 推荐(4) 编辑
摘要: 对于《编程之美》上没有提供答案和提示的1.18和4.11两节,本文将综合网络上已有的部分资料,深入挖掘解题思路,并对目前尚未找到满意答案的1.18节问题1给出算法解答。阅读本文需要了解古典概型和组合数的含义,以及扫雷游戏中的各种符号。 阅读全文
posted @ 2013-07-11 17:36 五岳 阅读(2043) 评论(2) 推荐(1) 编辑
摘要: 本文主要介绍和字符串、序列相关的三大类问题的算法和它们衍生的问题:字符串左移(或称左旋、翻转)、最长重复子序列、最大连续子序列;除此以外,另外附了一段字符串哈希方法作为对字符串操作的补充。虽然标题和文章都很长,但介绍的问题并不多,只是做了较多的延伸和探讨。 阅读全文
posted @ 2013-07-08 20:46 五岳 阅读(6745) 评论(4) 推荐(3) 编辑
摘要: 本文提出的解法比原书清晰的多,全文转载一下。原作者:Milo Yip原文链接:http://www.cnblogs.com/miloyip/archive/2010/02/25/binary_tree_distance.html昨天花了一个晚上为《编程之美》,在豆瓣写了一篇书评《迟来的书评和感想──给喜爱编程的朋友》。书评就不转载到这里了,取而代之,在这里介绍书里其中一条问题的另一个解法。这个解法比较简短易读及降低了空间复杂度,或者可以说觉得比较「美」吧。问题定义如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,我们姑且定义"距离"为两节点之间边的个数。写一个程序 阅读全文
posted @ 2013-07-05 22:21 五岳 阅读(546) 评论(0) 推荐(0) 编辑
摘要: 本文不局限于具体的二分搜索算法和排序算法,而是提炼其中的思想,并将其应用到其他与它们似乎没有直接关系的问题中,从而获得高效的解决算法。主要解决的问题:线性期望时间的随机元素选择问题、大数据中找出一组重复元素、英文字典求所有变位词、子集元素的最小和。 阅读全文
posted @ 2013-07-05 09:47 五岳 阅读(4126) 评论(1) 推荐(3) 编辑
摘要: 这个主题和代码的实际写作有关,而且内容和用法相互交织,以下只是对于其内容的一个划分。《编程珠玑》上只用了两个章节20页左右的篇幅介绍,如果希望能获得更多的实例和技巧,我比较推崇《程序设计实践》 (Practise of Programming)、《编程精粹:编写高质量C语言代码》(Writing Solid Code)这两本书,只要有一般的C语言基础就能读懂,而且读起来比较快,读完后能提高不少coding的实践水平。 目录循环不变式(invariant)debug之脚手架断言(assert)循环不变式(invariant) 循环不变式主要用来帮助理解算法的正确性,具体来看,比较针对... 阅读全文
posted @ 2013-07-02 08:51 五岳 阅读(3773) 评论(0) 推荐(1) 编辑
摘要: 本节主要受到《编程珠玑》第12章随机取样问题的启发,但不仅仅限于随机取样问题,进一步地,研究讨论了一些在笔试面试中常见的和随机函数以及概率相关的问题。 阅读本文所需的知识: 1.对C语言中或其他语言中等价的rand()、srand()有所了解。本文不讨论种子的设定和伪随机数的问题; 2.中学或以上水平的概率基本概念。 目录利用随机数函数生成随机数利用随机数函数产生随机事件取样问题:从n个元素中选取m个从概率角度出发从集合插入出发从“打乱顺序”出发从一般到特殊取样问题:从未知总数的元素中选择一个概率问题选编“珠玑之椟”系列简介与索引利用随机数函数生成随机数问题1(《编程珠玑》... 阅读全文
posted @ 2013-06-29 10:46 五岳 阅读(6105) 评论(6) 推荐(4) 编辑
摘要: 设A[1..n]是一个包含N个非负整数的数组。如果在iA[j],则(i,j)就称为A中的一个逆序对(inversion)。a)列出数组[2,3,8,6,1]的5个逆序。b)如果数组的元素取自集合{1,2,...,n},那么,怎样的数组含有最多的逆序对?它包含多少个逆序对?c)插入排序的运行时间与输入数组中逆序对的数量之间有怎样的关系?说明你的理由。d)给出一个算法,它能用O(nlogn)的最坏情况运行时间,确定n个元素的任何排列中逆序对的数目(提示:修改归并排序) ——《算法导论》,思考题2-4 逆序对的应用很多,比如各类OJ中的逆序对题目:http://w... 阅读全文
posted @ 2013-06-27 08:41 五岳 阅读(5392) 评论(0) 推荐(4) 编辑
摘要: 估算的数据主要依赖于所能获得的数据和常识,有时还包括实践而不仅仅是理论。它常常作为一个大问题中的子问题,恰当地估算可以省去精确计算的时间和开销。在计算机领域,所谓常识的内容很宽泛,比如硬盘的传输速度、CPU每秒能执行多少指令、各种数据结构的大小甚至每分钟录入的单词数。有些数据是能够从各种资料中查得的,但仅仅靠记忆总难免遗漏;如果有经过学习而建立起的系统的知识结构,那便能很方便地把这些常识组织起来,除此以外,还可以靠平时经验的积累和一些面试题上的启发了。这里将进行一个收集,随时更新。 Little定律深入了估算所依赖的法则的细节:总花费等于各个部分的花费再乘以总的部分数,它在计算机系统方面... 阅读全文
posted @ 2013-06-26 08:32 五岳 阅读(1639) 评论(5) 推荐(0) 编辑
摘要: 位向量/位图是一个很有用的数据结构,在充分利用小空间存储大量数据方面非常具有优势,Linux内核中很多地方都是用了位图。同时,它不但基础,而且用到了很多编程语言的知识,以及对细节的把握,常常作为面试题出现。这里将要介绍它的实现、操作、应用。 与位图(bitmap)比,我更倾向于用位向量(bit ve 阅读全文
posted @ 2013-06-24 16:42 五岳 阅读(8740) 评论(5) 推荐(4) 编辑
摘要: 系列博文主要目的: 收集《编程珠玑》和《编程珠玑(续)》(以下简称《续》)上的算法和思想,并包括了一些自己的思考和对相关问题的引申,以备复习和查用。内容提要: 主要是算法收集,结合了《程序设计实践》 (Practise of Programming)、《编程精粹:编写高质量C语言代码》(Writing solid code)和《算法导论》的部分相关内容,以及自己的思考,无论你是否看过原书,都能够帮助你快速理解以至于能够独立完成这些算法。我相信自己写的解释比原书详细而易于理解,并且根据我的经验,对很多问题进行了扩展,这也是这个系列命名为“珠玑之椟”的原因。当然,“买椟还珠”是不可取的,这个系.. 阅读全文
posted @ 2013-06-24 16:41 五岳 阅读(1843) 评论(0) 推荐(2) 编辑
摘要: 前言 很多文章不外乎告诉你下面这几种标准的形式,你如果按照它们来用,准没错://对于一个2行13列int元素的二维数组//函数f的形参形式f(int daytab[2][13]) {...}//以下两种可以忽略行数f(int daytab[][13]) {...}f(int (*daytab)[13]) {...} 甚至会有人告诉你多维数组作为参数传递可以省略第一维,其他维不能省略。然而你对这种形式并不满意:如果事先限定了二维数组的大小,函数的泛用性就要大打折扣了。因为你真正需要的,是可以处理事先未知行数和列数的二维数组的函数。当然也有文章提到类似下面的动态分配的方式,但作为函数参数传递有.. 阅读全文
posted @ 2013-06-14 17:15 五岳 阅读(37149) 评论(9) 推荐(16) 编辑
摘要: 原定标题是“linux自带的测试、调试、性能工具”,不过并不恰当,比如本文要提到的gdb,很多Linux发行版中都提供了它,但毕竟不是Linux的必要组成部分,只是对与大多数Linux用户随手可得罢了。合理组合使用这些工具可以满足更复杂的要求,并写成测试脚本,能为测试提供很大的方便。本文不涉及具体的脚本编写,也不涉及与网络相关的命令如netstat和tcpdump。 为了方便阅读,用横线把内容进行分割,并且每个下划线下对这部分主要内容进行提示。 对于1~6这几个命令,单独使用时看上去很简单,但当它们结合重定向和正则表达式从而构成更复杂的功能甚至是自动化脚本时,才能发挥其真正威力。 c... 阅读全文
posted @ 2013-06-13 22:47 五岳 阅读(2732) 评论(0) 推荐(0) 编辑
摘要: 或许你曾经仔细了解过什么是大端小端,也动手编写了测试手头上的机器上是大端还是小端的程序,甚至还编写了大端小端转换程序;但过了一段时间之后,当你再看到大端和小端这两个字眼,你的脑中很快浮起了自己曾经做过的工作,却总是想不起究竟哪种是大端、哪种是小端,然后又去查以前写的记录?更让人不快的是,这种经历反反复复,让你十分困扰。如果你和以前的笔者一样,有过这种不快的经历,那么这篇文章希望能帮你彻底解决这个苦恼,让你彻底记住它们。 如果你在工作中经常使用到大端和小端以至于对它们十分熟悉,或者你的记忆力在保持时间的长度和精准度上都十分优秀,以至于不需要借助其他的方法,那么这篇文章不适合你。 如果你... 阅读全文
posted @ 2013-06-08 16:03 五岳 阅读(90079) 评论(4) 推荐(25) 编辑
摘要: 比如想在gcc手册里找-o选项对应的解释,如果man gcc | grep -o,grep会把-o当做自己的命令选项,是得不到正确结果的。 如果想得到正确结果,把待查的-o扩展成*-o就行了,不过这时需要给grep加上-E选项,所以最终的实例为:man gcc |grep -E *-o 阅读全文
posted @ 2013-06-05 17:27 五岳 阅读(475) 评论(0) 推荐(0) 编辑
摘要: 提示:本文是一篇个人读书笔记,并不是对原书内容的系统总结整理,除了两处标红部分,可能对作者以外的读者没有太大的参考意义。 每条准则都有例外第1章 假想的编译程序使用编译程序所有可选警告设施在使用nginx时深切地体会到了这一点的好处:有一行语句在编码时漏掉了,由于这个语句是唯一使用某个变量的地方,而且默认开启了-Werror=unused-value,才发现了这个错误。使用函数原型来检查参数(现在不使用也可以);必要的空语句用NULL代替,以防while()后多打的分号造成的bug相等判断反着写以防写成赋值:'t' == char使用lint来查出编译程序漏掉的错误如果有单元测 阅读全文
posted @ 2013-05-31 21:48 五岳 阅读(709) 评论(0) 推荐(0) 编辑
摘要: 序言 本文以经典的二分查找为例,介绍如何使用循环不变式来理解算法并利用循环不变式在原始算法的基础上根据需要产生算法的变体。谨以本文献给在理解算法思路时没有头绪而又不甘心于死记硬背的人。 二分查找究竟有多重要?《编程之美》第2.16节的最长递增子序列算法,如果想实现O(n2)到O(nlogn)的时间复杂度下降,必须借助于二分算法的变形。其实很多算法都是这样,如果出现了在有序序列中元素的查找,使用二分查找总能提升原先使用线性查找的算法。 然而,虽然很多人觉得二分查找简单,但随手写一写却不能得到正确的结果:死循环、边界条件等等问题伴随着出现。《编程珠玑》第四章提到:提供充足的时间,仅有约10%... 阅读全文
posted @ 2013-05-26 09:07 五岳 阅读(9148) 评论(21) 推荐(11) 编辑
摘要: 用于内存管理的malloc/free这对函数,对于使用C语言的程序员应该很熟悉。前段时间听说有的IT公司以“实现一个简单功能的malloc”作为面试题,正好最近在复习K&R,上面有所介绍,因此花了些时间仔细研究了一下。毕竟把题目做出来是次要的,了解实现思想、提升技术才是主要的。本文主要是对malloc/free实现思路的介绍,蓝色部分文字是在个人思考中觉得比较核心的东西;另外对于代码的说明,有一些K&R上的解释,使用绿色加亮。 在研究K&R第八章第七节的实现之前,不妨先看看其第五章第四节的alloc/afree实现,虽然这段代码主要目的是展示地址运算。alloc实现#d 阅读全文
posted @ 2013-05-03 21:09 五岳 阅读(10000) 评论(4) 推荐(8) 编辑
摘要: 提示:本文是一篇个人读书笔记,并不是对原书内容的系统总结整理,可能对作者以外的读者没有太大的参考意义。 目前对C++的了解还处于入门阶段,这本书真正看懂的内容大概只有一半左右。大部分条款和机制先建立一个印象,希望能在未来实际使用中再来回顾和加深理解。条款02:不允许在class内对static const类型变量赋值?替代方案是使用enum{NumTurns = 5}; (P14)条款03:1.const与指针(P17~18)char greeting[]="Hello";const char* p = greeting;//non-const pointer, const 阅读全文
posted @ 2013-04-26 16:21 五岳 阅读(460) 评论(0) 推荐(0) 编辑
摘要: 提示:本文是一篇个人读书笔记,并不是对原书内容的系统总结整理,可能对作者以外的读者没有太大的参考意义。第一章 C++编程基础1. 构造函数语法(P8),除了一般的等式初始化外的另一种初始化方法 int num_tries(0)2.case标签的向下穿越(P19),比较后会一直执行符合的case语句以及下面的所有语句。3.vector的两种初始化方式(P24-25) 单个元素逐一指定;利用一个已经初始化的array赋值4.while(infile>>name)何时结束?(P32) 读到文件尾端,infile>>name返回false5.cin中的setw()(习题,P20 阅读全文
posted @ 2013-04-21 14:33 五岳 阅读(555) 评论(0) 推荐(0) 编辑
摘要: 近期时间有限,暂不作尝试,链接留档备用。http://www.cnblogs.com/zplutor/archive/2011/09/17/2179756.htmlhttp://www.cnblogs.com/cpunion/archive/2005/07/28/202174.html 阅读全文
posted @ 2013-04-14 13:25 五岳 阅读(194) 评论(0) 推荐(0) 编辑
摘要: 上一周把《大话设计模式》看完了,对面向对象技术有了新的理解,对于一个在C下写代码比较多、偶尔会用到一些脚本语言写脚本的人来说,很是开阔眼界。《大话设计模式》的代码使用C#写成的,而在本人接触到的面向对象语言中,只对C++和Python还算了解,为了加深对各个模式的理解,我在网上下载了一个C++版的源 阅读全文
posted @ 2013-04-09 16:58 五岳 阅读(44478) 评论(14) 推荐(31) 编辑
回到顶部