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

news2024/9/21 16:50:26

基本原理

跳表:
在这里插入图片描述

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1984635.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Rabbitmq的消息模型】

消息队列的特性 durable&#xff1a;队列持久化。如果设置持久化&#xff0c;那么无论RabbitMQ在关闭时&#xff0c;就会将队列存储到本地磁盘&#xff0c;无论宕机还是重启&#xff0c;队列也不会删除&#xff1b;如果设置不持久化&#xff0c;那么在RabbitMQ关闭时&#xff…

发送邮箱API的性能指标有哪些,如何评估?

发送邮箱API的安全性措施&#xff1f;使用邮箱API的注意事项&#xff1f; 无论是用于事务性邮件、营销邮件还是通知邮件&#xff0c;发送邮箱API的性能直接影响用户体验和业务效果。AokSend将详细探讨这些问题&#xff0c;帮助您更好地理解和优化发送邮箱API。 发送邮箱API&a…

Shodan:互联网连接设备与漏洞分析的搜索引擎

前言 在当今数字化时代&#xff0c;互联网连接设备的数量急剧增长&#xff0c;从个人设备到企业服务器再到物联网&#xff08;IoT&#xff09;设备&#xff0c;这些设备构成了我们日常生活和工作的基础。然而&#xff0c;这些设备的连接也带来了潜在的安全风险&#xff0c;因为…

【算法 02】一题学习BFS和DFS算法

一题学习BFS和DFS算法 洛谷题目解析&#xff1a;【深基18.例3】查找文献 题目背景 小K热衷于在洛谷博客上阅读文章并探索其中的知识。每篇文章都可能包含指向其他博客文章的参考文献链接。小K的求知欲非常强&#xff0c;如果他阅读了某篇文章&#xff0c;他一定会去查看这篇文…

分享一个基于微信小程序的智慧校园服务平台(源码、调试、LW、开题、PPT)

&#x1f495;&#x1f495;作者&#xff1a;计算机源码社 &#x1f495;&#x1f495;个人简介&#xff1a;本人 八年开发经验&#xff0c;擅长Java、Python、PHP、.NET、Node.js、Android、微信小程序、爬虫、大数据、机器学习等&#xff0c;大家有这一块的问题可以一起交流&…

LLM可解释性的未来希望?稀疏自编码器是如何工作的,这里有一份直观说明

点击访问我的技术博客https://ai.weoknow.comhttps://ai.weoknow.com 简而言之&#xff1a;矩阵 → ReLU 激活 → 矩阵 在解释机器学习模型方面&#xff0c;稀疏自编码器&#xff08;SAE&#xff09;是一种越来越常用的工具&#xff08;虽然 SAE 在 1997 年左右就已经问世了&am…

keil工程一下子跳出来非常多错误的原因可能

1.没有选择c99编译模式 2.没有选择优化模式为编码时合适的模式 3.start文件有问题 4.路径没有引用

用模方软件做单体化建模,修图时需要用哪种软件?可以用Photoshop吗

联动单体可以用草图大师、3Dmax&#xff1b;修纹理可以联动使用Photoshop。 模方是一款针对实景三维模型的冗余碎片、水面残缺、道路不平、标牌破损、纹理拉伸模糊等共性问题研发的实景三维模型修复编辑软件。模方4.1新增自动单体化建模功能&#xff0c;支持一键自动提取房屋结…

一芯解锁「看家」新体验,航芯高性价比猫眼智能锁方案,让安全看得见!

随着智能门锁市场规模逐年递增&#xff0c;行业“内卷”也持续激烈。伴随着一路加码的功能卖点&#xff0c;智能门锁制造商正面临着产品功能芯片增多和成本优化的双重挑战。消费者不仅追求易用性、智能化和美观性&#xff0c;更期待产品具有良好的性价比。 而在智能门锁的众多…

ICML 2024 论文解析:解读量化感知的 Transformer 模型密态推理

导语&#xff1a;ICML 国际机器学习大会&#xff08;International Conference on Machine Learning&#xff0c;简称 ICML&#xff09;是机器学习领域最重要和最有影响力的学术会议之一。《Ditto: Quantization-aware Secure Inference of Transformers upon MPC&#xff08;量…

【中项】系统集成项目管理工程师-第10章 项目整合管理-10.2制订项目管理计划

前言&#xff1a;系统集成项目管理工程师专业&#xff0c;现分享一些教材知识点。觉得文章还不错的喜欢点赞收藏的同时帮忙点点关注。 软考同样是国家人社部和工信部组织的国家级考试&#xff0c;全称为“全国计算机与软件专业技术资格&#xff08;水平&#xff09;考试”&…

【YashanDB数据库】大事务回滚导致其他操作无法执行,报错YAS-02016 no free undo blocks

问题现象 客户将一个100G的表的数据插入到另一个表中&#xff0c;使用insert into select插入数据。从第一天下午2点开始执行&#xff0c;到第二天上午10点&#xff0c;一直未执行完毕。 由于需要实施下一步操作&#xff0c;客户kill重启了数据库&#xff0c;之后数据库一直回…

《清远折叠》,数智广东第一个SPN政务专网故事

今天&#xff0c;越来越多物理世界中的产业&#xff0c;正在与数字世界完成交汇&#xff0c;改变着我们习以为常的生活方式。 比如政务专网&#xff0c;就通过一张专用网络&#xff0c;将物理世界的政府部门与城市居民&#xff0c;在数字世界中“折叠”到一起&#xff0c;让人们…

Weblogic 漏洞

1.弱口令 访问默认用户名&#xff1a;weblogic 密码&#xff1a; Oracle123 点击安装 点击上载文件 将jsp木马打包&#xff0c;改为war,上传&#xff0c;一直下一步&#xff0c;最后点完成&#xff0c;访问99/99.jsp 使用工具连接 2.CVE-2017-3506 使用工具检测&#xff0c…

static的注意事项

总结 /*** ClassName Student* author gyf* Date 2024/8/5 23:48* Version V1.0* Description : */ public class Student {String name;int age;static String tecname;// 这个this 是虚拟机默认的public void show(Student this){System.out.println(this);System.out.prin…

ASP.NET Core 基础 - Razor Pages Web 应用

目录 一. 创建项目 二. 检查项目文件 三. 添加模型 四. 添加数据 五. 基架 六. 使用数据库 七. 总结 一. 创建项目 新建项目 点击运行 二. 检查项目文件 Pages 文件夹 包含 Razor 页面和支持文件。 每个 Razor 页面都是一对文件&#xff1a; 一个 .cshtml 文件&#xf…

如何白手起家?

作者:明王 日期:2016-07-1121:19 白手起家第一步&#xff0c;不是开公司&#xff0c;是脱离原生家庭&#xff0c;白手起家第二步&#xff0c;不是开公司&#xff0c;是挑个上升行业。白手起家第三步&#xff0c;不是开公司&#xff0c;是攒启动资金&#xff0c;白手起家笔四步&…

php反序列靶场serial

1.安装环境 2.使用kali扫描nat端口 3.使用物理机首先访问80端口&#xff0c;提示这里是新cookie进行程序测试&#xff0c;那我们查看cookie 4.f12查看&#xff0c;是一段base64编码 5.进行目录扫描 6.进入backup子目录发现有压缩包 7.下载bak.zip里面有三个源代码&#xff0…

单机部署ELK + Filebeat 收集应用日志

目录 前言一、ELK是什么&#xff1f;二、系统环境&#xff08;CentOS 7&#xff09;&#xff08;2C4G的机器。。。&#xff09;三、安装步骤3.1 安装ElasticSearch3.1.1 解压到/usr/local3.1.2 修改jvm堆配置&#xff08;可选&#xff0c;测试服务器内存低&#xff09;3.1.3 修…

C++初阶:类和对象(下)

✨✨小新课堂开课了&#xff0c;欢迎欢迎~✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;C&#xff1a;由浅入深篇 小新的主页&#xff1a;编程版小新-CSDN博客 1.再探构造函数 1.1构造函数体内赋值 之前…