[英]Optimize intersection of large sets
前提很簡單:我有兩個整數, a
和b
,我想找到i
a + i
和b + 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]
但是,如果要對不同的a
和b
值使用相同的函數多次但是相同的rs
,則可以將rs
轉換為一次,並且每次都重復使用它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.