摘要: 【算法08】数对之差的最大值 题目:数组中,数字减去它右边(不要求相邻)的数字得到一个数对之差。求所有数对之差的最大值。例如:数组{2, 4, 1, 16, 7, 5, 11, 9},数对之差的最大值是11,是16-5的结果。 分析1:这道题我们同样可以用遍历的方法,固定一个数字,然后逐一减去它右边的数字,得到各个数对之差,然后比较选出最大值;对于数列中的每一个数字做如此操作,然后去所有最大值的最大值。然而和所有枚举算法的弊端一样,这样的算法效率比较低,所有的数对只差共有n*(n-1)/2,因而时间复杂度为O(n^2)。 分析2:联想到我们在“【算法05】左旋转字符串中”将一个大的字符分... 阅读全文
posted @ 2011-12-02 11:34 madonion 阅读(255) 评论(0) 推荐(0)
摘要: 红黑树之前看了很多写红黑树的博客,但是感觉都讲的不太清楚!没说这样操作如何使他保持平衡的,于是疑惑重重,就看不下去了,一次不经意看到一个人说维基百科的红黑树讲的好,我就随便点了一下一看——这下疯了~,怎么讲的这么好!可以说是把一个复杂的问题,讲得简单化!这太幸福了!于是我就慢慢学会了!强烈推荐维基的这个讲解,再也找不到比这还好的讲解了!不知道它上边其它的怎么样,反正这个很好!!既然学会了,走过来了,我也要留下脚印!下面将是我对红黑树的总结,里面的性感的图片都是维基百科红黑树上的^_^!我讨论的红黑树需建立在会平衡二叉树的基础上去学,即若不懂“旋转”操作,请看平衡二叉树的旋转操作。红黑树(RBT 阅读全文
posted @ 2011-12-02 11:27 madonion 阅读(168) 评论(0) 推荐(0)
摘要: 红黑树维基百科,自由的百科全书红黑树是一种自平衡二叉查找树,是在计算机科学中用到的一种数据结构,典型的用途是实现关联数组。它是在1972年由鲁道夫·贝尔发明的,他称之为"对称二叉B树",它现代的名字是在 Leo J. Guibas 和Robert Sedgewick于1978年写的一篇论文中获得的。它是复杂的,但它的操作有着良好的最坏情况运行时间,并且在实践中是高效的: 它可以在O(logn)时间内做查找,插入和删除,这里的n是树中元素的数目。红黑树和AVL树一样都对插入时间、删除时间和查找时间提供了最好可能的最坏情况担保。这不只是使它们在时间敏感的应用如实时应用 阅读全文
posted @ 2011-12-02 11:25 madonion 阅读(965) 评论(0) 推荐(0)
摘要: 谈谈Java虚拟机——Class文件结构大家都知道,Java之所以如此受人喜欢,很大的原因是要规于它的跨平台性。“一次编写,到处运行”,Java诞生之时曾提出的著名的宣传口号,充分表达了软件开发人员对冲破平台界限的渴求。或许大部分程序员都认为Java虚拟机执行Java程序是一件理所当然和天经地义的事,但时至今日,商业机构和开源机构已经在Java语言之外发展出一大批在Java虚拟机之上运行的语言,如Clojure、Groovy、JRuby、Jython、Scale等。使用Java编译器可以把Java代码编译为存储字节码的Class文件,使用JRuby等其它语言的编译器一样可以把程序代码编译成Cl 阅读全文
posted @ 2011-12-01 10:02 madonion 阅读(171) 评论(0) 推荐(0)
摘要: Java技能优化集锦1 通用篇 “通用篇”讨论的问题适合于大多数Java应用。1.1 不用new关键词创建类的实例 用new关键词创建类的实例时,构造函数链中的所有构造函数都会被自动调用。但如果一个对象实现了Cloneable接口,我们可以调用它的clone()方法。clone()方法不会调用任何类构造函数。 在使用设计模式(Design Pattern)的场合,如果用Factory模式创建对象,则改用clone()方法创建新的对象实例非常简单。例如,下面是Factory模式的一个典型实现:public static Credit getNewCredit() {return new C... 阅读全文
posted @ 2011-11-30 21:38 madonion 阅读(137) 评论(0) 推荐(0)
摘要: 正确的C++内存分区Posted on 2011-11-30 10:11BreakMind阅读(35)评论(1)编辑收藏前导:作为一个C++的菜鸟,一直对C++的内存分区比较晕乎,网络上的分配方式各式各样,让人看得云里雾里。网络上有一种分区,将C++内存分为:堆区、栈区、自由存储区、全局/静态存储区和常量存储区。个人认为这是完全错误的内存划分方式,误导我这样的菜鸟。鉴于此,我查找资料,整理出以下的结论。真正合理的C++的内存划分为栈区、堆区、全局区/静态区、字符串常量和代码区。这里去掉自由存储区,增加了代码区,理由会在下面讲到。栈区:由系统进行内存的管理。说明:主要存放函数的参数以及局部变量。 阅读全文
posted @ 2011-11-30 15:34 madonion 阅读(3051) 评论(0) 推荐(1)
摘要: Learn Vim Progressivelytl;dr: Want to learn vim (the best text editor known to human kind) the fastest way possible. I suggest you a way. Start by learning the minimal to survive, then integrate slowly all tricks.Vim the Six Billion Dollar editorBetter, Stronger, Faster.Learn vim and it w... 阅读全文
posted @ 2011-11-29 19:14 madonion 阅读(824) 评论(0) 推荐(0)
摘要: 【算法06】顺时针打印矩阵题目:给定一个矩阵,从外向内顺时针打印矩阵中的每一个数字。例如:给定矩阵:1 2 3 45 6 7 89 10 11 1213 14 15 16输出应该为:{1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10}分析:这道题的意思非常直观,给人的感觉也是so easy,然而实际去做的时候会发现,如果结构划分的不好,会出现很多的循环,而且包括对各种边界条件的判定,题目不难,但是给人的感觉——很烦!我分享一下,我做这道题的思路。循环条件怎么判定?一个矩阵,给定起点(startX,startY)和终点(endX,endY)(即位于... 阅读全文
posted @ 2011-11-29 19:06 madonion 阅读(292) 评论(0) 推荐(0)
摘要: 这种软件设计原则你未必懂“一个对象应该对其他对象有尽可能少的了解”“Only talk to your immediate friends”“Don’t talk to strangers”“每一个软件单位对其他的单位都只有最少的知识,而且局限于那些与本单位密切相关的软件单位”……来源:迪米特法则(LoD)最初是用来作为面向对象的系统设计风格的一种法则,是很多著名系统,如火星登陆软件系统、木星的欧罗巴卫星轨道飞船的软件系统的指导设计原则。迪米特法则(LoD)又可分为两种:狭义的迪米特法则(LoD)和广义的迪米特法则(LoD)。狭义的迪米特法则(LoD):如果两个类不必彼此直接通信,那么这两个类 阅读全文
posted @ 2011-11-29 13:32 madonion 阅读(249) 评论(0) 推荐(0)
摘要: 程序员究竟该如何提高效率“拖延症”这个名词近些年很火,似乎每个人都觉得自己的效率不高,很难集中注意力做好手头的事,那我们究竟该如何提高自己的工作效率呢,大牛来告诉你.Aaron Swartz写过一篇很有名的文章,叫做"HOWTO: Be more productive",这篇文章写的实在是太好了,我看了好多遍,很赞同作者的观点。我借鉴了作者提到的一些方法并运用到自己的生活中,发现确实有效果,所以我愿意让更多的人看到这篇文章。Aaron Swartz这个人绝对是大牛人,他14时就参与了RSS1.0的制定,他在Stanford读了一年就主动退学了,成为了YC的一员,他的公司后来 阅读全文
posted @ 2011-11-28 19:06 madonion 阅读(101) 评论(0) 推荐(0)