集合 — redis 設計與實現
求交集演算法¶sinter 和 sinterstore 兩個命令所使用的求並交集演算法可以用 python 表示如下:
# coding: utf-8
def sinter(*multi_set):
# 根據集合的基數進行排序
sorted_multi_set = sorted(multi_set, lambda x, y: len(x) - len(y))
# 使用基數最小的集合作為基礎結果集,有助於降低常數項
result = sorted_multi_set[0].copy()
# 剔除所有在 s[0] 中存在,但在其他集合中不存在的元素
for elem in sorted_multi_set[0]:
for s in sorted_multi_set[1:]:
if (not elem in s) and (elem in result):
result.remove(elem)
break
return result
演算法的複雜度為 o(n2) , 執行步數為 s∗t , 其中 s 為輸入集合中基數最小的集合, 而 t 則為輸入集合的數量。
有序區間求交集演算法
我們知道,兩個集合的交集必定是去滿足範圍小的那個集合,因此此題的解法就是每次尋找乙個小的範圍。那麼,關鍵之處就在於如何尋找這個範圍。如下圖所示,兩個集合和 集合從左到右進行掃瞄,每次選取邊界的時候都是去選取值小的邊界,假設兩個陣列的索引分別為i和j並指向起始位置。以此類推 那麼,什麼時候確定為乙個結...
求集合交集
求整數集合a與整數集合b的交集。輸入格式 輸入有三行 第一行是a和b的元素個數m和n 第二行是集合a的m個元素 第三行是集合a的n個元素。輸出格式 輸出交集的所有元素 按照在a集合出現的順序輸出,最後乙個輸出後面沒有空格 輸入樣例 在這裡給出一組輸入。例如 3 410 9 2 9 10 8 0 輸出...
求交集和並集的線性演算法
假設有集合a b 1 求交集,需要得到結果 a b 思路如下 建立乙個雜湊表 hashtable 其鍵 key 表示集合中數字的值,其值 value 表示集合中數字出現的次數 遍歷集合a,將集合中的每個數字 key 插入雜湊表,每個數字的出現次數 value 設定為1 遍歷集合b,對於集合中的每個數...