如何使用Go语言实现基于泛型的Jaccard相似度算法

 更新时间:2024年08月06日 11:41:27   作者:Python私教  
这篇文章主要介绍了如何使用Go语言实现基于泛型的Jaccard相似度算法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧

基本原理

跳表:

jaccard相似度:

jaccard相似度的代码实现:

时间复杂度分析:

快速jaccard算法:

代码实现,这个要求两个集合都是有序的:

Jaccard相似度算法的基本实现

算法:

package zdpgo_algorithm
// Jaccard 计算两个数组之间的Jaccard相似度
// @param arr1 数组1
// @param arr2 数组2
// @return float64 相似度
func Jaccard[T Number](arr1 []T, arr2 []T) float64 {
	// 边界情况
	if len(arr1) == 0 || len(arr2) == 0 {
		return 0
	}
	// 将两个数组转换为字典
	m1 := make(map[T]struct{}, len(arr1))
	m2 := make(map[T]struct{}, len(arr2))
	for _, v := range arr1 {
		m1[v] = struct{}{}
	}
	for _, v := range arr2 {
		m2[v] = struct{}{}
	}
	// 计算交集的元素个数
	var count float64
	for k, _ := range m1 {
		if _, ok := m2[k]; ok {
			count++
		}
	}
	// 使用算法公式计算相似度
	// 交集个数 / (集合1个数 + 集合2个数 - 交集个数)
	// 由于结果是浮点数类型,需要手动将结果转换为浮点数类型
	return count / float64(len(arr1)+len(arr2)-int(count))
}

基本的测试代码:

package zdpgo_algorithm_test
import (
	"github.com/zhangdapeng520/zdpgo_algorithm"
	"testing"
)
func TestJaccard_Basic(t *testing.T) {
	arr1 := []int{1, 2, 3, 4, 5}
	arr2 := []int{4, 5, 6, 7}
	t.Log(zdpgo_algorithm.Jaccard(arr1, arr2))
}

基于有序数组的Jaccard相似度算法实现

算法:

// JaccardSorted 用于两个有序数组的快速Jaccard相似度算法
// 时间复杂度:O(n)
// @param arr1 数组1,要求是有序的
// @param arr2 数组2,要求是有序的
// @return float64 相似度
func JaccardSorted[T Number](arr1 []T, arr2 []T) float64 {
	if len(arr1) == 0 || len(arr2) == 0 {
		return 0
	}
	// 求交集的个数
	count := 0
	for i, j := 0, 0; i < len(arr1) && j < len(arr2); {
		// 两个有序的数组,只有其中的某个片段是连续相同的
		if arr1[i] == arr2[j] {
			// 这种情况说明重叠的部分已经出现了
			count++
			i++
			j++
		} else if arr1[i] < arr2[j] {
			// 这种情况说明重叠的部分在arr1的后面,让arr1的索引往后递增
			i++
		} else {
			// 这种情况说明重叠的部分在arr2的后面,让arr2的索引往后递增
			j++
		}
	}
	// 计算相似度
	return float64(count) / float64(len(arr1)+len(arr2)-count)
}

测试代码:

func TestJaccardSorted_Basic(t *testing.T) {
	arr1 := []int{1, 2, 3, 4, 5}
	arr2 := []int{4, 5, 6, 7}
	t.Log(zdpgo_algorithm.JaccardSorted(arr1, arr2))
}

到此这篇关于如何使用Go语言实现基于泛型的Jaccard相似度算法的文章就介绍到这了,更多相关Go语言Jaccard相似度算法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 深入探讨Go语言中的map是否是并发安全以及解决方法

    深入探讨Go语言中的map是否是并发安全以及解决方法

    这篇文章主要来和大家探讨 Go 语言中的 map 是否是并发安全的,并提供三种方案来解决并发问题,文中的示例代码讲解详细,需要的可以参考一下
    2023-05-05
  • Golang中基础的命令行模块urfave/cli的用法说明

    Golang中基础的命令行模块urfave/cli的用法说明

    这篇文章主要介绍了Golang中基础的命令行模块urfave/cli的用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • etcd通信接口之客户端API核心方法实战

    etcd通信接口之客户端API核心方法实战

    这篇文章主要为大家介绍了etcd通信接口之客户端API核心方法实战,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • 详解如何利用GORM实现MySQL事务

    详解如何利用GORM实现MySQL事务

    为了确保数据一致性,在项目中会经常用到事务处理,对于MySQL事务相信大家应该都不陌生。这篇文章主要总结一下在Go语言中Gorm是如何实现事务的;感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助
    2022-09-09
  • 一文搞懂Go Exec 僵尸与孤儿进程

    一文搞懂Go Exec 僵尸与孤儿进程

    本文主要介绍了Go Exec 僵尸与孤儿进程,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • Go中的新增对模糊测试的支持

    Go中的新增对模糊测试的支持

    这篇文章主要为大家介绍了Go中的新增对模糊测试的支持,文中还包含了一些功能实验性测试分析有需要的朋友可以借鉴参考下,希望能够有所帮助
    2022-03-03
  • zap接收gin框架默认的日志并配置日志归档示例

    zap接收gin框架默认的日志并配置日志归档示例

    本文介绍了在基于gin框架开发的项目中如何配置并使用zap来接收并记录gin框架默认的日志和如何配置日志归档。有需要的朋友可以借鉴参考下,希望能够有所帮助
    2022-04-04
  • go本地环境配置及vscode go插件安装的详细教程

    go本地环境配置及vscode go插件安装的详细教程

    这篇文章主要介绍了go本地环境配置及vscode go插件安装的详细教程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-05-05
  • 一文详细介绍golang中.()类型断言的使用方法

    一文详细介绍golang中.()类型断言的使用方法

    Golang是一门非常流行的编程语言,在很多领域都有着广泛的应用,在开发过程中,很多时候我们需要将函数作为参数传递给其他函数,这时候就需要用到golang中的.()用法,本文将详细介绍golang中.()的使用方法,需要的朋友可以参考下
    2023-08-08
  • Go语言开源库实现Onvif协议客户端设备搜索

    Go语言开源库实现Onvif协议客户端设备搜索

    这篇文章主要为大家介绍了Go语言Onvif协议客户端设备搜索示例实现,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-04-04

最新评论