2012-11-22 2 views
0

그래서 연결된 배열 목록을 사용하는 해시 테이블을 만듭니다. 왜 이것이지 설명하기 위해 잠시 시간을 내 보자.해시 테이블에 대한 배열의 연결된 목록 배열

그래서 이전에 배열을 생성하여 해시 테이블을 구현했으며 배열의 각 요소는 링크 된 목록입니다. 이렇게하면 배열에서 해시 값을 먼저 검색하고이 LL의 요소를 검색하여 450,000 개의 LL LL을 빠르게 찾을 수 있습니다. 이 프로젝트는 학교 프로젝트이며 java와 함께 제공되는 해시 테이블을 사용할 수 없다는 점을 덧붙여 야합니다.

지금 나는 비슷한 것을하고 싶다. 그러나 나는 방대한 LL을 가지고있다. 여기서 LL의 각 요소는 4 요소 배열로 표현되는 텍스트 파일의 줄입니다. 여기서 4 개의 요소 각각은 입력 파일에서 탭으로 구분 된 다른 문자열입니다. 각 행에있는 두 번째, 세 번째 및 네 번째 문자열에 빠르게 액세스 할 수 있어야합니다. 이제이 배열의 요소입니다.

그래서 내가 원하는 것은 배열의 LL 배열을 만들 수 있다는 것입니다 ... 먼저 배열의 두 번째 요소의 ascii 값의 합계를 찾습니다. 그런 다음 해시 테이블에이 값을 사용하여 전체 배열을 해시합니다. 그런 다음 나중에이 요소를 찾아야 할 때 배열의 해당 요소로 이동합니다. 여기에 배열 목록이 있습니다. 목록에서 각 배열의 두 번째 값을 검색합니다. 원하는 배열을 찾으면 배열을 반환하고 배열의 3 번째와 4 번째 요소를 사용합니다.

내가 말했듯이, LL의 배열에 대해서는이 작업을 잘 수행하지만 배열의 추가 차원을 추가하면 완전히 제거됩니다. 나는 그것이 배열의 LL 배열 (public static LinkedList [] RdHashLL)을 성공적으로 초기화했기 때문에 구문을 알아내는 것만으로 생각한다. 그래서 자바가 교장으로 괜찮다. 그러나 해시 테이블에 요소를 넣는 방법과 읽는 방법을 알지 못합니다.

다음은 FINE을 사용하는 연결된 목록 배열에 대한 코드입니다. ARRAY OF ARRAYS에서 작동하도록 도움이 필요합니다.

public class TableOfHash{ 

public static LinkedList<String>[] HashLL; 

//HASH FUNCTION - Finds sum of ascii values for string 
public static int charSum(String s){ 
    int hashVal = 0; 
    int size = 1019; //Prime Number around size of 8 char of 'z', (8 chars is amoung largest consistantly in dictionary) 

    for(int i = 0; i < s.length(); i++){ 
     hashVal += s.charAt(i); 
    } 
    return hashVal % size; 
} 

//CREATE EMPTY HASH TABLE - Creates an array of LL 
public static void makeHash(){ 
    HashLL = new LinkedList[1019]; 
    for(int i=0; i<HashLL.length; i++){ 
     HashLL[i] = new LinkedList<String>(); 
    } 
} 

//HASH VALUES INTO TABLE! 
public static void dictionary2Hash(LinkedList<String> Dict){ 
    for(String s : Dict){ 
     HashLL[charSum(s)].add(s); 
     //Finds sum of char vales of dictionary element i, 
     //and then word at i to the HashLL at point defined 
     //by the char sum. 
    } 
    //Print out part of Hash Table (for testing! for SCIENCE!) 
    //System.out.println("HASH TABLE::"); 
    //printHashTab(); 
} 

//SEARCH HashTable for input word, return true if found 
public boolean isWord(String s){ 

    if(HashLL[charSum(s)].contains(s)){ 
     wordsfound++; 
     return true; 
    } 
    return false; 
} 

}

나는이를 변경하는 몇 가지 시도를하지만 (HashLL은 [charSum이 (들)]. 포함 (들)) 경우 것들에 대한 요소의 LL을 검색하는 charsum에 의해 반환처럼 한 (들) ... 나는 그것이 문자열의 아니라 배열의 LL 때 작동하도록하는 방법을 잘 몰라. 나는 HashLL [charSum (s)]. [1] .contains (s)), HashLL [charSum (s)]. contains (s)), 그리고 여러 가지 다른 것들을 지쳤다.

Google에서 "연결된 목록의 배열"(따옴표 포함) 배열이 비어있는 검색이 도움이되지 않는다는 사실이 도움이되지 않았습니다.

마지막 비트. 내가 원하는대로 할 수있는 또 다른 데이터 구조가 있다는 것을 알고 있습니다. 그러나 배열의 LL 배열이 완전히 희망없는 이유라고 생각하지 않는 한, 나는 그것을 그대로 작동시키고 싶습니다.

+0

당신은'LinkedList [] hashLL;'을 찾고 계십니까? – jlordo

+0

당신은 이런 종류의 데이터 구조를 위해 google guava 라이브러리를 사용할 수 있습니다. –

+0

public static LinkedList [] RdHashLL로 잘 초기화 할 수 있지만, 값을 추가하고 작동 할 수없는 값을 검색하는 기능적으로 작동하게합니다. –

답변

1

당신이

LinkedList<String[]>[] hashLL; 

당신이

String str = hashLL[outerArrayIndex].get(listIndex)[innerArrayIndex]; 

이 필드에 작성하는 방법과 같은 특정 문자열 (여러 가지 방법 중 하나를) 읽을 수있는 경우,이 (가정 모든 것이 제대로 초기화 할 수있다).

String[] arr = hashLL[outerArrayIndex].get(listIndex); 
arr[index] = "value"; 
+0

감사합니다. 이것은 (내가해야 할 일에 대한 사소한 변화와 함께) 효과가 있었다. 고마워요! –