【发布时间】:2018-04-08 16:42:48
【问题描述】:
正如官方website 所说,在 Swift 中,从字典(或其他语言的映射)中按键删除是 O(n),这使得它的操作效率相当低。
如果 put() 和 get() 基于散列应该是 O(1),为什么不是 O(1)?
【问题讨论】:
-
我的猜测是:由于字典的值语义,删除键值对可能需要复制数据,使其成为 O(N) 操作。
-
@MartinR 啊,是因为字典被实现为某种不可变(或堆栈)结构?
-
是的,而且字典(以及 Set、Array、String...)使用写时复制策略来实现值语义,而无需不必要的副本。
-
还要注意插入/删除/查找效率很大程度上取决于元素的哈希值。我不确定 Swift 是否保证任何这些操作的 O(1)。
-
This article 可能会有所启发
标签: swift time-complexity