【问题标题】:Computational Complexity of CFDictionaryCFDictionary 的计算复杂度
【发布时间】:2014-10-02 12:01:53
【问题描述】:

我正在研究 Core Foundation 和 CFDictionary,并在 Apple Documentation 中找到了这个,

CFDictionary 对象中值的访问时间保证为 对于任何实现,最坏的情况是 O(log N),但通常是 O(1) (恒定时间)。插入或删除操作通常在 也是恒定的时间,但在最坏的情况下是 O(N*log N)。这是 通过键访问值比直接访问它们更快。 字典往往比数组使用更多的内存 相同数量的值

令我惊讶的是,在 CFDictionary source 中,我发现了这个,

保证字典中某个值的访问时间为 对于当前和未来的任何实现,最差的 O(N),但会 通常是 O(1)(恒定时间)。插入或删除操作将 通常也是常数时间,但在最坏的情况下是 O(N*N) 在某些实现中。通过键访问值更快 而不是直接访问值(如果有任何此类操作)。 字典往往会比数组使用更多的内存 具有相同数量的值。

为什么会有这样的差异..?还是我找错地方了?

编辑:在apple OpenSource Browser 中,为什么有这么多看起来像是不同版本的Core Foundation 的文件夹,是吗..?其中哪些是最新的/相关的?

【问题讨论】:

  • “大 O” 的计算无论如何都是很多的。如果散列很差,那么 O(log N) 数就超出了窗口。并且给定的插入可能会导致分裂并且比平均时间长 1000 倍。
  • @HotLicks ,我同意,我只是出于好奇想知道,为什么源代码中的文档和 cmets 会有差异。

标签: ios core-foundation cfdirectory


【解决方案1】:

“在某些实现中”。由于您有源代码,因此您可以轻松检查最坏的情况是您的实现。在最坏的情况下,假设字典中的每个对象都返回一个哈希值 0 :-)

顺便说一句。当哈希表已满并完全重建时,将发生最坏的情况。这就是为什么您在摊销时间使用,而不是在最坏时间使用,除非单次插入的最坏时间对您很重要。

【讨论】:

    猜你喜欢
    • 2017-11-04
    • 2012-12-31
    • 2019-03-11
    • 1970-01-01
    • 2013-11-01
    • 2013-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多