我的困惑源于这样一个事实,即大多数Hashset操作的时间复杂性为O(1),但我想知道是否像下面这样连接两个Hashset:
HashSet<T> firstSet = new HashSet<T> ();
HashSet<T> secondSet = new HashSet<T> ();
firstSet.Concat(secondSet);
是在线性O(N)时间内完成,还是在固定时间内完成.
我已经查看了官方文档,但没有找到基于性能的规范.
我的困惑源于这样一个事实,即大多数Hashset操作的时间复杂性为O(1),但我想知道是否像下面这样连接两个Hashset:
HashSet<T> firstSet = new HashSet<T> ();
HashSet<T> secondSet = new HashSet<T> ();
firstSet.Concat(secondSet);
是在线性O(N)时间内完成,还是在固定时间内完成.
我已经查看了官方文档,但没有找到基于性能的规范.
Concat
是Linq的扩展方法,其是lazy,即当不需要动作时的Linq does nothing.这就是为什么Concat
本身具有明显的O(1)
时间复杂度- Linq不做任何事情:
// Note, that result is of IEnumerable<T> type
var result = firstSet.Concat(secondSet);
但是,如果我们materialize result
,我们将有O(n)
的时间复杂度:
// result is HashSet<T>
var result = firstSet
.Concat(secondSet) // O(1)
.ToHashSet(); // O(n)