时间复杂度优于 O(n**2) 的成对比较算法
我有大约 500,000 个 10 个单词的数组,即 500,000 个单词 10-grams。对于每个 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']
如果我们对两个数组包含相同单词的位置使用 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 循环中)做得更好?
I have around 500,000 arrays of 10 words i.e. 500,000 word 10-grams. For every 10-gram, I need to know in which positions, if any, the remaining 499,999 10-grams have identical elements:
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']
If we use a 1 for positions where the two arrays contain the same word and a 0 for positions where they contain different words, the intersection of a with b would be represented as [1, 0, 1, 0, 1, 0, 1, 0, 1, 0]; the intersection of a with z would be represented as [0, 0, 0, 0, 0, 1, 1, 1, 1, 1], etc.
Can we do better than a naive O(n**2) algorithm, i.e. one for loop within another for loop?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
有趣的问题:)
所以我有一个想法,我认为它是
O(n*log(n) + n)
,其中+n
渐近无关。所以我建议如下:
基本集:
所以为了方便起见,我只是使用数字并将列表中的位置添加为第一个值。
我建议对数据集的每一列数据依次进行排序,其中排序是
O(n*log(n))
,然后将所有具有相同值的条目的位置值添加到集,其时间复杂度为O(n)
。结果类似于:这可以解释为
条目 6、18、24 和 26 在位置 1 具有相同的值。
检查两个条目是否对应的方法是
Ò(1)
withtrue if (a in match_set) and (b in match_set) else false
代码示例如下:
Fun question :)
So I have an idea and I think it is
O(n*log(n) + n)
where+n
asymptotically irrelevant.So I would propose something as follows:
Base set:
So I just used numbers for convenience and added the position in list as first value.
I propose to sort the dataset for each column of the data in turn, where sorting is
O(n*log(n))
, and then add the positional value of all entries with the same value to a set, which isO(n)
. The result looks something like:This can be interpreted as
Entry 6, 18, 24 and 26 have the same value in position 1.
Checking if two entries correspond is
Ò(1)
withtrue if (a in match_set) and (b in match_set) else false
Code example below: