所以我有一个赋值,要求我修改遍历双向链表的方法。我得到了它的工作,但我们的教授。如果方法比他提供的方法工作得更快,那么设置它只能获得满分。该列表是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毫秒,即使速度更快,他预计第一种方法需要花费四分之一的时间。这可能吗?
答案 0 :(得分:0)
一些想法:
1) 在第二个解决方案中,始终搜索middleNode,但每次都不需要它(特别是在if-parts nearfront和nearlast)。如果只在需要时确定middleNode,它会更快。
2)迭代更快,因为该方法知道middleNode的位置。也许&#34; quaterNodes&#34;帮助
3)有时,重复迭代比循环更快。而不是循环调用一个距离所需位置更近一步的方法。 拥有10000个元素并不会有任何限制。