这个BinaryHeap代码的大O表示法

时间:2015-02-20 08:18:54

标签: c# big-o

我正在尝试确定基于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);

这是对的吗?

0 个答案:

没有答案