请告诉我下面函数Remove
的时间复杂度是O(n)还是O(n * n)?
它删除集合中与值提供的值匹配的第一个项目,如果删除了值,则返回true
。否则返回false
。
public bool Remove(T item)
{
for (int i = 0; i < Count; i++)
{
if (_items[i].Equals(item))
{
RemoveAt(i);
return true;
}
}
return false;
}
public void RemoveAt(int index)
{
if (index >= Count)
{
throw new Exception("Index out of Range");
}
var sourceIndex = index + 1;
Array.Copy(_array, sourceIndex, _array, index, _array.Length - sourceIndex);
Count--;
}
答案 0 :(得分:0)
public bool Remove(T item)
{
for (int i = 0; i < Count; i++) // say count = n. this loop will run n times.
{
if (_items[i].Equals(item)) // say if operation takes 10 units of time
{
RemoveAt(i);
return true; // say this operation takes 2 units of time
}
}
return false; // say this operation takes 2 units of time
}
public void RemoveAt(int index) {
if (index >= Count) // say this operation takes 10 units of time
{
throw new Exception("Index out of Range"); // say this operation takes 4 units of time
}
var sourceIndex = index + 1; // say this operation takes 2 units of time
Array.Copy(_array, sourceIndex, _array, index, _array.Length - sourceIndex); // say this operation takes 10 units of time
Count--; // say this operation takes 5 units of time
}
这意味着RemoveAt
需要10 + 4 + 2 + 10 + 5个单位时间= 31个单位时间
并且Remove
需要n *(10 + 31 + 2)个时间单位= n * 43个单位时间。
任何花费一定时间的操作称为O(1)
操作。因此,Remove
需要n * O(1)
个时间单位,大约为O(n)
答案 1 :(得分:0)
您的算法最多需要 O ( n )步骤:
RemoveAt
中复制数组最多需要 O ( n )步骤。Remove
中的数组也需要最多 O ( n )步骤。RemoveAt
最多从Remove
调用一次,因此总运行时间为: O ( n )+ 1 * O ( n )= O ( 2n )= O ( n )。