iT邦幫忙

0

自己嘗試壓縮文檔,到底有多少效果?——(4.)題外話,如何快速搜尋相同字串

  • 分享至 

  • xImage
  •  

我需要快速的找出出現頻率最多的字串,因此需要快速搜尋的涵式
正好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.)壓縮完了,恢復的了嗎?


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言