Data structures 为什么在redis集合中插入的时间复杂度为O(n)?
我正在阅读redis的SADD命令帮助页面 然后我发现有人在问下面的问题 我想知道,对于N个成员,这个操作的复杂性是如何达到O(N)的 补充?如何执行唯一性检查?redis是否存储哈希 包含所有集合的所有成员的表 事实证明,这是一个好问题,我很好奇为什么对于集合插入是O(n)?对于添加的n个成员,复杂性不是O(n),而是O(n)。具体地说,这意味着可以考虑每个插入操作都是在常数时间O(1)中完成的,这只是渐近真实的。 下面,我们假设n是集合中的项数 要执行SADD操作,Redis必须首先查找表示集合的对象(哈希查找-复杂性O(1)),然后尝试在对象本身中添加该项 该集合可以在内存中表示为整数集或哈希表 如果对象是一个整数集(即整数的排序向量),它将执行二进制搜索以搜索项-O(logn)的位置,然后最终插入项-O(n)-但是这仅适用于小值n。必须选择set max intset条目,以便整个对象适合CPU缓存以获得最佳性能 如果对象是一个哈希表,那么Redis将必须执行查找并在需要时添加该项-复杂性为O(1) 由于SADD命令可以添加N个项,因此产生的渐进复杂性为O(N)。灵感来自:Data structures 为什么在redis集合中插入的时间复杂度为O(n)?,data-structures,redis,set,Data Structures,Redis,Set,我正在阅读redis的SADD命令帮助页面 然后我发现有人在问下面的问题 我想知道,对于N个成员,这个操作的复杂性是如何达到O(N)的 补充?如何执行唯一性检查?redis是否存储哈希 包含所有集合的所有成员的表 事实证明,这是一个好问题,我很好奇为什么对于集合插入是O(n)?对于添加的n个成员,复杂性不是O(n),而是O(n)。具体地说,这意味着可以考虑每个插入操作都是在常数时间O(1)中完成的,这只是渐近真实的。 下面,我们假设n是集合中的项数 要执行SADD操作,Redis必须首先查找表示
SADD
当只传递1个值以添加到集合中时,命令时间复杂度为O(1)
因此,以下命令的复杂性为O(1):
O(N)表示将多个值传递给SADD
命令时(N=传递的参数数)
所以下面的命令的复杂性是O(3)
阅读更多信息。这是你见过的将新元素添加到唯一随机字符串列表中的最佳算法。
SADD my_set_name "a_new_value"
SADD my_set_name "a_new_value" "another_new_value" "another_new_value"