[英]Pairwise comparison algorithm with time complexity better than O(n**2)
我有大約 500,000 個 arrays 的 10 個單詞,即 500,000 個單詞 10-gram。 對於每 10 克,我需要知道其余 499,999 個 10 克在哪些位置(如果有的話)具有相同的元素:
a = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J']
b = ['A', 'M', 'C', 'M', 'E', 'M', 'G', 'M', 'I', 'M']
...
z = ['R', 'R', 'R', 'R', 'R', 'F', 'G', 'H', 'I', 'J']
如果我們在兩個 arrays 包含相同單詞的位置使用 1,在它們包含不同單詞的位置使用 0,則a與b的交集將表示為 [1, 0, 1, 0, 1, 0, 1 , 0, 1, 0]; a與z的交集將表示為 [0, 0, 0, 0, 0, 1, 1, 1, 1, 1] 等。
我們能否比朴素的 O(n**2) 算法做得更好,即一個 for 循環套在另一個 for 循環中?
有趣的問題:)
所以我有一個想法,我認為它是O(n*log(n) + n)
其中+n
漸近無關。
所以我會提出如下建議:
tuple_len = 10
min_value = 1
max_value = 10
number_of_entries = 100
l = [[j] + [randint(min_value,max_value) for i in range(tuple_len)] for j in range(number_of_entries)]
基礎集:
[[0, 9, 10, 3, 6, 3, 10, 9, 7, 8, 4],
[1, 2, 3, 6, 7, 9, 2, 5, 10, 6, 10],
[2, 5, 4, 10, 8, 5, 9, 2, 7, 4, 3],
[3, 5, 9, 4, 5, 5, 3, 10, 1, 4, 4],
[4, 9, 10, 9, 10, 9, 10, 6, 1, 6, 2],
[5, 5, 6, 3, 6, 9, 5, 8, 3, 1, 1],
[6, 9, 7, 5, 5, 5, 2, 1, 2, 3, 6],
[7, 2, 6, 9, 10, 5, 6, 7, 3, 7, 5],
[8, 6, 8, 9, 3, 7, 1, 2, 9, 8, 10],
[9, 7, 5, 7, 2, 1, 3, 7, 1, 2, 9],
[10, 1, 4, 4, 3, 6, 9, 6, 3, 3, 8],
[11, 8, 3, 10, 10, 5, 9, 7, 3, 4, 5],
...]
所以我只是為了方便使用數字,並將 position 添加到列表中作為第一個值。
我建議對數據集的每一列數據依次排序,其中排序是O(n*log(n))
,然后將所有具有相同值的條目的位置值添加到一個集合中,即O(n)
。 結果看起來像:
[{6, 18, 24, 26},
{22, 34},
{1, 6, 19, 31, 57, 58},
{1, 9, 18},
...}
這可以解釋為Entry 6, 18, 24 and 26 have the same value in position 1.
檢查兩個條目是否對應是Ò(1)
與
true if (a in match_set) and (b in match_set) else false
下面的代碼示例:
match_sets = [set() for i in range(tuple_len)]
for position in range(tuple_len):
l = sorted(l, key= lambda x: x[position+1])
last_value = l[0][position+1]
for entry in range(number_of_entries):
if l[entry][position + 1] == last_value:
match_sets[position].add(l[entry][0])
last_value = l[entry][position + 1]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.