.net 大O表示法-使用哈希集查找的循环的正确定义

.net 大O表示法-使用哈希集查找的循环的正确定义,.net,big-o,computer-science,.net,Big O,Computer Science,根据我的理解,一个简单的for循环的复杂性为O(n) 如果我在foreach中引入散列查找,会不会将复杂性保持在O(n) var id=new HashSet(); foreach(记录中的var记录){ bool isRecordInIdSet=ids.Contains(record.id); } 同样,如果HashSet是一个列表,这会使复杂性增加到O(n^2)吗 var id=new List(); foreach(记录中的var记录){ bool isRecordInIdSet=ids

根据我的理解,一个简单的for循环的复杂性为O(n)

如果我在foreach中引入散列查找,会不会将复杂性保持在O(n)

var id=new HashSet();
foreach(记录中的var记录){
bool isRecordInIdSet=ids.Contains(record.id);
}
同样,如果HashSet是一个列表,这会使复杂性增加到O(n^2)吗

var id=new List();
foreach(记录中的var记录){
bool isRecordInIdSet=ids.Contains(record.id);
}
我是从这个问题中得出结论的
,并希望确保我的理解是正确的。请添加您认为有助于理解Big-O术语的任何其他信息。

您的解释是正确的,哈希查找是O(1),因此重复n次会给您带来O(n)复杂性

哈希查找是具有正确实现的哈希代码的对象的恒定时间(即O(1))。由于您使用的是
int
,哈希代码本身就是数字,因此获得了非常好的实现,确保了恒定的时间访问

如果HashSet是一个列表,这会使复杂性增加到O(n2)吗


从技术上讲,它应该是O(n*m),其中
m
表示
id
列表中的项目数。

您对列表与hashmap的分析是正确的

var ids = new HashSet<int>();

foreach(var record in records) {
   bool isRecordInIdSet = ids.Contains(record.id); // this is O(1)
}
var id=new HashSet();
foreach(记录中的var记录){
bool isRecordInIdSet=ids.Contains(record.id);//这是O(1)
}
哈希表具有恒定的查找时间(O(1))。所以for循环的时间复杂度为O(n),其中n是记录数

var ids = new List<int>();
foreach(var record in records) {
   bool isRecordInIdSet = ids.Contains(record.id); // this is O(m), where m is the size of list ids
}
var id=new List();
foreach(记录中的var记录){
bool isRecordInIdSet=ids.Contains(record.id);//这是O(m),其中m是列表id的大小
}

使用列表时,.Contains方法有O(n)个时间,因为在最坏的情况下,您要查找的项位于列表的最末端,因此必须遍历整个列表并进行n-1比较。实际上,您不必每次都这样做,但请记住,Big-O表示法与最坏情况有关。如果ids list和records list的大小取决于同一个变量,则此for循环具有O(n^2)。否则,它将是O(n*m),其中n是记录的大小,m是id的大小。

感谢您的回复。因此,当谈到big-O时,变量n是否对应于算法将运行的次数?@contactmatt不完全-
n
是与算法中的一个步骤将要运行的次数成线性增长的数字。例如,For(inti=0;i是O(N),即使它运行N次的十分之一。
var ids = new List<int>();

foreach(var record in records) {
   bool isRecordInIdSet = ids.Contains(record.id);
}
var ids = new HashSet<int>();

foreach(var record in records) {
   bool isRecordInIdSet = ids.Contains(record.id); // this is O(1)
}
var ids = new List<int>();
foreach(var record in records) {
   bool isRecordInIdSet = ids.Contains(record.id); // this is O(m), where m is the size of list ids
}