假装自己是人类
线段树 (区间树)

不查不知道,一查吓一跳,“线段树”这个名字的定义真是混乱到一定程度了。

维基百科 Segment Tree 说它是一种 数据结构,用来存储区间或线段,用来在 O(log n) 的时间内查找包含某个点的所有区 间。一般线段树是静态的结构,不需要修改的,但一些教程又很强调线段树的修改,比如 说“lazy 节点是线段树的精髓“。与此同时,另一种结构区间树(Interval Tree) 在结构和功能上和线段树又十 分接近。看来看去,线段树,区间树在维基百科、教材、博客里的介绍经常大不相同。

本文里,我们以解决区间最小值(RMQ)问题中使用的数据结构为基准,讲讲“线段树”的基本思想。

二叉索引树

二叉索引树(Binary Indexed Tree) 也称为 Fenwick tree,中文也称树状数组。它可以在 O(log n) 的时间内得到数组的前缀和(A[1] + A[2] + … + A[i]),且在 O(log n) 时间内支持动态修改数组的值。

Git: merge vs rebase

Merge 还是 Rebase,这是一个问题。网上有许多教程说明二者的区别,之前我写的一个 关于 Git 的 PPT 里也说过两者的区别。这篇文章里,我们从分支图的角度,看看两种策略下产生的分支图有什么区别。

不要轻易使用元编程

元编程就像核弹,自己梦寐以求,却不希望别人拥有。

一般说元编程分为两类,一类是宏,在编译时期生成代码;另一类是运行时修改代码的行 为。而不论是哪一类,我的建议是在决定使用之前要慎重考虑。元编程能让我们扩展语言 本身,是十足的黑魔法;但用好不易,容易造成团队/社区在意见是实现上的分裂。(另 外这篇文章里主要是对元编程的一些吐糟,并不包含基础知识的介绍。)

DIP vs IoC vs DI

你听过 SOLID 设计原则吗?你了解 Spring 里的控制反转(IoC)吗?你知道依赖注入(Dependency Injection)和它们有什么区别吗?虽然它们的形式多样,但内核却是简单的概念。我们就来看看它们到底是什么。

Java Annotation Processor 小记

最近基于工作上的需求调研了下 Java Annotation Processor 的使用方式,开篇博客记录下学习过程中遇到的坑。可以由于平时用到 Annotation 的场景特别少,因此能搜索到的教程特别有限,也希望文章在某种程度上填补部分空白吧。

及时获取反馈以提升工作效率

最近发现自己及整个团队的开发效率低下,思前想后认为跟反馈链太长脱不了干系,于是思考及时反馈的重要性,以及它如何影响我们的效率。这里做一个小结。

估算:古代水稻亩产量

用了金克垃,亩产一千八。古代没有金克垃,亩产有多少?有你现有的常识,能估算出来吗?

CSS 子元素依次收缩的实现

当子元素的宽度(或高度)超过父元素时,如果父元素设置了 display: flex,则子 元素将按比例缩小自己的宽度(或高度),但现在我们希望子元素按一定的优先级缩小。 即:当宽度不足时,优先缩小某一个子元素,当达到该元素的最小宽度(min-width) 时,再开始缩小另外的元素。下面是一个示例图:

可以看到,当宽度不足时,上例中优先缩小了最右的元素,当最右元素达到最小宽度 100px 时开始缩小左边的元素,依此类推。

Python Decorator(装饰器)

今天来说说 Python 里的装饰器 (decorator)。它不难,但却几乎是 “精通” Python 的路上的第一道关卡。让我们来看看它到底是什么东西,为什么我们需要它。

Underscore.js 源码阅读

(这是两年前的笔记,现在把它搬到博客上,Underscore 版本:1.8.3)

这篇文章 的启发,萌生阅读 underscore.js 源 码的念头,其中有许多不理解的地方,也是读了上述文章后才明白的.为了保持本文的完整 性,也尽量按自己的理解进行注释. 不再提及上述引用文章.

CSS position:sticky

大约两年看在看 ECMA 2015 的时候,发现在滚动时每个章节的标题都会固定在页面的顶端,好奇的我看了下它的 CSS,发现只有简单的一行 position: sticky。当时只有 Firefox 实现了这个特性,不免心生遗憾,今天恰巧注意到 Chrome 从 56 也支持这个特性了!这里我们就来介绍下这个神奇的特性吧。

理解 Python asyncio

协程 (coroutine) 几乎是 Python 里最为复杂的特性之一了,这篇文章我们来说一说 asyncio 的内部实现机制,借此来理解一门语言要支持协程需要做的工作。

评:30 多年的编码经验浓缩成的 10 条最佳实践

文章 30 多年的编码经验浓缩成的 10 条最佳实践 原文出自 10 Tips for Writting Better Code。我认为这 10 条原则挺有帮助,所以本文想对这些原则做一些评价,说说我的看法,可以的话顺便给一些例子。建议看这篇文章之前先阅读原文。

Python Generator

Python 中的生成器 (generator) 是一个十分有用的工具,它让我们能方便地生成迭代器 (iterator)。这篇文章里,我们就来说说什么是生成器,生成器有什么作用以及如何使用。