如何在java中提高双向链表的性能?

时间:2014-09-23 01:43:49

标签: java performance doubly-linked-list

所以我有一个赋值,要求我修改遍历双向链表的方法。我得到了它的工作,但我们的教授。如果方法比他提供的方法工作得更快,那么设置它只能获得满分。该列表是10000个元素。

这是原始遍历列表的方式:

private Node getNodeAt(int givenPosition)
{
    Node currentNode = firstNode;

    for(int counter = 1; counter < givenPosition; counter++)
    {
        currentNode = currentNode.next;
    }

    return currentNode;

这需要大约1331毫秒。 这是我们被告知遍历列表的一种方式:

    private Node getNodeAt2(int givenPosition)
    {
     Node currentNode = firstNode;
     middleNode = firstNode;
     boolean nearFront = givenPosition <= (numberOfEntries / 4);
     boolean nearFrontMid = (givenPosition < (numberOfEntries / 2)) && (givenPosition > (numberOfEntries / 4));
     boolean nearBackMid = (givenPosition >= (numberOfEntries / 2)) && (givenPosition < ((3*numberOfEntries) / 4));
     boolean nearLast = (givenPosition >= ((3*numberOfEntries) / 4));

     middlePosition = numberOfEntries / 2;

     for(int counter = 1; counter < middlePosition; counter++)
     {
      middleNode = middleNode.next;
     }

     if(nearFront){
       currentNode = firstNode;
     for(int counter = 1; counter < givenPosition; counter++)
        {
         currentNode = currentNode.next;
        }
     }
     if(nearFrontMid){
       currentNode = middleNode;
       for(int counter = 1; counter <= (middlePosition - givenPosition) ; counter++)
         {
         currentNode = currentNode.previous;
         }

     }
     if(nearBackMid){
       currentNode = middleNode;
       for(int counter = 1; counter <= (givenPosition - middlePosition); counter++)
        {
        currentNode = currentNode.next;
        }

     }
     if (nearLast){
       currentNode = lastNode;
       for(int counter = 1; counter <= (numberOfEntries - givenPosition); counter++)
     {
      currentNode = currentNode.previous;
     }
  }

    return currentNode;

这个需要大约800毫秒,即使速度更快,他预计第一种方法需要花费四分之一的时间。这可能吗?

1 个答案:

答案 0 :(得分:0)

一些想法:

1) 在第二个解决方案中,始终搜索middleNode,但每次都不需要它(特别是在if-parts nearfront和nearlast)。如果只在需要时确定middleNode,它会更快。

2)迭代更快,因为该方法知道middleNode的位置。也许&#34; quaterNodes&#34;帮助

3)有时,重复迭代比循环更快。而不是循环调用一个距离所需位置更近一步的方法。 拥有10000个元素并不会有任何限制。