簡體   English   中英

優化大集合的交集

[英]Optimize intersection of large sets

前提很簡單:我有兩個整數, ab ,我想找到i a + ib + i都在給定的列表中。 列表rs非常大(10e9項)。 我有以下代碼:

def getlist(a,b):
    a1 = set([i - a for i in rs if i>a])
    b1 = set([i-b for i in rs if i>b]) 

    tomp = list(a1.intersection(b1))
    return tomp

手頭的問題是首先預先計算a1和b1,這會產生內存問題。 我能以某種方式優化我的代碼嗎? 關於該方法的一般評論也是受歡迎的。

輸入示例:

rs = [4,9,16]
a = 3
b = 8

預期產量:

getlist(3,8) = [1]

您可以通過跳過第二組(和中間列表)的創建來優化內存使用量:

def getlist(a, b):
    a1 = {i - a for i in rs if i > a}
    return [i - b for i in rs if i > b and i - b in a1]

該解決方案的時間和空間復雜度為O(n)

如果rs已經是一個set ,這會更快:

def getlist(a, b):
    return [i - a for i in rs if i > a and b + (i - a) in rs]

如果不是,則必須先設置該設置(否則上述算法將非常慢)並且性能與以前基本相同:

def getlist(a, b):
    rs_set = set(rs)
    return [i - a for i in rs_set if i > a and b + (i - a) in rs_set]

但是,如果要對不同的ab值使用相同的函數多次但是相同的rs ,則可以將rs轉換為一次,並且每次都重復使用它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM