hash散列原理查询 包路径自己改 main文件导入其余两个go文件
MyHashMap.go文件
package HashMap
import (
"Project/5-15/homework/LinkNodes"
"fmt"
)
var bultArr [16]*LinkNodes.Node
//为16个node循环添加头文件
func CreateBulet() {
var arr = [16]*LinkNodes.Node{}
for i := 0; i < 16; i++ {
arr[i]=LinkNodes.CreateHeadNode("头结点","sdfsdf")
}
bultArr=arr
}
//将key 转换成数值下标的散列算法
func HashCode(key string) int {
var index int =0
index =int (key[0])
for k := 0; k < len(key); k++ {
index *=(1103515245 +int(key[k]))
}
index >>=27
index &=16 -1
return index
}
//向数组中添加键值对
func AddKeyValue(k string,v string) {
//使用hash散列算法求字符串k在0-16区间中的所属值赋给pos
var pos = HashCode(k)
//将下标为pos的节点取出赋给head
var head = bultArr[pos]
//将 head节点添加到指定下标节点的末尾
LinkNodes.AddNode(k,v,head)
}
//获取数据
func GetValueByKey(k string) string {
//使用hash散列算法求字符串k在0-16区间中的所属值赋给pos
var pos = HashCode(k)
//将下标为pos的节点取出赋给head
var head = bultArr[pos]
//通过头节点便利链表
//LinkNodes.ShowNodes(head)
//查找对应下标下的链表,判断在key与节点中的key一直时打印
for {
if head.Data.K == k {
fmt.Println(head.Data.V)
break
} else {
head = head.NextNode
if head.NextNode == nil {
}
}
}
return ""
}
Node.go文件
package LinkNodes
import "fmt"
type DM struct {
K string
V string
}
//头结点
var head *Node
//最后一个节点
var curr *Node
//声明节点类型
type Node struct {
//数据域
Data DM
//地址域
NextNode *Node
}
//创建头结点
func CreateHeadNode(k string, v string) *Node {
//声明结构图new 为指针类型
var node =new(Node)
//设置头结点数据域的信息
node.Data.K=k
node.Data.V=v
//设置地址域
node.NextNode=nil
//保存头结点
head=node
curr=node
return node
}
//在指定的节点后面添加新节点
func AddNode(k string, v string, curr *Node) *Node {
var newNode = new(Node)
//设置新节点中的数据域
newNode.Data.K=k
newNode.Data.V=v
//设置地址域
newNode.NextNode=nil
//挂接新节点
//将当前节点中的下一个节点设置为新建的节点
curr.NextNode=newNode
//设置最后一个节点为新新建节点
curr=newNode
//返回值新建节点
return newNode
}
//在指定的节点后边遍历链表
func ShowNodes(n *Node) {
var node =n
for {
//如果当前node的下一个node为nil输出
并推出循环
if node.NextNode==nil {
fmt.Print(node.Data)
break
//输出当前节点的值并把下一个节点付给当前的node
}else {
fmt.Println(node.Data)
node=node.NextNode
}
}
}
//计算节点的个数
func NodeCnt() int {
var cnt int = 1
var node = head
for {
if node.NextNode == nil {
break
} else {
node = node.NextNode
cnt = cnt + 1
}
}
return cnt
}
main.go文件
// MyHashMap project main.go
package main
import
( "fmt"
"Project/5-15/MyHashMap/HashMp"
)
func main() {
fmt.Println("Hello World!")
//测试HashMp包下的散列因子是否平均分布
//fmt.Print(HashMp.HashCode("abc"))
HashMp.CreateBulet()
HashMp.AddKeyValue("abc", "hello")
HashMp.AddKeyValue("bcd", "world")
HashMp.AddKeyValue("asd", "12")
HashMp.AddKeyValue("bsafqcd", "wor32ld")
HashMp.AddKeyValue("bsddfcd", "wo21rld")
HashMp.AddKeyValue("bcsdd", "worl3d")
HashMp.AddKeyValue("basxdcd", "123")
HashMp.GetValueByKey("bsafqcd")
}