如何使用Go語言實現(xiàn)基于泛型的Jaccard相似度算法
基本原理
跳表:

jaccard相似度:

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

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

快速jaccard算法:

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

Jaccard相似度算法的基本實現(xiàn)
算法:
package zdpgo_algorithm
// Jaccard 計算兩個數(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
}
// 將兩個數(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{}{}
}
// 計算交集的元素個數(shù)
var count float64
for k, _ := range m1 {
if _, ok := m2[k]; ok {
count++
}
}
// 使用算法公式計算相似度
// 交集個數(shù) / (集合1個數(shù) + 集合2個數(shù) - 交集個數(shù))
// 由于結(jié)果是浮點數(shù)類型,需要手動將結(jié)果轉(zhuǎn)換為浮點數(shù)類型
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))
}基于有序數(shù)組的Jaccard相似度算法實現(xiàn)
算法:
// JaccardSorted 用于兩個有序數(shù)組的快速Jaccard相似度算法
// 時間復(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
}
// 求交集的個數(shù)
count := 0
for i, j := 0, 0; i < len(arr1) && j < len(arr2); {
// 兩個有序的數(shù)組,只有其中的某個片段是連續(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++
}
}
// 計算相似度
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))
}到此這篇關(guān)于如何使用Go語言實現(xiàn)基于泛型的Jaccard相似度算法的文章就介紹到這了,更多相關(guān)Go語言Jaccard相似度算法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(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
GoLand一鍵上傳項目到遠(yuǎn)程服務(wù)器的方法步驟
我們開發(fā)項目常常將項目上傳到linux遠(yuǎn)程服務(wù)器上來運行,本文主要介紹了GoLand一鍵上傳項目到遠(yuǎn)程服務(wù)器的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06
解決Golang time.Parse和time.Format的時區(qū)問題
這篇文章主要介紹了解決Golang time.Parse和time.Format的時區(qū)問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-04-04

