在Java

时间:2018-01-16 17:42:25

标签: java algorithm

我在项目中使用Java Linkedlist。我必须构建一个delete函数,该函数在id中删除具有指定唯一idLinkedlist是我班级中的文件)的元素。根据Java官方文档,如果我使用LinkedList.remove,运行时将是O(n),因为该过程分两步进行,第一步是线性搜索,运行时为{{1}然后是实际删除O(n)

为了加快速度,我想使用二叉树进行查找,其中树中的每个节点都是O(1)。我不确定如何在Java中实现它。在C / C ++中,可以将指针存储为(id, reference to the node in the linkedlist)

==

如果您想知道为什么我必须使用reference to the node in the linkedlist,那是因为我正在为交换构建订单匹配引擎。就LinkedList而言,LinkedList提供了优越的运行时间。我也使用插入排序来保持订单中的价格排序。优先级队列不符合我的需要,因为我必须实时显示已排序的订单簿。

4 个答案:

答案 0 :(得分:3)

您是否看过Stroustrup会议演讲的视频,他表示您应该使用std::vector,除非您使用std::vector测量了的性能优势?他表明std::vector几乎总是使用正确的集合,并且表明它比链表更快,即使在中间插入和删除

现在将其转换为Java:使用ArrayList,除非您使用其他内容衡量了更好的性能。

为什么?使用现代处理器体系结构,可以获得一个位置优势:您可以比较的元素,您一起处理的元素,都在内存中彼此相邻存储,并且可能同时位于CPU的缓存中。这使得它们的获取和写入速度比它们在主存储器中的速度快得多。链表不是这种情况,其中元素是单独分配的,并且遍布整个地方。 (这个位置的好处在C ++中更加明显,你可以将实际的对象彼此相邻,但它在Java中仍然有效,在那里你有彼此相邻的引用,尽管不是实际的对象。)

现在使用ArrayList,您可以按价格对订单进行排序,并使用二进制搜索在正确的位置插入订单。

如果您的性能测量结果显示LinkedList更受欢迎,那么遗憾的是Java并不能让您访问LinkedList的内部表示 - 实际节点 - 因此您必须自行创建自己的列表。

答案 1 :(得分:2)

为什么使用\r

如果每个对象都有唯一的ID,为什么不将它放在List中,并将id作为密钥?如果选择HashMap,则实现删除是Map。如果您使用O(1)实施,也可以保留广告订单。

LinkedHashMap插入优于....什么?

HashMap get/put complexity

答案 2 :(得分:0)

要按ID保留顺序并获得良好的性能,请使用TreeMap。 Put,remove和get操作将为O(log n)。

修改

为了保留每个id的元素插入顺序,你可以使用 TreeMap<整数,ArrayList< T> > ,即对于每个ID,您可以按插入顺序保存列表中具有特定ID的元素。

答案 3 :(得分:0)

您可以通过稍加改动轻松解决此问题。 首先有一个对象,其值和id为字段

class MyElement implements Comparable{
   int id,value;

   //Implement compareTo() to sort based on values

   //Override equals() method to compare ids

   //Override hashcode() to return the id
 }

现在使用TreeSet存储这些对象。

在这个数据结构中,传入的对象被排序,删除和插入也发现O(log n)的时间复杂度更低