问答

算法:按照标签相似度获取指定数量的其他值?

作者:admin 2021-05-14 我要评论

加入有一个游戏包含很多标签,这个时候有一个游戏推荐的栏目,其规则如下: 首先寻找标签完全一致的游戏,有4个就提取4个 不够4个就寻找标签有一个不同的游戏, ...

在说正事之前,我要推荐一个福利:你还在原价购买阿里云、腾讯云、华为云服务器吗?那太亏啦!来这里,新购、升级、续费都打折,能够为您省60%的钱呢!2核4G企业级云服务器低至69元/年,点击进去看看吧>>>)

加入有一个游戏包含很多标签,这个时候有一个游戏推荐的栏目,其规则如下:

  1. 首先寻找标签完全一致的游戏,有4个就提取4个
  2. 不够4个就寻找标签有一个不同的游戏,
  3. 依次类推直到全不相同的游戏

好像有什么二进制运算啥的,但是搞不清楚。跪求大佬指引?

###

假设你的一个游戏和标签是按照id绑定的,那么直接按照匹配个数排序就好了吧。二进制解决方案没想到

func findGame(labels [][]int, label []int){
   findSame := func(sli1, sli2 []int) (num int){
      for i := range sli1{
         for j := range sli2{
            if sli1[i] == sli2[j]{
               num ++
               break
            }
         }
      }
      return
   }
   sort.Slice(labels, func(i, j int) bool {
      return findSame(label, labels[i]) > findSame(label, labels[j])
   })
}

如果绑定的id还是有序的那么还能在寻找匹配个数时再优化

###

这个问题难度在于一般没有数据库支持这种功能,直接处理复杂度要逆天。

研究了一天,弄出来了,二进制版本:
将每一个tag保存在二进制的一位,比如:a->001, b->010, c->0100,然后也将每一个游戏的标签转换为二进制,比如有两个标签:011。通过定时任务去计算,只需要计算两个二进制就可以了,然后获取结果,最后汇聚再排序就好了。复杂度还是很高。

另一种方式是es,可以实时获取,想办法把权重重置为匹配到一个设为1就好了,然后权重排序尝试了半天才能es实现

版权声明:本文转载自网络,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本站转载出于传播更多优秀技术知识之目的,如有侵权请联系QQ/微信:153890879删除

相关文章
  • 请问下prometheus怎么进行自定义的按业

    请问下prometheus怎么进行自定义的按业

  • 节流函数为什么,点击无效,监听窗口大

    节流函数为什么,点击无效,监听窗口大

  • express访问静态资源失败

    express访问静态资源失败

  • IE 浏览器下 match 方法报错

    IE 浏览器下 match 方法报错

腾讯云代理商
海外云服务器