【Go 语言社区算法课程 第一季 第3节 hash算法实现

时间:2022-05-04
本文章向大家介绍【Go 语言社区算法课程 第一季 第3节 hash算法实现,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
package main


import (

        "fmt"
)

// 主函数

func main() {

        fmt.Println("欢迎 来到 Go 语言社区,www.golangweb.com")

        testhash := create_hash_table()

        bret := insert_data_into_hash(testhash, 5)

        insert_data_into_hash(testhash, 6)

        if false == bret {

                fmt.Println("插入失败!!!")

        }



        tetsnode := find_data_in_hash(testhash, 5)

        fmt.Println(tetsnode)



        return

}



//hash表,有时候也被称为散列表。个人认为,hash表是介于链表和二叉树之间的一种中间结构。链表使用十分方便,

//但是数据查找十分麻烦;二叉树中的数据严格有序,但是这是以多一个指针作为代价的结果。hash表既满足了数据的查找方便,

//同时不占用太多的内容空间,使用也十分方便。



// a)定义hash表和基本数据节点

type _NODE struct {

        data int

        next *_NODE

}



type _HASH_TABLE struct {

        value [10]*_NODE

}



//  b)创建hash表

func create_hash_table() *_HASH_TABLE {

        // 初始化数据,也就是数据的创建的操作

        pHashTbl := new(_HASH_TABLE)

        return pHashTbl

}



//   c)在hash表当中寻找数据

func find_data_in_hash(pHashTbl *_HASH_TABLE, data int) *_NODE {



        var pNode *_NODE

        // 判断数据为空不

        if nil == pHashTbl {

                return nil

        }

        pNode = pHashTbl.value[data%10]

        // 数组的数据的判断

        if nil == pNode {

                return nil

        }

        // 循环取数据

        for {

                if nil == pNode {

                        break

                }



                if data == pNode.data {

                        return pNode

                }

                pNode = pNode.next

        }



        return nil

}



// d)在hash表当中插入数据

func insert_data_into_hash(pHashTbl *_HASH_TABLE, data int) bool {

        var pNode *_NODE

        // 判断数据为空不

        if nil == pHashTbl {

                return false

        }



        // 数据转换逻辑

        if nil == pHashTbl.value[data%10] {



                pNode = new(_NODE)

                pNode.data = data

                pHashTbl.value[data%10] = pNode

                fmt.Println("pNode:", pNode)

                return true

        }

        if nil == find_data_in_hash(pHashTbl, data) {

                return false

        }

        pNode = pHashTbl.value[data%10]

        for {

                if nil == pNode.next {

                        break

                }

                pNode = pNode.next

        }

        pNode.next = new(_NODE)

        pNode.next.data = data

        return true

}



//     e)从hash表中删除数据



func delete_data_from_hash(pHashTbl *_HASH_TABLE, data int) bool {

        var pHead *_NODE

        var pNode *_NODE



        if nil == pHashTbl || nil == pHashTbl.value[data%10] {

                return false

        }

        pNode = find_data_in_hash(pHashTbl, data)

        if nil == pNode {

                return false

        }

        if pNode == pHashTbl.value[data%10] {

                pHashTbl.value[data%10] = pNode.next

                goto final

        }

        pHead = pHashTbl.value[data%10]

        for {

                if nil == pHead.next {

                        break

                }



                pHead = pHead.next

                pHead.next = pNode.next

        }

final:

        // 清除指针数据

        pNode = nil

        return true

}



//总结:

//    1、hash表不复杂,我们在开发中也经常使用,建议朋友们好好掌握;