自己尝试压缩文档,到底有多少效果?——(4.)题外话,如何快速搜寻相同字串

我需要快速的找出出现频率最多的字串,因此需要快速搜寻的涵式
正好Leecode 1044. Longest Duplicate Substring有类似的题目,我们就参考别人的写法稍微改动一下吧

def longestDupSubstring(s):    def rabin_karp(s, length, power, n, M):        cur = 0        hash_map = {}        # 这一步将字串变成比较短小的杂凑值,方便比对        for i in range(length):            cur = (cur * 256 + s[i]) % M         hash_map[cur] = {s[i: i + length]:1}                # 这一步将字串变成比较短小的杂凑值,方便比对        # n 储存实际字串        for i in range(length, n):            cur = ((cur - power[length - 1] * s[i - length]) % M + M) % M            cur = (cur * 256 + s[i]) % M            n = s[i - length + 1 : i - length + 1 + length]                        if cur not in hash_map:                hash_map[cur] = {n:1}            else:                if n in hash_map[cur]: # 如果比对杂凑值相同,再用n来确认字串是否完全一致                    hash_map[cur][n] += 1                else:                    hash_map[cur].update({n:1}) # 在很低的几率中,相同杂凑值出现不同字串,但是还是有这种可能                lst = []        for x, y in hash_map.items():            # j = n, 也就是字串            for j, k in y.items():                # 我们只收录重複次数>2的字串                if k > 2:                    lst.append([j,(length-1)*k]) # 这边是简单假设用 1byte 替换 length byte 的字串,因此可以省下 length-1 byte 的空间,再乘上 k 次重複        return sorted(lst, key=lambda item: item[1], reverse=True)[:2717]        lst = []    n = len(s)    M = 10**7 + 7    power = [1]    for i in range(10):        power.append(power[-1] * 256 % M)    # 正向找重複三次以上    for length in range(3, 10):        lst += rabin_karp(s, length, power, n, M)        lst = sorted(lst, key=lambda item: item[1], reverse=True)[:2717]    return [i[0] for i in lst]

自己尝试压缩文档,到底有多少效果?——(5.)压缩完了,恢复的了吗?


关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章