해시 테이블 A) 소개
비 해시 테이블 특징 : 주어진 값에 따라 달라 테이블에서 키 위치를하고 결정된 사이의 관계를 존재하지 않는,과 각 키워드에 한 번 찾는 과정은 주어진 값, 효율성과 모양을 비교 횟수를 비교.
이 해시 테이블 기능 : 키워드는 테이블 위치 그 사이에 명확한 관계가 존재한다.
해시 기능 : 일반적으로,이 표에서 키를 필요가 저장된 테이블에있는 레코드의 키 위치의 키와 F (키)의 위치와 기능 관계를 구축하기 위해, 일반적으로 함수 f라고 (키)를 해시 함수이다.
해시 : "해쉬"으로 번역은 해시 알고리즘을 통해, 출력으로 고정 된 길이, 임의의 길이의 입력 , 출력은 해쉬 값이다.
이 변환은 인 압축지도 , 의 해시 값 의 공간은 일반적으로 입력 된 공간보다 작은 경우 , 다른 입력이 동일한 출력으로 해시 수는 고유의 해시 값으로부터 상기 입력 값을 결정하는 것이 불가능하다.
전자 메시지의 압축 함수에 대한 길이 (A)의 메시지가 모이 길이를 고정 다이제스트 것을 의미한다.
해시 충돌 : (빅 브라더 자신이 오 썼다는) F (키) 현재 키 값 키 - 값 쌍 (이 해시 맵의 값을 유지하는 방법입니다)로 저장 주소를 얻을 수 있지만, 발견 기능 키를 통해 결과를 기반으로 그것은 밖으로 계산 마지막 주소로 처음이었다. 즉 당신이 그것을 집어 넣은 할 장소입니다. 이 해시 충돌 친구라고
B) 충돌 해시 함수를 처리하는 방법
1) 오픈 어드레싱 방법 :
상기 m은 테이블의 길이는
세 증분 차입 디가 있습니다 :
선형 프로브 재 해시 디 = 1, 2, 3, ..., m-1
광장 프로브 재 해시 디 2 = 1, -12, 22, -22, 32, -32, ..., K2, -k2
( 빅 브라 비고 상기 단일 오른쪽 : 프로브 재 해시의 제곱 의 제곱을 더한 1 1 마이너스 제곱 승을 더한 2 마이너스 제곱 2 제곱 및 3, 플러스 마이너스 (k)의 제곱 ... (3) 평방 제곱 마이너스 k는. 선생님은 당신이 그것을 구덩이 수 거짓말을 문질러? 법률 학교를. 당신이 광장에서 보면 직접 디의 재 해시, 오는 쓰기 교사 PPT를 읽을 수 없습니다 어떻게 감지는이다 평균의 제곱. 위에 빨간색, 교사의 PPT에 해당 함께 볼 수있는 위 사진을 해당.)
디 랜덤 해시 프로브는 의사 난수 시퀀스의 집합
예를 들면 :
나는 함께 그림의 바닥 위에 그 빨간색을 쓴 12 나는 내가 증분 디 원점 위에있는 12을 모를 때 테스트되었습니다. 나는 2 일의 힘이었다 노하우를 제한 모른다. . . . 교사는 너무 게으른 또는 디지털 첨자를 재생 말할 것입니다.
2) 방법 링크 주소
이는 전체 테스트를 넣어 개인적으로 다음, 단지 교사의 PPT 이상입니다.
해시 알고리즘 PPT에 따르면 H (키) 키 = 7 %, 산출 한 해시 값에 대응하는 임시 판정, 전류 값의 해시 값이, 위치 배열에 저장된다.
완성 고려할 후,이 해쉬 값에 따라 될 수 있고, 결과적으로,이 수는 어레이 아래에 배치된다. 그런 내 자신이 스크린 샷이 있습니다.
그리고 위의 PPT 투영은 일치한다.
이 방법의 간단한 설명이 목록 HashMap의 발생 메커니즘의 소스, 자바의 HashMap 그렇게 구현이다.
내부 넣어 () 메서드 호출의 마지막 부분이 다음과 같습니다.
addEntry (해시 키 값은 , i)가
여러 변수의 의미를 설명합니다
. 1 해시 : 키는 계산 된 값에 기초하여, 상기 소스가 적하 -int 해시 = 해시 (키) 그래서,,
아웃 카운트 이 고유 유일지도 결정, 사람을 식별 할 수있는 신분증 번호에 해당
2, 키 : 키는 우리가 키에 키를 넣어 해시 맵을 갈 때에 따라 키를 얻을 수없는 경우,지도를 사용한다는 것입니다 그것을 가치.
3 값 : 전술 한 문제는,이 값은 키 - 값 쌍으로 저장된다.
적하 -int I = indexFor (해시 table.length 소스가되도록 4, I ) 이 의미 하부 첨자 배열의 인덱스에 저장된 실제 값 쌍.
다음 i는 그 값이 배열 첨자 결정된다 PPT 후의 모듈에 대응할 수있다.
시간에 넣어하지만, 확장의 문제가 발생할 수 있습니다,하지만 우리는이 문제를 고려하지 않는, 오직 목록 및 목록의 키의 순서를 생성하는 방법을 고려한다.
createEntry (해시 키 값 bucketIndex);
이 방법은 진정 어레이에 노드를 생성한다.
이러한 매개 변수는 동일하며, 위에서 설명한 바와 같은 의미.
- 어레이 박제에 새로운 노드 새로운 노드 원래 시작 값을 제거한 다음 배열에 배치 //.
- // 즉 뒤에서 진실이다. PPT 그것에 약간의 잘못을 그렸다.
- // 교사 글쎄, 나는 즐겼다, 일반적으로이 물건에 대해 걱정하지 않는다.
- 보이드 createEntry ( INT 해시 키 K, V 값 INT bucketIndex) {
- 항목 <K, V> E = [표 bucketIndex];
- 테이블 [bucketIndex가] = 새로운 엔트리를 <> (해시 키 값, E);
- 크기 ++;
- }
//先从数组上取下原来的值,给塞到新的节点去,然后把新的节点再放到数组上。
//也就是后来居上的道理。ppt上画的也就有点毛病了。
//老师们嘛,就是 混口饭吃,一般都不斤斤计较这东西的。
void createEntry(int hash, K key, V value, int bucketIndex) {
Entry<K,V> e = table[bucketIndex];
table[bucketIndex] = new Entry<>(hash, key, value, e);
size++;
}
- 1
- 이
- 삼
- 4
- 5
- 6
- (7)
- 정적 클래스 엔트리 <K, V> 구현 의 Map.Entry <K, V> {
- 최종 K 키;
- V 값;
- 항목 <K, V> 다음;
- INT 해시;
- / **
- * 새 항목을 작성합니다.
- * /
- 입력 ( INT의 H, K의 K, V (V)의, 입구 <K, V> N) {
- 값 = V;
- 다음 = N;
- 키 = K;
- 해시 = H;
- }
- // ******
static class Entry<K,V> implements Map.Entry<K,V> {
final K key;
V value;
Entry<K,V> next;
int hash;
/**
* Creates new entry.
*/
Entry(int h, K k, V v, Entry<K,V> n) {
value = v;
next = n;
key = k;
hash = h;
}
//******
}
- 1
- 이
- 삼
- 4
- 5
- 6
- (7)
- 8
- 9
- (10)
- (11)
- (12)
- (13)
- (14)
- (15)
상기 모델은 해시 맵 기본 배열 요소에 저장된다. 열쇠 고리도 우리는 해시 맵 1.7 소스 코드에 관심 캔 모양이다, 형성 할 수있다.
3, 4)을 다시 해쉬 공통 플로우 영역의 설립
다시 해쉬 항에있어서,보다 계산 된 해시 방법,보다 계산하고이 반복되는 경우, 다른 알고리즘은 계산. 어쨌든, 많은, 살짝 때까지 반복되지 않습니다. 빅 브라더 추측
일반적인 오버 플로우 영역을 설정 4. 그것은 충돌이없는 테이블 내에서, 다른 장소에있는 것입니다. 모르는 구현은, 빅 브라더는 추측이다.
2. 다음 해싱
3. 체인 어드레스 방법 (자바 해시 맵을 그렇게하는)
공통를 확립 4. 오버 플로우 영역
이 참조, 여전히 쉬운 1.7을 이해하고, 소스 코드를 해시 맵을 중지하고 자신을보고 있고, 또한 주석, 당신은 다음 링크에서 좀 걸릴 수 있습니다했다
레드 - 블랙 트리 또는 뭔가보다 1.7를 이해하는 자바 해시 맵.