欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

如何使用Go語言實(shí)現(xiàn)基于泛型的Jaccard相似度算法

 更新時(shí)間:2024年08月06日 11:41:27   作者:Python私教  
這篇文章主要介紹了如何使用Go語言實(shí)現(xiàn)基于泛型的Jaccard相似度算法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧

基本原理

跳表:

jaccard相似度:

jaccard相似度的代碼實(shí)現(xiàn):

時(shí)間復(fù)雜度分析:

快速jaccard算法:

代碼實(shí)現(xiàn),這個(gè)要求兩個(gè)集合都是有序的:

Jaccard相似度算法的基本實(shí)現(xiàn)

算法:

package zdpgo_algorithm
// Jaccard 計(jì)算兩個(gè)數(shù)組之間的Jaccard相似度
// @param arr1 數(shù)組1
// @param arr2 數(shù)組2
// @return float64 相似度
func Jaccard[T Number](arr1 []T, arr2 []T) float64 {
	// 邊界情況
	if len(arr1) == 0 || len(arr2) == 0 {
		return 0
	}
	// 將兩個(gè)數(shù)組轉(zhuǎn)換為字典
	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{}{}
	}
	// 計(jì)算交集的元素個(gè)數(shù)
	var count float64
	for k, _ := range m1 {
		if _, ok := m2[k]; ok {
			count++
		}
	}
	// 使用算法公式計(jì)算相似度
	// 交集個(gè)數(shù) / (集合1個(gè)數(shù) + 集合2個(gè)數(shù) - 交集個(gè)數(shù))
	// 由于結(jié)果是浮點(diǎn)數(shù)類型,需要手動(dòng)將結(jié)果轉(zhuǎn)換為浮點(diǎn)數(shù)類型
	return count / float64(len(arr1)+len(arr2)-int(count))
}

基本的測(cè)試代碼:

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

基于有序數(shù)組的Jaccard相似度算法實(shí)現(xiàn)

算法:

// JaccardSorted 用于兩個(gè)有序數(shù)組的快速Jaccard相似度算法
// 時(shí)間復(fù)雜度:O(n)
// @param arr1 數(shù)組1,要求是有序的
// @param arr2 數(shù)組2,要求是有序的
// @return float64 相似度
func JaccardSorted[T Number](arr1 []T, arr2 []T) float64 {
	if len(arr1) == 0 || len(arr2) == 0 {
		return 0
	}
	// 求交集的個(gè)數(shù)
	count := 0
	for i, j := 0, 0; i < len(arr1) && j < len(arr2); {
		// 兩個(gè)有序的數(shù)組,只有其中的某個(gè)片段是連續(xù)相同的
		if arr1[i] == arr2[j] {
			// 這種情況說明重疊的部分已經(jīng)出現(xiàn)了
			count++
			i++
			j++
		} else if arr1[i] < arr2[j] {
			// 這種情況說明重疊的部分在arr1的后面,讓arr1的索引往后遞增
			i++
		} else {
			// 這種情況說明重疊的部分在arr2的后面,讓arr2的索引往后遞增
			j++
		}
	}
	// 計(jì)算相似度
	return float64(count) / float64(len(arr1)+len(arr2)-count)
}

測(cè)試代碼:

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

到此這篇關(guān)于如何使用Go語言實(shí)現(xiàn)基于泛型的Jaccard相似度算法的文章就介紹到這了,更多相關(guān)Go語言Jaccard相似度算法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解Go語言中make和new的區(qū)別

    詳解Go語言中make和new的區(qū)別

    Go語言中,有兩個(gè)比較雷同的內(nèi)置函數(shù),分別是new和make方法,那他們有什么區(qū)別呢?本文將通過一些示例為大家詳細(xì)介紹一下,感興趣的可以了解一下
    2023-02-02
  • golang fmt占位符的使用詳解

    golang fmt占位符的使用詳解

    這篇文章主要介紹了golang fmt占位符的使用詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • 盤點(diǎn)總結(jié)2023年Go并發(fā)庫有哪些變化

    盤點(diǎn)總結(jié)2023年Go并發(fā)庫有哪些變化

    這篇文章主要為大家介紹了2023年Go并發(fā)庫的變化盤點(diǎn)總結(jié),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • Go語言中的通道chan使用指南

    Go語言中的通道chan使用指南

    Go語言的通道chan是實(shí)現(xiàn)并發(fā)編程的關(guān)鍵工具,主要用于goroutine之間的數(shù)據(jù)傳輸,本文主要介紹了通道的基本操作如創(chuàng)建、發(fā)送、接收和關(guān)閉數(shù)據(jù),以及使用select語句進(jìn)行多路復(fù)用和超時(shí)控制,感興趣的可以了解一下
    2024-10-10
  • Go標(biāo)準(zhǔn)庫http?server的優(yōu)雅關(guān)閉深入理解

    Go標(biāo)準(zhǔn)庫http?server的優(yōu)雅關(guān)閉深入理解

    這篇文章主要為大家介紹了Go標(biāo)準(zhǔn)庫http?server的優(yōu)雅有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪關(guān)閉深入理解
    2024-01-01
  • Gin的中間件執(zhí)行流程與用法詳解

    Gin的中間件執(zhí)行流程與用法詳解

    我們?cè)谑褂肎in框架進(jìn)行Web開發(fā)的時(shí)候,基本上都會(huì)遇到登錄攔截的場(chǎng)景,在Gin當(dāng)中,?中間件和業(yè)務(wù)處理函數(shù)都是一樣的類型,都是一種函數(shù),本文給大家介紹了Gin的中間件執(zhí)行流程與用法,需要的朋友可以參考下
    2024-04-04
  • GoLand一鍵上傳項(xiàng)目到遠(yuǎn)程服務(wù)器的方法步驟

    GoLand一鍵上傳項(xiàng)目到遠(yuǎn)程服務(wù)器的方法步驟

    我們開發(fā)項(xiàng)目常常將項(xiàng)目上傳到linux遠(yuǎn)程服務(wù)器上來運(yùn)行,本文主要介紹了GoLand一鍵上傳項(xiàng)目到遠(yuǎn)程服務(wù)器的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • 手把手帶你運(yùn)行自己的第一個(gè)Go程序

    手把手帶你運(yùn)行自己的第一個(gè)Go程序

    Go語言被設(shè)計(jì)成一門應(yīng)用于搭載Web服務(wù)器,存儲(chǔ)集群或類似用途的巨型中央服務(wù)器的系統(tǒng)編程語言,這篇文章主要介紹了如何運(yùn)行自己的第一個(gè)Go程序的相關(guān)資料,需要的朋友可以參考下
    2025-07-07
  • 解決Golang time.Parse和time.Format的時(shí)區(qū)問題

    解決Golang time.Parse和time.Format的時(shí)區(qū)問題

    這篇文章主要介紹了解決Golang time.Parse和time.Format的時(shí)區(qū)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • golang實(shí)現(xiàn)對(duì)JavaScript代碼混淆

    golang實(shí)現(xiàn)對(duì)JavaScript代碼混淆

    在Go語言中,你可以使用一些工具來混淆JavaScript代碼,一個(gè)常用的工具是Terser,它可以用于壓縮和混淆JavaScript代碼,你可以通過Go語言的`os/exec`包來調(diào)用Terser工具,本文給通過一個(gè)簡單的示例給大家介紹一下,感興趣的朋友可以參考下
    2024-01-01

最新評(píng)論