改善时间复杂度

时间:2018-11-12 15:14:28

标签: c# time-complexity big-o

对于循环的Big-O(时间复杂性)或改善循环的方法,我将表示感谢。

让我们采取以下行动:

var pairs = 0;
HashSet<int> hs = new HashSet<int>(n);
for (var i = 0; i < ar.Length; i++)
{
    if(!hs.Contains(ar[i]))
        hs.Add(ar[i]);
    else
    {
        pairs++;
        hs.Remove(ar[i]);
    }
}

return pairs;

根据我的判断,由于循环,上述情况的最坏情况下的时间复杂度是:O(n)。

有什么方法可以改善这种情况,使时间复杂度尽可能接近O(1)?

PS:我很确定上面的值永远不会是O(1)。

谢谢

1 个答案:

答案 0 :(得分:0)

如果您需要在 n 个项目中对这样的对进行计数,那么根据定义,您不能做得比O( n )好,因为您需要查看每个项目。只是对项目进行迭代是O( n ),任何项目都可能是对的一部分,因此您需要对所有项目进行迭代。

也就是说,除非您要处理的特殊情况是,如果项可能只有 m pigeonhole principle可以找出必须有多少对。 >唯一值和 m < n 。假设您有5个商品,并且每个商品只能是“ A”或“ B”,那么您知道有两对商品甚至不需要看这些商品;得出2的时间复杂度为O(1)。这是唯一可以看到您的正式时间复杂度提高的情况。