算法复杂度时间

时间:2012-04-28 23:32:41

标签: algorithm iteration big-o time-complexity hashset

我目前无法识别和理解以下算法的复杂性时间。

背景:有一个文件列表,每个文件都包含一个候选ID列表。文件数量和文件数量都不固定。

如何计算一个算法的时间复杂度,该算法负责: 读取每个文件并将所有唯一候选ID添加到Hashset中?

感谢。

1 个答案:

答案 0 :(得分:0)

我只是重复说什么,所以如果你明白的话,请给他一个upvote - 我觉得这个解释有点令人困惑。

您的平均复杂度为O(n),其中n是候选者的总数(来自所有文件)。因此,如果您有a个文件,每个文件都有b个候选人,则所用时间与a * b成正比。

这是因为解决问题的最简单方法是简单地遍历所有数据,将它们添加到集合中。该集合将根据需要丢弃重复项。

循环遍历所有值需要与值的数量成比例的时间(即O(n)部分)。向哈希集添加值需要恒定时间(或O(1))。由于这是每次进入的恒定时间,因此您的总时间仍为O(n)。

然而,哈希集具有奇怪的最坏情况行为 - 它们需要的时间与某些(异常)情况下的内容大小成正比。所以在最糟糕的情况下,每次添加一个值都需要O(m)的工作量,其中m是集合中的条目数。

现在m是(大约 - 它从零开始,然后上升到......)不同值的数量。所以我们有两个常见的情况:

  • 如果不同候选者的数量随着我们阅读更多而增加(例如,90%的文件总是新的候选者)则m与n成比例。这意味着添加每个候选人的工作与n成比例增加。所以的工作与n ^ 2成正比(因为对于每个候选人,我们确实与n成比例,并且有n个候选者)。所以最坏的情况是O(n ^ 2)。

  • 如果 distinct 候选者的数量实际上是固定的,那么当您阅读越来越多的文件时,他们往往只是已知的候选人。在这种情况下,插入集合的额外工作是不变的(对于唯一候选者,您只能获得固定次数的奇怪行为 - 它不依赖于n)。在这种情况下,随着n越来越大,集合的性能不会越来越差,因此最坏的情况复杂性仍为O(n)。