对于循环的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)。
谢谢
答案 0 :(得分:0)
如果您需要在 n 个项目中对这样的对进行计数,那么根据定义,您不能做得比O( n )好,因为您需要查看每个项目。只是对项目进行迭代是O( n ),任何项目都可能是对的一部分,因此您需要对所有项目进行迭代。
也就是说,除非您要处理的特殊情况是,如果项可能只有 m pigeonhole principle可以找出必须有多少对。 >唯一值和 m < n 。假设您有5个商品,并且每个商品只能是“ A”或“ B”,那么您知道有两对商品甚至不需要看这些商品;得出2的时间复杂度为O(1)。这是唯一可以看到您的正式时间复杂度提高的情况。