LevelDB 源码阅读:如何分析跳表的时间复杂度?

在上篇 LevelDB 源码阅读:跳表的原理、实现以及可视化中,详细分析了 LevelDB 中跳表的实现。然后在 LevelDB 源码阅读:如何正确测试跳表的并行读写? 中,分析了 LevelDB 跳表的测试代码,最后还剩下一个问题,怎么分析跳表的时间复杂度呢?

在分析完跳表的时间复杂度之后,就能明白 LevelDB 中概率值和最大高度的选择,以及 Redis 为什么选择不同的最大高度。最后本文也会提供一个简单的压测代码,来看看跳表的性能如何。

本文不会有很高深的数学知识,只涉及简单的概率论,可以放心往下看。跳表的性能分析有不少思路很值得借鉴,希望本文能抛砖引玉,给大家带来一些启发。

跳表性能分析拆解

在知道 LevelDB 的原理和实现后,我们可以推测出来,在极端情况下,每个节点的高度都是 1,那么跳表的查找、插入、删除操作的时间复杂度都会退化到 O(n)。在这种情况下,性能比平衡树差了不少。当然,因为有随机性在里面,所以没有输入序列能始终导致性能最差

那么跳表的平均性能如何呢?前面给出过结论,和平衡树的平均性能差不多。引入一个简单的随机高度,就能保证跳表的平均性能和平衡树差不多。这背后有没有什么分析方法,能够分析跳表的性能呢

阅读全文

LevelDB 源码阅读:如何正确测试跳表的并行读写?

在上篇 LevelDB 源码阅读:跳表的原理、实现以及可视化中,从当前二叉搜索树和平衡树的一些缺点出发,引出了跳表这种数据结构。然后结合论文,解释了跳表的实现原理。接着详细分析了 LevelDB 的代码实现,包括迭代器实现,以及并行读的极致性能优化。最后还提供了一个可视化页面,可以直观看到跳表的构建过程。

但是还有两个问题:

  1. 怎么测试 LevelDB 跳表的代码,保证功能的正确性?特别是怎么保证读写并行情况下跳表实现的正确性
  2. 怎么定量分析跳表的时间复杂度?

接下来通过分析 LevelDB 的测试代码,先来回答第一个问题。跳表的性能定量分析,放到另外单独一篇文章。

阅读全文

实际例子上手体验 OpenAI o1-preview,比预期差一点?

OpenAI 半夜悄咪咪推出了新的模型,introducing-openai-o1-preview。放出了系列视频,展示新模型的强大,网上也是普天盖地的文章来讲新模型测评有多厉害。不过见惯了 AI 界的放卫星,怀着怀疑的态度,第一时间上手体验一把。

汉语新解

刚好最近李继刚有个提示词很火,可以生成很好玩的汉语新解。用 Claude3.5 试了效果特别好,下面是一些 Claude 生成的 SVG 图:

Claude3.5 汉语新解的示例

阅读全文