.net 大O表示法-使用哈希集查找的循环的正确定义
根据我的理解,一个简单的for循环的复杂性为O(n) 如果我在foreach中引入散列查找,会不会将复杂性保持在O(n).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
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;ivar 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
}