2014-12-01 3 views
0

대답은 분명 할 수도 있지만 여전히 물어볼 필요가 있습니다. 그래서 재미 있고 훈련 된 간단한 Linked_List를 프로그래밍하여 이 목록의 요소를 인쇄하는 한 가지 방법이 실제로 목록을 뒤로 인쇄하는 방법보다 빠르게 실행된다는 것을 알았습니다.Linked_List 탐색에 관한 수수께끼

나는 이것을 설명하는 이유에 대해 계속 생각해 봤지만 나는 계속해서 동그라미로 가고 있었고, 나는 그 이유를 아는 것이 흥미로울 것이다. 여기

내 첫번째 방법


여기
public void list(){ 
    Node<E> iter = head; 
     while(iter != null){ 
      System.out.print(iter.getValue() + ", "); 
      iter = iter.getNext(); 
     } 
} 

다른 방법이다 (이 목록의 간단한 이송 임), 상기 목록 후방


public void list_inverse(){ 
    Node<E> iter = head; 
    Stack<Node<E>> stack = new Stack<Node<E>>(); 
     while(iter != null){ 
      stack.push(iter); 
      iter = iter.getNext(); 
     } 
     while(!stack.isEmpty()){ 
      Node<E> tmp = stack.peek(); 
      stack.pop(); 
      System.out.print(tmp.getValue() + ", "); 
     } 
} 
에게 인쇄

두 번째 방법의 아이디어는 go입니다. 목록을 통해 각 항목을 스택에 추가하십시오. 끝에 도달하면 스택에 포함 된 요소를 인쇄합니다. 두 번째 방법은 더 오랜 기간 실행해야합니다. 주요 방법


우리는이 :

long startTime = System.nanoTime(); 
    list.list(); 
    long ElapsedTime = System.nanoTime(); 
    System.out.println(); 
    long startTime2 = System.nanoTime(); 
    list.list_inverse(); 
    long ElapsedTime2 = System.nanoTime(); 

출력이 내가 가진 : 자바에서


give the number for the list, if you want to stop, write stop 
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
stop 

1, 2, 3, 4, 5, 6, 7, 8, 9, 10, //first method 
10, 9, 8, 7, 6, 5, 4, 3, 2, 1, // second method 

it has taken 8.15E-5 second for list and 5.19E-5 second for list_inverse 
+4

다음을 읽어주십시오. http://stackoverflow.com/questions/504103/how-do-i-write-a-correct-micro-benchmark-in-java – NPE

+3

있습니다. 신비가 없다. 이것은 오도 된 결과를주는 잘못 설계된 마이크로 벤치 마크의 또 다른 경우입니다. 힌트 : NPE의 링크를 읽으십시오. –

+0

좋아, 답장을 보내 주셔서 감사합니다. 정말 빨리 다른 질문을 물어봐도 될까요? 몇 달 전에 프로그래밍을 배우기 시작했는데, 언제 중간 프로그래머라고 생각하면 초보자 상태가 될 수 있는지 알고 싶습니다. –

답변

0

스택은 내부적으로 Vector를 사용합니다. Vectorarray을 사용하기 때문에 연속 된 메모리 위치에 요소를 저장합니다. 따라서 jvm은 값을 검색하기 위해 참조가 가리키는 메모리 위치로 갈 필요가 없습니다. 다음 메모리 위치를 스캔하여 값을 얻을 수 있습니다.

이것이 첫 번째 및 두 번째 방법의 실행 시간 차이의 주요 이유라고 생각합니다. 이것은 순수 추측입니다. ;-)

+0

당신은 스택 부분이 추가로 이루어 졌음을 간과하고,) – zapl

+0

당신은 getValue()를 호출하지 않습니다. 따라서 값이 저장되는 메모리 위치로 이동하지 않습니다. –

+1

그리고 그것은 진짜 설명이 아닙니다. 진짜 설명은 벤치 마크가 JVM 웜업 등을 적절히 고려하지 않기 때문에 가짜 결과를 제공한다는 것입니다. –