分享一段看到的代码

摘要: 今天看《代码之美》,看到了svn的一段代码,很优雅,贴出来分享一下:是一段支持^ $ . * 的简单正则代码。展示了对特殊情况的优雅处理,指针与C的递增运算和布尔值隐式转换结合在一起时的紧凑,以及巧妙利用递归的思想解决问题:int match(char *regexp, char *text) { if(regexp[0] == '^') { return matchhere(regexp+1, text); } do { if(matchhere(regexp, text)) return 1; } while (*text++ != '\0'); retur 阅读全文
posted @ 2012-09-08 22:08 大俗人 阅读(900) 评论(0) 推荐(0) 编辑

决策树建模

摘要: 决策树是一种简单的机器学习方法。决策树经过训练之后,看起来像是以树状形式排列的一系列if-then语句。一旦我们有了决策树,只要沿着树的路径一直向下,正确回答每一个问题,最终就会得到答案。沿着最终的叶节点向上回溯,就会得到一个有关最终分类结果的推理过程。决策树:class decisionnode: def __init__(self,col=-1,value=None,results=None,tb=None,fb=None): self.col=col #待检验的判断条件 self.value=value #对应于为了使结果为true,当前列必须匹配的值 self.re... 阅读全文
posted @ 2012-08-04 15:09 大俗人 阅读(3849) 评论(2) 推荐(1) 编辑

两个常见的oracle索引

摘要: B*树索引树最底层的块称为叶子节点,其中包含各个索引键以及一个rowid。索引的叶子节点构成一个双向链表。一旦发现要从叶子节点中的哪里“开始”,执行值得有序扫描就会很容易。压缩键索引:每个键条目分解为“前缀”和“后缀”两部分,前缀建立在串联索引的前几列上,后缀在索引键的后几列上,是前缀所在索引条目中的唯一部分。如果你有一组列,其中一些列按升序排序(ASC),另外一些列按降序排序(DESC),此时可以指明使用降序索引。索引用于访问表中的行:通过读索引来访问表中的行。此时你希望访问表中很少的一部分 行(只占一个很小的百分比在总行数的1%~20%之间)。 索引用于回答一个查询:索引包含了... 阅读全文
posted @ 2012-07-15 16:32 大俗人 阅读(2611) 评论(0) 推荐(0) 编辑

如何写出优美的代码(四)

摘要: (本文思想基本来自于经典著作《重构》一书)上一篇 http://www.cnblogs.com/ceys/archive/2012/03/09/2388356.html三、简化条件表达式和函数调用条件语句要尽可能简单,分别用独立函数表示它们。如果条件表达式根据对象类型不同而选择不同的行为,将这个条件表达式的每个分支放进一个子类内的覆写函数中,然后将原始函数声明为抽象函数。将查询和修改函数分离。在多线程系统中,赋值前通常需要完成检查。这个时候仍把查询修改分开,在建立一个新函数,调用各自独立的查询和修改函数,并声明为synchronized。如果未被声明为synchronized,应该将她们的可见 阅读全文
posted @ 2012-04-30 23:56 大俗人 阅读(2717) 评论(1) 推荐(2) 编辑

数据库-并发控制

摘要: 当多个事务在数据库中并发执行时,数据的一致性可能受到破坏。系统有必要控制各事务之间的相互作用,这是通过并发控制机制的多种机制中的一种来实现的。避免事务"饿死",授权加锁的条件:不存在在数据项Q上持有与M型锁冲突的锁的其他事务;不存在等待对数据项Q加锁且先于Ti申请加锁的事务。常用的机制是各种封锁协议,时间戳排序,有效性检查,多版本机制。封锁协议是一组阐明了事务合适对数据库中的数据项加锁解锁的规则。两阶段封锁协议仅在一个事务未曾释放任何数据项时允许该事务封锁新数据项。该协议保证可串行性,但不能避免死锁。在缺少有关数据项存取方式的信息是,两阶段封锁协议对保证可串行化来说不仅是必 阅读全文
posted @ 2012-03-16 18:07 大俗人 阅读(11310) 评论(3) 推荐(2) 编辑

如何写出优美的代码(三)

摘要: (该文思想来自于经典著作《编程珠玑》)看到有朋友评论说,美的代码不仅仅是规范上面的事。规范的代码可以让我们减少Debug的难度,增加可扩展性。当遇到性能问题的时候,我们就需要改进算法了。编程珠玑的开篇提到了一个给最多一千万个7位电话号码排序的问题。首先我们看这个问题的常规解决方案:C版本:int intcomp(int *x,int *y){ return *x - *y}int a[10000000]int main(void){ int i,n = 0; while (scanf("%d", &a[n] != EOF) n++; qsort(a, n, size 阅读全文
posted @ 2012-03-14 01:14 大俗人 阅读(2727) 评论(4) 推荐(3) 编辑

如何写出优美的代码(二)

摘要: (本文思想基本来自于经典著作《重构》一书)上一篇 http://www.cnblogs.com/ceys/archive/2012/03/05/2379842.html#commentform上一篇文章主要讲了怎么给函数整容。现在我们大家基本上都使用面向对象语言,什么样的“对象”才是优美的呢?类中的函数、字段应该和该类最紧密相关,如果和另一个类有更多交互,搬移它。搬移字段时,如果很多函数引用了该字段,可以把该字段用get/set方法自我封装起来。这样搬移时只需要修改get/set访问函数。一个类应该是一个清楚的抽象,处理一些明确的责任。否则建立一个新类,用以表现从旧类中分离出来的责任。提炼类是 阅读全文
posted @ 2012-03-09 22:19 大俗人 阅读(2800) 评论(0) 推荐(3) 编辑

如何写出优美的代码(一)

摘要: (本文思想基本来自于经典著作《重构》一书)我愿意把代码想象成女性,我希望在我面前的是一个美女,受不了丑陋的那部分。优美的代码可理解性高,修改成本低。不过优美的代码是不容易一次写出的。我的代码刚刚写完就是一坨屎。比如有很多重复代码,同一个类的两个函数含有相同的表达式。函数过长,以至于需要注释来解释区分。函数的参数超过3个。这些参数总是在一起出现,却没有为它们产生一个新的对象。当有不同原因的改动时,有的类需要在不同方向上变化;当出于一个原因改动时,却有不同的小类需要做出小修改。某些类中的函数拥有很多其它类中的数据……不能忍了!还好,我院引进了先进的“整容技术”。让我们一起来见识一下:一、重新组织函 阅读全文
posted @ 2012-03-05 01:22 大俗人 阅读(6100) 评论(10) 推荐(4) 编辑

数据库-查询优化器

摘要: 数据库都会对sql做查询优化处理,这个过程是怎样的呢?首先,查询优化器使用等价规则系统的产生与给定表达式等价的表达式。概念上,只要表达式中有任何则表达式与等价规则的某一边想匹配就产生一个新的表达式。为了减少空间需求,大多优化器都会让有公共子表达式的表达式指向共享子表达式。此外,若把执行代价估计考虑进去,可以避免检查某些表达式。关系代数的等价规则见:http://jsjedu.hxu.edu.cn/sjkyl/4/4.2.4.htm产生表达式后,需要定义每个运算使用什么算法以及如何协调各运算执行。选择执行计划的方法之一是简单的为每个运算选择一个代价最小的算法。但是,考虑到总体,例如尽管在给定层次 阅读全文
posted @ 2012-02-15 10:45 大俗人 阅读(2804) 评论(0) 推荐(0) 编辑

数据库-表达式计算

摘要: 象这样一个sql:select * from account r where balance<2500 join customer s on r.customer-name=s.name一个表达式中包含多个运算,该怎样计算呢?一种方法是以一定的顺序每次执行一个操作,每次计算的结果被实体化到一个临时关系中以备后用。实体化计算的代价包括所有运算的代价和把中间结果写回磁盘的代价。其中磁盘I/O的代价很高。另一种方法是在流水线上同时执行多个运算,一个运算结果传递给下一个,而不必保存到临时关系中。如例所示的连接运算,其左端输入来自流水线,由于是流水线输入,处理连接运算所需的输入不能一下子全部获得。 阅读全文
posted @ 2012-02-14 17:31 大俗人 阅读(2265) 评论(0) 推荐(0) 编辑