【问题标题】:Why the time complexity of insertion in a redis SET is O(n)?为什么在 redis SET 中插入的时间复杂度是 O(n)?
【发布时间】:2014-09-13 11:36:52
【问题描述】:

我正在阅读 redis 的 SADD 命令帮助页面。 http://redis.io/commands/sadd

然后我发现有人在问以下问题的评论

我想知道这个操作的复杂性对于 N 个成员来说是 O(N) 添加 ?如何进行唯一性检查? redis是否存储哈希 包含所有 SET 的所有成员的表?

原来这是一个很好的问题,我很好奇为什么插入是 O(n) 和 SET?

【问题讨论】:

    标签: data-structures redis set


    【解决方案1】:

    对于添加的 N 个成员,复杂性不是 O(n),而是 O(N)。具体来说,这意味着您可以认为每个插入操作都是在恒定时间内完成的 - O(1) - 这只是渐近正确的。

    下面,我们假设 n 是集合中的项目数。

    要执行 SADD 操作,Redis 必须首先查找表示该集合的对象(散列查找 - 复杂度 O(1)),然后尝试将该项添加到对象本身中。

    集合可以在内存中表示为整数集或哈希表。

    如果对象是一个整数集(即整数的排序向量),它将执行二进制搜索来搜索项目的位置 - O(log n),然后最终插入项目 - O(n) - 然而,这仅适用于较小的 n 值。必须选择 set-max-intset-entries,以便整个对象适合 CPU 缓存以获得最佳性能。

    如果对象是一个哈希表,那么 Redis 将必须执行查找并在需要时添加项目 - 复杂度为 O(1)。

    因为一个 SADD 命令可以添加 N 个项目,所以得到的渐近复杂度是 O(N)。

    【讨论】:

      【解决方案2】:

      灵感来自the reference

      SADD command 时间复杂度为 O(1),当您只传递 1 个值以添加到 SET 中时。

      所以下面命令的复杂度是O(1):

      SADD my_set_name "a_new_value"
      

      当您将多个值传递给SADD 命令时,O(N) (N = 传递参数的数量)。

      所以下面命令的复杂度是O(3)

      SADD my_set_name "a_new_value" "another_new_value" "another_new_value"
      

      阅读更多here

      【讨论】:

      • 这是将新元素添加到唯一随机字符串列表中的最佳算法。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-24
      • 2023-02-10
      • 2018-08-05
      • 2020-12-16
      • 2020-03-21
      相关资源
      最近更新 更多