我需要根据链表,数组和常量内存使用来创建数据结构。
作为输入,我得到两个数字:N和M.
N表示磁盘上的最大容量,M表示计算机硬盘的最大容量,因此M> N.
所以我需要创建一个程序,将信息从硬盘驱动器“移动”到磁盘上,该程序需要实现以下方法:
(*)用户可以更改文件重要性。
最大内存使用量为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)的运行时间,特别是当用户决定更改文件重要性时。
有什么想法吗?
答案 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]以及如何编写自己的实现。