B+ 树 (1) – 定义与基本操作

1972 年 R. Bayer 和 E. McCreight 提出了 B 树。1979 年 Douglas Comer 在 The Ubiquitous B-Tree 提出了 B 树的一个变形——B+ 树。由于多路平衡树减少了磁盘读写次数,并且仍然保持 O(logN) 的插入/删除/查找的效率,被广泛应用于数据库和文件系统中。

定义(参考资料 [1, 3])

模仿 B 树的定义(参考资料 [3]),一棵 m 阶的 B+ 树可以这样定义:

  • 每个节点最多可以有 m 个元素;
  • 除了根节点外,每个节点最少有 (m/2)

阅读全文…

programming in lua (5)

第 8 章。

虽然我们说 lua 是一种解释语言,但是 lua 在执行前会被预编译为一种中间代码。解释执行语言的特殊之处不在于它们不需要编译执行,而是编译器是语言运行时(runtime)本身的一部分,也就是说可以执行在运行过程中动态产生的代码。

例如函数 loadstring() 接收一个字符串,返回一个可被执行的语句块(chunk):

f = loadstring("i = i + 1")

i = 10
f()
print(i) -- 11

又或者是省略赋值操作直接使用 loadstring() 的返回值:

i = 10
loadstring("i = i + 1")()
print(i) -- 11

但是直接使用的话如果出错了出错信息会比较模糊。可以使用 …

阅读全文…

programming in lua (4)

第 7 章。这一章看得不是很明白。

迭代器可以遍历一个集合中的所有元素。在 lua 中,迭代器一般都是函数,每次调用这个函数都会返回集合中的“下一个”元素,前面提到的闭包函数就是实现迭代器的很好选择:

function values (t)
   local i = 0
   return function ()
      i = i + 1
      return t[i]
   end
end

arr = {"one", "two", "three"}

iter = values(arr)
while true do
   local e = iter()
   

阅读全文…

使用 libpcap 分析网络报文 (2)

这里打算写写报文分析接口的设计。 一般来说,以太网的报文格式为:

+------------+-------------------+-----+
| eth header | ip/arp/... header | ... |
+------------+-------------------+-----+

例如手机上的一次网页请求的报文格式可能像下面这样:

+-----+----+-----+-----+----+-----+--------------+
| eth | ip | udp | gtp | ip | tcp | http request |
+-----+----+-----+-----+----+-----+--------------+

不同的应用对于不同协议的内容可能会有不同的需求。比方说,一个应用希望抓取 gtp 报头中的 pdp context,以此建立起某个手机号在某段时间内使用的是哪个 ip 的映射,它不关心上层应用的内容;另一个应用希望抓取内层 ip …

阅读全文…