我正在尝试确定基于Jim Mischel BinaryHeap class的两种方法的Big O表示法。
public void Add(T item) {
int i = _items.Count;
_items.Add(item);
while (i > 0 && _items[(i - 1) / 2].CompareTo(item) > 0) {
_items[i] = _items[(i - 1) / 2];
i = (i - 1) / 2;
}
_items[i] = item;
}
public T Remove() {
T firstItem = _items[0];
T tempItem = _items[_items.Count - 1];
_items.RemoveAt(_items.Count - 1);
if (_items.Count > 0) {
int i = 0;
while (i < _items.Count / 2) {
int j = (2 * i) + 1;
if ((j < _items.Count - 1) && (_items[j].CompareTo(_items[j + 1]) > 0)) ++j;
if (_items[j].CompareTo(tempItem) >= 0) break;
_items[i] = _items[j];
i = j;
}
_items[i] = tempItem;
}
return firstItem;
}
对于Add
方法,我认为它是O(log(n))
,因为循环似乎是以下形式:
for(int i = n; i > 0; i=(i-1)/2);
对于Remove
方法,我认为它是O(log(log(n))
,因为循环似乎是以下形式:
for(int i=0; i < n/2; i = (2*i)+1);
这是对的吗?