2014-10-07 6 views
0

여기에 무한 루프가 있습니다. 내가 여기 고려하지 않았을 수도있는 가장자리 사건을 찾는 데 도움이 필요하다.무한 루프 동안 실행

table은 (키, 값) 쌍의 배열입니다. isRemoved() 테이블의 요소에 플래그를 지정합니다 (제거 된 경우).

index은 'key'의 해싱 함수에서 파생되었습니다. 여기서는 해시 테이블에 요소를 추가하려고합니다. 이 제 if

if (table[index].isRemoved()) { 
       if (removed != -1) { 
        removed = index; 
       } 
} 

인덱스에서

int removed = -1; 
      while (table[index] != null) { 
       if (table[index].isRemoved()) { 
        if (removed != -1) { 
         removed = index; 
        } 
       } else { 
        if (key.equals(table[index].getKey())) { 
         dData = table[index].getValue(); 
         table[index].setValue(value); 
         return dData; 
        } else { 
         index++; 
         index %= startingSize; 
        } 
       } 
      } 
      if (removed != -1) { 
       index = removed; 
      } 

답변

0
  • 당신 논리 요소를 추가하지만, 기존의 값을 갱신되지 않은 액세스하지된다.
  • 또한 순환 논리가 있습니다. "index % = startingSize;"를 제거하십시오.
  • 인덱스가 테이블 크기에 도달하면 [인덱스] 테이블이 null이 될 것입니까?
+0

기존 값을 업데이트 할 필요가 없습니다. 내가 성취하려고 노력하는 것은 선형 충돌에 의한 충돌 해결입니다. 따라서 인덱스가 사용되면 값은 다음 인덱스를 확인해야합니다. 그 경우에도 다음 색인을 확인하고 그때까지 빈 색인을 찾습니다. 끝까지 도달하면 0으로 돌아와 시작해야합니다. 테이블 [인덱스]가 null 일 수도 있고 아닐 수도 있습니다. –

+0

초기 질문에 "여기에 해시 테이블에 요소를 추가하려고합니다."라고 표시됩니다. 어쨌든, 왜 첫 번째 패스에서 충돌이 없다는 것을 깨달았을 때, 다시 0으로 돌아가서 처음부터 다시 시작하고 싶습니까? 테이블이 별도의 스레드에서 업데이트 될 것으로 기대하십니까? 그럼 분명히 동기화 부분은주의를 기울이지 않습니다. – KiranCK

0

은 증가되지 않는 어떠한 다른 코드

+0

그래서 if 조건 내에서 색인을 증가 시켰습니다. 그것은 여전히 ​​무한 루프입니다. –