【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表不复杂,我们在开发中也经常使用,建议朋友们好好掌握;
- 编码修炼 | 快速了解Scala技术栈
- VFS四大对象之三 struct dentry
- PHP 排序算法实现讲解
- PHP7新特性介绍
- VFS四大对象之四-struct file
- 《Redis设计与实现》读书笔记(二) ——Redis中的字典(Hash)
- 《Redis设计与实现》读书笔记(三) ——Redis中的链表
- 《Redis设计与实现》读书笔记(四) ——Redis中的跳跃表
- 解析Linux中的VFS文件系统之文件系统的注册(二)
- vivi虚拟摄像头驱动程序
- 系统架构 | 基于微服务架构,改造企业核心系统之实践
- 《Redis设计与实现》读书笔记(五) ——Redis中的整数集合
- 《Redis设计与实现》读书笔记(七) ——Redis对象综述及字符串对象实现原理
- 自动登录脚本
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- C++核心准则Con.3:默认情况下,传递参照常量的指针或引用
- C++核心准则Con.4:如果一个对象在构建之后值不会改变,使用const定义它
- C++核心准则Con.5:对于可以在编译时计算的值,使用constexpr进行声明
- DB2 Linux平台安装 Part 4 创建数据库
- VBA编写Ribbon Custom UI编辑器03——认识Ribbon的xml
- VBA编写Ribbon Custom UI编辑器04——解析xml
- VBA编写Ribbon Custom UI编辑器05——转换结构体XML
- MySQL 8.0.19 Linux平台安装 Part 1
- MySQL 8.0.19 Linux平台安装 Part 2
- 使用XtraBackup备份MySQL 8.0 Part 1 xtrabackup 8.0 安装
- 10个解放双手的 IDEA 插件,少些冤枉代码!
- 二叉树的 4 种遍历方式,你会多少?
- 【C++简明教程】Python和C++指定元素排序比较
- PG原生解码工具pg_recvlogical的使用-在脑裂时帮我们找回丢失的数据
- 使用XtraBackup备份MySQL 8.0 Part 4 对数据库进行全备