go 해시 표 - map 의 간단 한 실현
실현 절차
//1.
type MpNode struct {
Data Dict // k v
Next *MpNode //
}
type Dict struct {
Key string
Value interface{}
}
//2
//
func newNodeHead() *MpNode {
node := new(MpNode)
node.Data.Key = " key"
node.Data.Value = " value"
node.Next = nil
return node
}
//
//3
// key value
func (node *MpNode) data(k string, v interface{}) *MpNode {
if node == nil {
node = newNodeHead()
}
node.Data.Key = k
node.Data.Value = v
return node
}
//4
func (node *MpNode) add(k string, v interface{}) {
// k key
if node.getKey(k) != nil {
return
}
//
for node.Next != nil {
node = node.Next
}
//
node.Next = node.Next.data(k, v)
}
여기까지 우 리 는 싱글 체인 에 key, value 값 을 저장 하 는 것 을 초보 적 으로 실현 했다.
//5
func MpDemo() {
node := newNodeHead()
node.add("1", "2")
node.add("2", 3)
node.Log()//
fmt.Println(node.Length())
}
//6
func (node *MpNode) Log() {
if node.Next == nil {
return
}
fmt.Println(node.Next.Data)
node.Next.Log()
}
// 7
func (node *MpNode) Length() int {
if node == nil {
return 0
}
i := 0
for node.Next != nil {
i++
node = node.Next
}
return i
}
//8
//
var Arr [16]*MpNode
//9
func NewHash() {
for i := 0; i < 16; i++ {
Arr[i] = newNodeHead()
}
}
//
//10 key
func SetKey(k string, v interface{}) {
// k
num := hashNum(k)
Arr[num].add(k, v)
}
= = 여기 서 알 게 될 것 이다. 어, 해시 알고리즘 은 어떻게 쓰 느 냐? 그래서 나 는 간단 하고 손 으로 찢 을 수 있 는 알고리즘 을 찾 았 다. = //11 16
func hashNum(key string) int {
var index int = 0
index = int(key[0])
//
for k := 0; k < len(key); k++ {
index *= (1103515245 + int(key[k]))
}
// 2^27
index >>= 27
// & 32 32-1 index 1111 & 15 11111 31
index &= 16 - 1
return index
}
//12 key value
func (node *MpNode) getKey(k string) interface{} {
if node.Next == nil {
return nil
}
for node.Next != nil {
if node.Next.Data.Key == k {
return node.Next.Data.Value
} else {
node = node.Next
}
}
return nil
}
//13 valve key
//func (node *MpNode) getValue(v interface{}) string {
// if node.Next == nil {
// return ""
// }
// for node.Next != nil {
// if node.Next.Data.Value == v {
// return node.Next.Data.Key
// } else {
// node = node.Next
// }
// }
// return ""
//}
//14 key
func GetKey(k string) interface{} {
num := hashNum(k)
return Arr[num].getKey(k)
}
이 맵 을 실행 하 세 요!package data
import "fmt"
//1.
type MpNode struct {
Data Dict // k v
Next *MpNode //
}
type Dict struct {
Key string
Value interface{}
}
//8
//
var Arr [16]*MpNode
//2
//
func newNodeHead() *MpNode {
node := new(MpNode)
node.Data.Key = " key"
node.Data.Value = " value"
node.Next = nil
return node
}
//9
func NewHash() {
for i := 0; i < 16; i++ {
Arr[i] = newNodeHead()
}
}
//
//3
// key value
func (node *MpNode) data(k string, v interface{}) *MpNode {
if node == nil {
node = newNodeHead()
}
node.Data.Key = k
node.Data.Value = v
return node
}
//12 key value
func (node *MpNode) getKey(k string) interface{} {
if node.Next == nil {
return nil
}
for node.Next != nil {
if node.Next.Data.Key == k {
return node.Next.Data.Value
} else {
node = node.Next
}
}
return nil
}
//13 valve key
//func (node *MpNode) getValue(v interface{}) string {
// if node.Next == nil {
// return ""
// }
// for node.Next != nil {
// if node.Next.Data.Value == v {
// return node.Next.Data.Key
// } else {
// node = node.Next
// }
// }
// return ""
//}
//4
func (node *MpNode) add(k string, v interface{}) {
// k key
if node.getKey(k) != nil {
return
}
//
for node.Next != nil {
node = node.Next
}
//
node.Next = node.Next.data(k, v)
}
//6
func (node *MpNode) Log() {
if node.Next == nil {
return
}
fmt.Println(node.Next.Data)
node.Next.Log()
}
// 7
func (node *MpNode) Length() int {
if node == nil {
return 0
}
i := 0
for node.Next != nil {
i++
node = node.Next
}
return i
}
//
//10 key
func SetKey(k string, v interface{}) {
// k
num := hashNum(k)
Arr[num].add(k, v)
}
//14 key
func GetKey(k string) interface{} {
num := hashNum(k)
return Arr[num].getKey(k)
}
//11 16
func hashNum(key string) int {
var index int = 0
index = int(key[0])
//
for k := 0; k < len(key); k++ {
index *= (1103515245 + int(key[k]))
}
// 2^27
index >>= 27
// & 32 32-1 index 1111 & 15 11111 31
index &= 16 - 1
return index
}
//5
func MpDemo() {
//node := newNodeHead()
//node.add("1", "2")
//node.add("2", 3)
//node.Log()
//fmt.Println(node.Length())
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.