algorithm - 查找具有相似产品的类别 - 低效率 - 去
问题描述
你好,对不起我的英语
我有一个与每个类别相关的类别和产品列表
cats = [cat1, cat2, cat3]
prod = {
cat1 = [a, b, c]
cat2 = [d, e, c]
cat3 = [z, x, w]
}
我想要的是
{
group1: [cat1, cat2]
group2: [cat3]
}
我需要对共享您的某些产品的类别进行分组
一切都对我有用,但我有400,000个类别,制作两个这样数量的循环并不好。我的算法需要 4 天才能完成
我刚开始使用golang,有人知道如何处理这个问题吗?谢谢
- 组可以是任意大小
- 产品数量因类别而异
- 相似度百分比可能会改变
func main() {
cats, prod := getDataDB()
for _, cat1 := range cats {
for _, cat2 := range cats {
result := percentageSimilarity(prod[cat1], prod[cat2])
if result > 50{
// save group
}
}
}
}
func percentageSimilarity(a, b []string) int {
sum := 0
percentage := 0
if len(a) > len(b) {
for _, key := range a {
if contains(b, key) {
sum++
}
}
percentage = sum * 100 / len(b)
} else {
for _, key := range b {
if contains(a, key) {
sum++
}
}
percentage = sum * 100 / len(a)
}
return percentage
}
func contains(s []string, e string) bool {
for _, a := range s {
if a == e {
return true
}
}
return false
}
解决方案
首先,将您的类别从最少的产品排序到最多的产品。
接下来,创建一个从产品到包含该产品的类别数组的映射。
现在做这样的事情:
for each category
create empty category_shared_products map from category to count of shared products
for each product
for each other_category containing that product
add/increment category_shared_products[other_category]
decide what to merge this category into (if anything)
有很多细节需要做对。但现在我们不再查看每一对类别,而是只查看实际上共享产品的成对类别。
推荐阅读
- .htaccess - htaccess 使用包含数组的查询字符串重定向到不同的域
- angularjs - 当在数组中的另一个对象中选择单选按钮时,单选按钮停止显示其值
- python - folium map 不刷新地图上的数据并显示以前的数据可视化
- react-native - 无法使用 react-native-fetch-blob 下载大文件(80mb zip)
- git - 在不提交新分支的情况下合并 git repo 的本地更改
- customization - 根据当前文件夹更改 Powerlevel9k 段
- asp.net - 将媒体文件从一个文件夹复制到另一个文件夹,但重命名文件
- java - 具有多个客户端的中央身份验证服务器使用资源所有者密码凭据 oauth 流
- reactjs - 没有'Access-Control-Allow-Origin' Symfony 3 和 React
- javascript - 将使用 axios 获取的 json 数据拆分为一个可点击的列表项,该列表项重定向到页面