Swift Dictionary:删除时间复杂度

时间:2018-04-08 16:42:49

标签: swift time-complexity

正如官方website所述,从字典(或地图,其他语言)中删除密钥是Swift中的O(n),使其成为一种效率低下的操作。

为什么不是O(1)如果put()和get()应该是基于散列的O(1)?

enter image description here

1 个答案:

答案 0 :(得分:1)

removeValue的源代码为:

let (bucket, found) = asNative.find(key)
guard found else { return nil }
let isUnique = isUniquelyReferenced()
return asNative.uncheckedRemove(at: bucket, isUnique: isUnique).value

uncheckedRemove的代码为:

_internalInvariant(hashTable.isOccupied(bucket))
let rehashed = ensureUnique(isUnique: isUnique, capacity: capacity)
_internalInvariant(!rehashed)
let oldKey = (_keys + bucket.offset).move()
let oldValue = (_values + bucket.offset).move()
_delete(at: bucket)
return (oldKey, oldValue)

并将endureUnique定义为:

if _fastPath(capacity <= self.capacity && isUnique) {
  return false
}
if isUnique {
  resize(capacity: capacity)
  return true
}
if capacity <= self.capacity {
  copy()
  return false
}
copyAndResize(capacity: capacity)
return true

尽管大多数操作将在O(1)上运行,但sureUnique函数可能具有O(n),如果该项不是唯一的,则哈希映射将执行copy(),这会花费O(n)的时间复杂度。