Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk melaksanakan peta hash dalam golang

Bagaimana untuk melaksanakan peta hash dalam golang

PHPz
PHPzasal
2023-04-03 09:14:421160semak imbas

Struktur peta yang disertakan dengan bahasa golang ialah jenis data yang sangat mudah, tetapi untuk operasi data yang memerlukan lebih kecekapan dan fleksibiliti, kami boleh memilih untuk menggunakan peta cincang yang dilaksanakan oleh golang. Artikel ini akan memperkenalkan cara golang melaksanakan peta cincang.

1. Prinsip Pelaksanaan

Prinsip golang melaksanakan peta cincang adalah sangat mudah, iaitu untuk memetakan pasangan nilai kunci kepada tatasusunan melalui algoritma tertentu dan menggunakan senarai terpaut untuk menyelesaikan cincang konflik. Khususnya, melaksanakan peta cincang memerlukan langkah berikut:

  1. Buat tatasusunan dengan saiz tatasusunan 2 hingga kuasa ke-n (n boleh laras).
  2. Kira nilai cincang setiap pasangan nilai kunci yang akan dimasukkan, dan kemudian gunakan nilai cincang untuk memodulasi saiz tatasusunan untuk mendapatkan kedudukannya dalam tatasusunan.
  3. Jika kedudukan kosong, masukkan terus pasangan nilai kunci ke dalam senarai terpaut pada kedudukan itu dalam tatasusunan.
  4. Jika sudah ada nilai pada kedudukan ini, lalui senarai terpaut pada kedudukan ini untuk menentukan sama ada kunci yang sama wujud Jika ia wujud, kemas kini nilai yang sepadan, masukkan nod secara langsung ke penghujung senarai terpaut.
  5. Apabila mencari pasangan nilai kunci, mula-mula gunakan nilai cincang untuk memodulasi saiz tatasusunan untuk mendapatkan kedudukannya dalam tatasusunan, dan kemudian melintasi senarai terpaut pada kedudukan itu untuk mencari nilai kunci yang sepadan .

2. Kod pelaksanaan

Berikut ialah kod golang mudah untuk melaksanakan peta cincang:

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. Contoh penggunaan

Penggunaan Contohnya adalah seperti berikut:

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. Ringkasan

Melaksanakan peta cincang melalui golang boleh memudahkan operasi data yang cekap dan fleksibel. Prinsip melaksanakan peta cincang adalah sangat mudah Ia terutamanya memetakan pasangan nilai kunci kepada tatasusunan melalui algoritma cincang dan menggunakan senarai terpaut untuk menyelesaikan konflik cincang. Kod dalam contoh penggunaan boleh digunakan untuk rujukan anda, dan anda juga boleh mengoptimumkan dan memperbaikinya mengikut keperluan anda sendiri.

Atas ialah kandungan terperinci Bagaimana untuk melaksanakan peta hash dalam golang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel sebelumnya:Cara membina golang di tingkapArtikel seterusnya:Cara membina golang di tingkap