使用数组插入时间为O(1)的优先级队列?

Sahat Yalkabov:

我的代码现在具有O(N)插入时间和O(1)移除时间。我需要对此进行更改。我正在尝试实现O(1)插入时间和O(N)删除时间。

传说:

nItems =项目/对象数。最初设置为0。

queArray是我的长整数数组。

这是我的两种方法。插入方法完成所有排序工作。Delete方法仅一行-删除数组中的第一个元素,由于我们的Insert方法,该元素恰巧是最小的数字。

如果我将插入时间更改为O(1),是否需要提供“排序任务”以删除方法?毕竟这是一个优先级队列,我们​​必须对其进行排序,否则它将只是一个具有随机顺序编号的常规队列。

请,任何帮助都很好!!!

public void insert(long item) {
    int j;
    if(nItems==0) // if no items,
        queArray[nItems++] = item; // insert at 0
    else {
        for(j=nItems-1; j>=0; j--) { // start at the end
            if( item > queArray[j] ) // if new item larger,
                queArray[j+1] = queArray[j]; // shift upward
            else // if smaller,
                break; // done shifting
        } // end for

        queArray[j+1] = item; // insert it
        nItems++;
    } // end else (nItems > 0)
} 

public long remove() // remove minimum item
{ return queArray[--nItems]; }
卢克·赫特曼(Luke Hutteman):

如果您需要O(1)插入时间和O(N)去除时间,只需将未排序的新元素添加到内部数组的末尾,然后在列表中进行O(N)线性搜索以去除,将其余的排列下来一个。

为了更好的实现,您可能需要考虑使用Fibonacci堆

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章