亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

如何使用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); {
		// 兩個有序的數組,只有其中的某個片段是連續(xù)相同的
		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相似度算法內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

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

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

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

    golang fmt占位符的使用詳解

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

    盤點總結2023年Go并發(fā)庫有哪些變化

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

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

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

    Go標準庫http?server的優(yōu)雅關閉深入理解

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

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

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

    GoLand一鍵上傳項目到遠程服務器的方法步驟

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

    手把手帶你運行自己的第一個Go程序

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

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

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

    golang實現對JavaScript代碼混淆

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

最新評論