我目前无法识别并理解以下算法的复杂性时。
背景:有文件的列表,每个都包含候选ID的列表。 这两个,文件和在其中的候选人数的数目是不固定的。
你将如何计算的算法,其负责的时间复杂度:读取每个文件并添加所有的唯一候选ID添加到HashSet的?
谢谢。
我目前无法识别并理解以下算法的复杂性时。
背景:有文件的列表,每个都包含候选ID的列表。 这两个,文件和在其中的候选人数的数目是不固定的。
你将如何计算的算法,其负责的时间复杂度:读取每个文件并添加所有的唯一候选ID添加到HashSet的?
谢谢。
我只是随声阿米特说,所以,请给他给予好评,如果这是你清楚 - 我觉得解释有点混乱。
一般的复杂度为O(n),其中n是考生总数(所有文件)。 所以如果你有a
文件,每个文件b
候选人则所花的时间是成正比的a * b
。
这是因为您解决问题最简单的方法是简单地通过所有的数据环路,将它们添加到组。 该集将丢弃重复是必要的。
遍历所有的值需要时间成比例(也就是O(n)的部分)的值的数量。 添加值的散列集花费一定的时间(或O(1))。 因为这是每个条目固定的时间,你的总时间仍然为O(n)。
然而,散套有一个奇怪的最坏情况下的行为 - 他们采取的时间与内容中的一些(异常)的情况下大小。 因此,在最糟糕的情况下,每次添加一个值时它需要的工作,其中M是集合的条目数的O(M)的量。
现在m为(约 - 它是从零开始并且上升到...)的不同值的数目。 所以我们有两个常见的情况:
如果不同的候选的数目增加,因为我们读更多(因此,例如,90%的文件总是新候选)则m与n成比例。 这意味着添加每个候选的工作增加了与n成比例。 所以总的工作正比于N ^ 2(因为每个候选我们所做的工作与n成比例,且有N个候选)。 这样的最坏情况是O(n ^ 2)。
如果不同的考生人数其实是固定的,那么当你读到越来越多的文件,他们往往只是充满已知的候选人。 在这种情况下,用于插入一组额外的工作是恒定的(你只能得到奇怪的行为的固定次数的唯一候选人-它不依赖于N)。 在这种情况下,集合的性能不守每况愈下正变得越来越大,所以最坏的情况下复杂仍然为O(n)。