广告位联系
返回顶部
分享到

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

Golang 来源:互联网 作者:佚名 发布时间:2024-08-06 22:19:45 人浏览
摘要

基本原理 跳表: jaccard相似度: jaccard相似度的代码实现: 时间复杂度分析: 快速jaccard算法: 代码实现,这个要求两个集合都是有序的: Jaccard相似度算法的基本实现 算法: 1 2 3 4 5 6 7 8 9

基本原理

跳表:

jaccard相似度:

jaccard相似度的代码实现:

时间复杂度分析:

快速jaccard算法:

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

Jaccard相似度算法的基本实现

算法:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

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))

}

基本的测试代码:

1

2

3

4

5

6

7

8

9

10

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相似度算法实现

算法:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

// 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)

}

测试代码:

1

2

3

4

5

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))

}


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。
原文链接 :
相关文章
  • 基于Golang实现Kubernetes边车模式

    基于Golang实现Kubernetes边车模式
    在这篇文章中,我们会介绍 Sidecar 模式,并创建两个基于 Go 的容器化微服务,然后部署到 Kubernetes 上。 什么是 Sidecar 模式? Sidecar 模式是一
  • 使用Go语言实现基于泛型的Jaccard相似度算法

    使用Go语言实现基于泛型的Jaccard相似度算法
    基本原理 跳表: jaccard相似度: jaccard相似度的代码实现: 时间复杂度分析: 快速jaccard算法: 代码实现,这个要求两个集合都是有序的:
  • go-zero自定义中间件的几种方式
    1.通过 api 文件生成并填入具体逻辑 定义 api 首先你需要在 api 文件中定义你需要的路由位置和中间件的名字: 1 2 3 4 5 6 7 8 9 // test for ping @
  • Go中gin框架的*gin.Context参数常见实用方法
    梗概: *gin.Context是处理HTTP请求的核心。ctx代表context(上下文),它包含了处理请求所需的所有信息和方法,例如请求数据、响应构建器、
  • Python实现图像添加水印的方法
    在日常图像处理中,为图片添加水印是一项常见任务。有多种方法和工具可供选择,而今天我们将专注于使用Python语言结合PIL库批量添加水
  • go的defer和return的执行顺序介绍
    go的defer和return的执行顺序 go的defer和return是golang中的两个关键字,return用于返回函数的返回值,也可以参与一定的流程控制,比如下面代码
  • 使用go语言实现Redis持久化的代码
    redis是一个内存数据库,如果你把进程杀掉,那么里面存储的数据都会消失,那么这篇文章就是来解决redis持久化的问题 我们在redis.conf文件
  • Go中的Timer和Ticker介绍
    一:简介 在日常开发中,我们可能会遇到需要延迟执行或周期性地执行一些任务。这个时候就需要用到Go语言中的定时器。 在Go语言中,定
  • Golang在gin框架中使用JWT鉴权
    什么是JWT JWT,全称 JSON Web Token,是一种开放标准(RFC 7519),用于安全地在双方之间传递信息。尤其适用于身份验证和授权场景。JWT 的设计
  • Golang使用Redis与连接池方式
    Golang使用Redis与连接池 使用下载go的redis包go get github.com/gomodule/redigo/redis 如果网不好的话就很费劲了 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 2
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计