最糟糕的情况是从集合中创建HashSet <int>的复杂性

Ugh*_*ent 10 .net c# complexity-theory

我有一组int值,我HashSet<int>用以下方式填充a -

var hashSet = new HashSet<int>(myIEnumerable);
Run Code Online (Sandbox Code Playgroud)

假设迭代IEnumerableis O(n),那么以这种方式创建a 的最坏情况复杂度是HashSet<int>多少?

Rob*_*evy 7

文档实际上说明:

此构造函数是O(n)操作,其中n是collection参数中的元素数.

http://msdn.microsoft.com/en-us/library/bb301504.aspx

  • @UghSegment你的意思是"平均"复杂性不是"摊销"."摊销"用于有时昂贵的操作(例如,后备存储器加倍)并且其余部分便宜.这个概念与平均值与最差值正交. (2认同)

das*_*ght 5

O(N^2)通过在集合达到其最大大小时将所有散列的对象提供给同一个存储桶,可以使最坏的情况发生.例如,如果你传递一个17519 int秒的序列作为

x[i] = i * 17519
Run Code Online (Sandbox Code Playgroud)

对于i介于1和17519之间(包括1和17519)的所有数字,将在Microsoft的实现中散列到最初的存储桶HashSet<int>,O(N^2)并插入:

var h = new HashSet<int>(Enumerable.Range(1, 17519).Select(i => i*17519));
Run Code Online (Sandbox Code Playgroud)

设置brea kpoint,并h在调试器中检查.查看Raw View /非公共成员/ m_buckets.观察到初始存储桶有17519个元素,而剩余的17518都有零.

  • 对于`int`s,你仍然可以创建桶索引的冲突.只需添加"容量"的倍数即可.我期望O(n ^ 2)在这种情况下的加法性能,但我懒得弄清楚`HashSet <T>`的首选容量. (2认同)