偷懒好久,再刷leetcode——稀疏相似度

    上次坚持刷leetcode,还是两年前leetcode刚出中文版前后,贡献了部分题目的翻译。偷懒好久了,再次打开,发现题目多了好多,随便刷一道:

    一、题目

    两个(具有不同单词的)文档的交集(intersection)中元素的个数除以并集(union)中元素的个数,就是这两个文档的相似度。例如,{1, 5, 3} 和 {1, 7, 2, 3} 的相似度是 0.4,其中,交集的元素有 2 个,并集的元素有 5 个。给定一系列的长篇文档,每个文档元素各不相同,并与一个 ID 相关联。它们的相似度非常“稀疏”,也就是说任选 2 个文档,相似度都很接近 0。请设计一个算法返回每对文档的 ID 及其相似度。只需输出相似度大于 0 的组合。请忽略空文档。为简单起见,可以假定每个文档由一个含有不同整数的数组表示。

    输入为一个二维数组 docs,docs[i] 表示 id 为 i 的文档。返回一个数组,其中每个元素是一个字符串,代表每对相似度大于 0 的文档,其格式为 {id1},{id2}: {similarity},其中 id1 为两个文档中较小的 id,similarity 为相似度,精确到小数点后 4 位。以任意顺序返回数组均可。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sparse-similarity-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    二、题目分析

    NLP的最基本算法,虽然简化很多,但非常重要。

    看到稀疏,脑海里首先闪出了字典,毕竟查找、修改操作时间复杂度O(1),还能节省内存,依次遍历docs中的每个doc,以内容为键值,以字符串连接方式添加对应文档序号(这个估计是运算速度慢的原因,不过实在懒得在这个地方优化了)。将获得文档集存在的每个字符,以及对应的文档。每个字典值中的文档序号全组合,获得文档对字符,统计字符对数量,即为交集元素数,两个文档长度之和减交集元素数即为并集元素数。

    三、代码实现

import numpy as np
class Solution:
    def computeSimilarities(self, docs: List[List[int]]) -> List[str]:
        def helper(i, v):
            char_dict[v] = '{},{}'.format(char_dict.get(v, ''), i)
            return 1
        
        def helper2(v):
            def helper(k):
                similar_dict[k] = similar_dict.get(k, 0) + 1
                return 1
            [helper(k) for k in ['{},{}'.format(*sorted([int(i) for i in x])) for x in combinations(v[1: ].split(','), 2)]]
            return 1
        
        def helper3(k, v):
            inter_counts = similar_dict.get(k)
            union_counts = sum([len(docs[int(index)]) for index in k.split(',')]) - inter_counts
            sim_rate = inter_counts / union_counts
            return '{}: {:.4f}'.format(k, sim_rate + 1e-9)
            
        char_dict = {}
        similar_dict = {}
        [helper(i, c) for i, l in enumerate(docs) for c in l] 
        [helper2(v) for v in char_dict.values()]
        res = [helper3(k, v) for k, v in similar_dict.items()]
        return res

    四、出现问题

    提交代码后,报解答错误,分析结果:

                my              p
120  74,90: 0.0312  74,90: 0.0313

    132多组结果,一行预期结果与输出不一致,仔细观察,该死的浮点数,遇5进位出现的问题,尝试了np库的round方法,无效,结果还是这样。再次尝试在计算出的相似度结果+1e-9,通过。结果如下:

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yzpwslc

您的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值