使用O(1) - java的运行时查找最小数字

时间:2013-04-06 17:30:28

标签: java algorithm data-structures

我需要根据链表,数组和常量内存使用来创建数据结构。

作为输入,我得到两个数字:N和M.

N表示磁盘上的最大容量,M表示计算机硬盘的最大容量,因此M> N.

所以我需要创建一个程序,将信息从硬盘驱动器“移动”到磁盘上,该程序需要实现以下方法:

  1. 插入(数据) - 将数据插入到磁盘上,如果已满,则删除最不重要的数据(*):最坏情况下的运行时间O(1)。
  2. 删除(数据) - 从磁盘锁上删除给定数据 - O(1)
  3. (*)用户可以更改文件重要性。

    最大内存使用量为O(M)

    到目前为止我做了什么:

    我创建了一个“保存”计算机数据的数组[1 ... M],我创建了一个双向链表,用于存放磁盘上的数据。 [这个想法是:每次将数据添加到磁盘上时,它都会被添加到链表中,我可以使用数组作为索引(/ key)存储直接转到数据。]

    我的电脑数据字段:

    node firstNode;
    node currentNode; 
    node[] dataCollection; // Will hold computer hard-drive data
    

    所以我想创建方法用我想添加的数据替换最不重要的数据[所以我可以在插入中使用],我的代码替换:

    public void replace(int leastImportantdata, int insertData){
        node leastImportant = dataCollection[leastImportantdata];
        if (leastImportant.prev!=null) leastImportant.prev.next=dataCollection[insertData-1];
        if (leastImportant.next!=null) leastImportant.next.prev=dataCollection[insertData-1];
        numOfReplacements++;
    

    因此,我的主要问题是在给定这两个“组合”数据结构的情况下找到最不重要的数据,并且仍然保持O(1)的运行时间,特别是当用户决定更改文件重要性时。

    • 假设我们从{4,3,2,1}开始(数字表示重要性)​​最不重要的数据是1.突然,用户决定将最后一个文件的重要性更改为5,我们得到{4,3 ,2,5}和最不重要的数据是2。

    有什么想法吗?

2 个答案:

答案 0 :(得分:-1)

能够找出您需要订单的最不重要的数据到您的列表。

首先想到链表的排序是否重要?您似乎是根据索引获取数据,而不是遍历列表。 (如果该顺序很重要,我的答案的其余部分可能不是很有帮助:D)。

这意味着您可以将项目插入到列表中,以便按优先级最低的顺序对它们进行排序,这样只要您引用列表的头部,就可以获得要以恒定性能删除的项目。 。

这不幸导致插入的复杂性上升。要解决此问题,您可以使用该优先级保留链接列表中最后一个(可能是第一个)文件的优先级映射。

使用此地图,您应该能够立即找出需要插入新文件的位置,从而获得持续的性能。

所以,如果您有3个文件P(A)= 1,P(B)= 3,P(C)= 3,您的地图将看起来像1-(A,A)3->(B ,C)说如果你想插入优先级为1的另一个文件,它应该在A之后,如果你想插入一个优先级为2的文件,它应该在B之前。

显然,我假设这里有一些可能的优先级,并且使用的优先级之间没有差距。 (这需要搜索)

希望这有帮助

答案 1 :(得分:-1)

我对解决问题的建议如下:

  • 定义节点类以实现Comparable接口。

  • 将数据集实现为跳过列表 - 您可以使用ConcurrentSkipListMap来执行此操作。

使用SkipList实现可以确保条目按其重要性排序。

根据Java API doc - 此类(ConcurrentSkipListMap)实现SkipLists的并发变体,为containsKey,get,put和remove操作及其变体提供预期的平均log(n)时间成本。

通常,实现允许项目查找的效率与平衡二叉搜索树(即number of probes proportional to log n instead of n)相当。

最后在SkipList上查看 [here]以及如何编写自己的实现。