어떻게 해시 맵을 실현합니까
O(1)
또는 정해진 시간에 찾을 수 있기 때문에 수조가 특정 색인에서 원소를 찾는 기능은 매우 놀랍다.그러나, 우리는 통상적으로 색인을 통해 찾을 수 없거나 실행할 수 없습니다.해시영사와 해시표는 이 문제를 해결하는 방법의 하나로 우리가 keys
를 통해 찾을 수 있도록 한다.너는 처음부터
Map
류를 실현할 수 있니?두 가지 방법get
과set
만 필요합니다.많은 프로그래밍 언어는 내장된 해시나 사전 원어 (예: Javascript
Object
s와 {}
기호) 를 가지고 있지만, 우리는 이 연습에서 그것을 사용하고 싶지 않다.이 과정은 https://algodaily.com에 처음 발표되었고 저는 그곳에서 기술 면접 과정을 개설했고 웅대한 개발자를 위해 사고문을 썼습니다.
참고: 일반
Javascript
객체와 Map
클래스는 간단한 키 값 해시 테이블/연관 그룹으로 몇 가지 관건적인 차이가 있습니다.Map
객체는 삽입 순서대로 요소를 누를 수 있지만 JavaScript의 Object
객체는 순서를 보장할 수 없습니다.또한 Object
원형 때문에 기본 키가 있고 Map
기본 키가 없습니다.Here's a good breakdown.본 연습의 목적에서 우리는 둘이 같은 기능을 가지고 있다고 가정합시다.이 두 가지 방법에 대해 다음과 같이 정의합니다.
get(key: string)
키를 지정하고 해당 키의 값을 반환해야 합니다.set(key: string, val: string)
키와 값을 매개 변수로 하고 쌍을 저장해야 합니다.hashStr
를 제공했다.그것은 충돌을 피하려고 시도했지만 완벽하지는 않았다.문자열 값을 받아들이고 정수를 되돌려줍니다.function hashStr(str) {
let finalHash = 0;
for (let i = 0; i < str.length; i++) {
const charCode = str.charCodeAt(i);
finalHash += charCode;
}
return finalHash;
}
console.log(hashStr('testKey'))
새로운 클래스를 Hashmap
클래스라고 부르고 사용합니다.const m = new Hashmap();
m.set('name', 'Jake');
console.log(m.get('name'));
우선 일반적인 해시표가 어떻게 작동하는지 되돌아보자. 이론은 우리Hashmap
data structure
의 기초이다.우리가 주의한 바와 같이 많은 프로그래밍 언어 중 하나Hashmap
류는 유류Hashtable
를 바탕으로 한다.우리가 건의한 이 코드의 실현을 점차적으로 이해하자.그래서 우리는 해시표가 데이터를 통에 저장해서 일하는 것을 안다.이 저장소에 접근하기 위해서는
key
을 저장소 번호로 바꾸는 방법이 필요합니다.(수조와 나무로 통을 모델링할 수 있지만 간단하고 속도를 최대한 높이기 위해 우리는 수조를 계속 사용할 것이다.)키를 사용하면 데이터가 그룹에 있는 위치를 알 필요가 없습니다.따라서 우리의
data structure
는 산열 함수가 필요합니다. 이 예에서 hashStr
로 제공하여 index
를 buckets
로 계산하여 원하는 값을 저장합니다.우리는 본질적으로 key
산열 함수를 통해 hashStr
을 그룹 인덱스에 비추는 것이다.hashStr('r')
// 114
// array = [ _ , X , _ , _ ]
// index 113 114 115 116
보시다시피 hashStr
의 작업은 key
에서 제공한 set()
만 취하고 위치를 계산해 줍니다.따라서 실제 저장과 방치 값에 사용할 다른 data structure
저장소가 필요합니다.물론, 너는 이미 이것이 수조라는 것을 알고 있다.기입하다
해시 테이블의 간격이나 스토리지 통은 일반적으로 __________ 및 해당 인덱스에 저장됩니다.
솔루션: 스토리지
이 클래스를 작성하는 좋은 시작은 스토리지 어레이만 초기화하는 것입니다.
class Hashmap {
constructor() {
this._storage = [];
}
}
우리는 입력 값이 hashStr
에 놓여야 할 위치를 결정하기 위해 되돌아오는 인덱스 this._storage
를 사용할 것이다.충돌의 단어:
collisions
해시 함수가 여러 개의 키로 같은 색인을 되돌려 주고 이 문제의 범위에 있지 않다는 것을 가리킨다.그러나 이런 문제를 처리하기 위해 추가 데이터 구조를 사용할 수 있는 방법이 있다.다중 선택
다음 중 충돌을 해결하는 해시표는 무엇입니까?
해결 방안: 단독 링크를 사용하여 체인 테이블과 함께 사용하는데 그 중에서 수조의 인덱스는 값 체인으로 구성된다
이제 우리는 구축 블록이 생겼기 때문에
set
방법을 계속 실현합시다.이 메서드는 다음을 수행합니다.key
통과storage
의 값을 설정합니다우리가 그것을 저장하는 방식에 주의하십시오.
this._storage
this._storage[idx]
의 모든 인덱스는 하나의 수조이기 때문에 기본적으로 충돌 문제를 해결했습니다.set(key, val) {
let idx = this.hashStr(key);
if (!this._storage[idx]) {
this._storage[idx] = [];
}
this._storage[idx].push([key, val]);
}
set
방법은 지금 보기에 매우 간단해 보인다. 그렇지?이것은 우리의
get
방법의 개념과 같다.우리가 그곳에서 한 것은 key
방법을 통해 전달된 hashStr
을 실행하는 것이지만, 우리는 설정이 아니라 결과 인덱스로 돌아가 값을 검색할 것이다. for (let keyVal of this._storage[idx]) {
if (keyVal[0] === key) {
return keyVal[1];
}
}
우리가 주의해야 할 점은 존재하지 않거나 존재하지 않는 키를 전달하는 것이 가능하다는 것이다. 따라서 이런 상황이라면 되돌아오는 것을 통해 처리해야 한다.get(key) {
let idx = this.hashStr(key);
if (!this._storage[idx]) {
return undefined;
}
for (let keyVal of this._storage[idx]) {
if (keyVal[0] === key) {
return keyVal[1];
}
}
}
그럼 얼마 안 남았을 거야!한번 해볼게요.class Hashmap {
constructor() {
this._storage = [];
}
hashStr(str) {
let finalHash = 0;
for (let i = 0; i < str.length; i++) {
const charCode = str.charCodeAt(i);
finalHash += charCode;
}
return finalHash;
}
set(key, val) {
let idx = this.hashStr(key);
if (!this._storage[idx]) {
this._storage[idx] = [];
}
this._storage[idx].push([key, val]);
}
get(key) {
let idx = this.hashStr(key);
if (!this._storage[idx]) {
return undefined;
}
for (let keyVal of this._storage[idx]) {
if (keyVal[0] === key) {
return keyVal[1];
}
}
}
}
이 과정은 https://algodaily.com에 처음 발표되었고 저는 그곳에서 기술 면접 과정을 개설했고 웅대한 개발자를 위해 사고문을 썼습니다.
Reference
이 문제에 관하여(어떻게 해시 맵을 실현합니까), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/jacobjzhang/how-to-implement-a-hash-map-3jm3텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)