네의 해시 테이블 (a)는 해결 충돌에 접근

해시 테이블 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);
이 방법은 진정 어레이에 노드를 생성한다.
이러한 매개 변수는 동일하며, 위에서 설명한 바와 같은 의미.

  1. 어레이 박제에 새로운 노드 새로운 노드 원래 시작 값을 제거한 다음 배열에 배치 //.  
  2. // 즉 뒤에서 진실이다. PPT 그것에 약간의 잘못을 그렸다.  
  3. // 교사 글쎄, 나는 즐겼다, 일반적으로이 물건에 대해 걱정하지 않는다.  
  4.    보이드  createEntry ( INT  해시 키 K, V 값  INT  bucketIndex) {  
  5.        항목 <K, V> E = [표 bucketIndex];  
  6.        테이블 [bucketIndex가] =  새로운  엔트리를 <> (해시 키 값, E);  
  7.        크기 ++;  
  8.    }  
   //先从数组上取下原来的值,给塞到新的节点去,然后把新的节点再放到数组上。
    //也就是后来居上的道理。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)
  1.   정적 클래스  엔트리 <K, V>  구현  의 Map.Entry <K, V> {   
  2.       최종  K 키;  
  3.       V 값;  
  4.       항목 <K, V> 다음;  
  5.       INT  해시;  
  6.       / ** 
  7.        * 새 항목을 작성합니다. 
  8.        * /  
  9.       입력 ( INT의  H, K의 K, V (V)의, 입구 <K, V> N) {  
  10.           값 = V;  
  11.           다음 = N;  
  12.           키 = K;  
  13.           해시 = H;  
  14.       }  
  15. // ******  
    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. 그것은 충돌이없는 테이블 내에서, 다른 장소에있는 것입니다. 모르는 구현은, 빅 브라더는 추측이다.

다음 네 줄을 요약하는 단어입니다 :
1. - 어 드레서 (재 해시 보조 프로브의 그 해시 프로빙하고 의사 랜덤 해시 검출 선형)
2. 다음 해싱
3. 체인 어드레스 방법 (자바 해시 맵을 그렇게하는)
공통를 확립 4. 오버 플로우 영역


이 참조, 여전히 쉬운 1.7을 이해하고, 소스 코드를 해시 맵을 중지하고 자신을보고 있고, 또한 주석, 당신은 다음 링크에서 좀 걸릴 수 있습니다했다

자바 

1.8 해시 맵의 연결 인형의 좋은 이해

레드 - 블랙 트리 또는 뭔가보다 1.7를 이해하는 자바 해시 맵.



게시 94 개 원래 기사 · 원의 찬양 (55) · 전망 (110) 000 +

추천

출처blog.csdn.net/Suubyy/article/details/100120892