簡體   English   中英

時間復雜度優於O(n**2)的成對比較算法

[英]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,則ab的交集將表示為 [1, 0, 1, 0, 1, 0, 1 , 0, 1, 0]; az的交集將表示為 [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.

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