>백엔드 개발 >Golang >golang에서 해시맵을 구현하는 방법

golang에서 해시맵을 구현하는 방법

PHPz
PHPz원래의
2023-04-03 09:14:421158검색

golang 언어와 함께 제공되는 맵 구조는 매우 편리한 데이터 유형이지만 더 많은 효율성과 유연성이 필요한 데이터 작업의 경우 golang에서 구현된 해시맵을 사용하도록 선택할 수 있습니다. 이 기사에서는 golang이 해시맵을 구현하는 방법을 소개합니다.

1. 구현 원리

해시맵을 구현하는 Golang의 원리는 매우 간단합니다. 특정 알고리즘을 통해 키-값 쌍을 배열로 매핑하고 연결된 목록을 사용하여 해시 충돌을 해결하는 것입니다. 특히 해시맵을 구현하려면 다음 단계가 필요합니다.

  1. 배열 크기가 2의 n승인 배열을 만듭니다(n은 조정 가능).
  2. 삽입할 각 키-값 쌍의 해시 값을 계산한 다음 해시 값을 사용하여 배열 크기를 모듈로화하여 배열에서의 위치를 ​​얻습니다.
  3. 위치가 비어 있으면 연결 리스트 배열의 해당 위치에 키-값 쌍을 직접 삽입하세요.
  4. 이 위치에 이미 값이 있으면 이 위치에서 연결된 목록을 탐색하여 동일한 키가 존재하는지 확인합니다. 존재하지 않으면 해당 값을 업데이트하고 노드를 끝에 직접 삽입합니다. 연결리스트.
  5. 키-값 쌍을 찾을 때 먼저 해시 값을 사용하여 배열 크기를 모듈로화하여 배열에서의 위치를 ​​얻은 다음 해당 위치에서 연결된 목록을 탐색하여 해당 키의 값을 찾습니다.

2. 구현 코드

해시맵을 구현하기 위한 간단한 골랭 코드는 다음과 같습니다.

package hashmap

import "sync"

type Node struct {
    key   string
    value interface{}
    next  *Node
}

type HashMap struct {
    size  int
    nodes []*Node
    mutex sync.Mutex
}

func NewHashMap(size int) *HashMap {
    return &HashMap{size, make([]*Node, size), sync.Mutex{}}
}

func (hm *HashMap) hash(key string) int {
    h := 0
    for i := 0; i < len(key); i++ {
        h = (h << 5) + h + int(key[i])
    }
    return h % hm.size
}

func (hm *HashMap) Set(key string, value interface{}) {
    hm.mutex.Lock()
    defer hm.mutex.Unlock()
    i := hm.hash(key)
    if hm.nodes[i] == nil {
        hm.nodes[i] = &Node{key, value, nil}
    } else {
        for n := hm.nodes[i]; n != nil; n = n.next {
            if n.key == key {
                n.value = value
                return
            }
            if n.next == nil {
                n.next = &Node{key, value, nil}
                break
            }
        }
    }
}

func (hm *HashMap) Get(key string) interface{} {
    hm.mutex.Lock()
    defer hm.mutex.Unlock()
    i := hm.hash(key)
    for n := hm.nodes[i]; n != nil; n = n.next {
        if n.key == key {
            return n.value
        }
    }
    return nil
}

func (hm *HashMap) Delete(key string) {
    hm.mutex.Lock()
    defer hm.mutex.Unlock()
    i := hm.hash(key)
    if hm.nodes[i] != nil {
        if hm.nodes[i].key == key {
            hm.nodes[i] = hm.nodes[i].next
            return
        }
        for n := hm.nodes[i]; n.next != nil; n = n.next {
            if n.next.key == key {
                n.next = n.next.next
                return
            }
        }
    }
}

3. 사용 예

사용 예는 다음과 같습니다.

package main

import (
    "fmt"
    "hashmap"
)

func main() {
    m := hashmap.NewHashMap(16)
    m.Set("apple", 1)
    m.Set("banana", 2)
    m.Set("cat", 3)
    fmt.Println(m.Get("apple"))   // Output: 1
    fmt.Println(m.Get("carrot")) // Output: <nil>
    m.Delete("banana")
    fmt.Println(m.Get("banana")) // Output: <nil>
}

4. 요약

해시맵을 golang을 통해 구현하는 것이 편리할 수 있습니다. 효율적이고 유연한 데이터 운영. 해시맵을 구현하는 원리는 매우 간단합니다. 주로 해시 알고리즘을 통해 키-값 쌍을 배열에 매핑하고 연결 목록을 사용하여 해시 충돌을 해결합니다. 사용 예의 코드는 참고용으로 사용할 수 있으며, 필요에 따라 최적화하고 개선할 수도 있습니다.

위 내용은 golang에서 해시맵을 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.