Chapter 3. Separate Chaining Hashing (2)
13062 ワード
同じハッシュ値を持つ要素をリストに接続
M:アドレス空間,N:要素数->M6155 h(キー):0からM–1の間にマッピングされた整数i
᠋挿入:iの最初のリストの一番前(存在しない鍵の場合)に追加
᠋検索:最初のリストのみチェック
基本概念
᠋同じハッシュ値を持つ要素はSequentialSearchstにより実現される
実施方法
M個のアレイを準備する
配列ごとにSequentialSearchstの参照を格納する
get()やput()などの関数はSequentialSearchstのget()やput()を用いて実現する
ソート演算はサポートされていません
M:アドレス空間,N:要素数->M
᠋挿入:iの最初のリストの一番前(存在しない鍵の場合)に追加
᠋検索:最初のリストのみチェック
基本概念
᠋同じハッシュ値を持つ要素はSequentialSearchstにより実現される
実施方法
M個のアレイを準備する
配列ごとにSequentialSearchstの参照を格納する
get()やput()などの関数はSequentialSearchstのget()やput()を用いて実現する
ソート演算はサポートされていません
public class SeparateChainingHashST<K,V> {
private int N; // 테이블에 입력된 원소의 수
private int M; // 해시 테이블의 크기
private SequentialSearchST<K,V>[] st; // 순차 연결 리스트의 배열로 테이블 구성
public SeparateChainingHashST() { this(997); } // default: 소수
public SeparateChainingHashST(int M) { // M을 입력받는 생성자
this.M = M;
st = (SequentialSearchST<K,V>[]) new SequentialSearchST[M];
for (int i = 0; i < M; i++)
st[i] = new SequentialSearchST<K,V>();
}
public boolean contains(K key) { return get(key) != null; }
public boolean isEmpty() { return N == 0; }
public int size() { return N; }
// 해시 함수: M으로 나머지 연산
private int hash(K key) { return (key.hashCode() & 0x7fffffff) % M; }
public V get(K key) { return st[hash(key)].get(key); } // 리스트를 검색
public void put(K key, V value) { // 리스트에 추가
if (!contains(key)) N++;
st[hash(key)].put(key, value);
}
public void delete(K key) { // 리스트에서 삭제
if (!contains(key)) return;
st[hash(key)].delete(key); N--;
}
public Iterable<K> keys() { // 각 리스트의 원소들을 모두 포함
ArrayList<K> keyList = new ArrayList<K>(N);
for (int i = 0; i < M; i++)
for (K key : st[i].keys())
keyList.add(key);
return keyList;
}
}
Reference
この問題について(Chapter 3. Separate Chaining Hashing (2)), 我々は、より多くの情報をここで見つけました https://velog.io/@ilil1/Chapter-3.-Separate-Chaining-Hashing-2テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol