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

标签 java data-structures queue priority-queue

我的代码现在有 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]; }

最佳答案

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

或者为了更好的实现,您可能需要考虑 Fibonacci heap .

关于java - 使用数组的 O(1) 插入时间的优先级队列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4071114/

相关文章:

java - 存在可选的长参数,但不能转换为空值

java - 如何避免java.sql.SQLException :[Microsoft][ODBC Microsoft Access Driver] could not find file '(unkown)'

c++ - 创建自定义图形数据结构是否违反任何原则?

python - multiprocessing.Queue 不能作为类中的实例变量工作?

multithreading - KeyError 将 keras.utils.Sequence 与 keras.model.fit_generator 一起使用

java.lang.unsatisfied链接错误。在eclipse中为Android应用程序添加.so文件的位置

java - 无法使用 Windows-64 位连接到 MS Access DB

c++ - 表示层次结构的数据结构

java - Java的PriorityQueue构造函数调用和addAll方法的区别

grails - 如何在Grails应用程序中创建作业和队列