我有一个包含k个字符串列表的列表(这些k个列表中没有任何重复字符串)。我们知道所有可能的字符串的并集(假设我们有n个唯一的字符串)。
我们需要找到的是:哪两个字符串在k个列表中同时出现最多次(即最常见的一对字符串是哪两个?第二常见的一对字符串是哪两个?依此类推。此外,我还想知道最常见的三元组字符串、第二常见的三元组字符串等等。
我能够想到的唯一算法的时间复杂度很差,基本上为了解决最常见的一对,我会枚举所有可能的n个字符串中的每一对(O(n ^ 2)),然后检查它们在多少个列表中出现(O(k)),然后我会对结果进行排序以得到所需的内容,因此我总体的复杂度是O(n^2.x),忽略最后一次排序。
有没有更好的时间复杂度算法的想法呢?(希望对三元组字符串和四元组字符串等也能运行良好)?用Python编写代码最好,但详细的伪代码(如果相关,则为数据结构)或详细的通用思路也可以!
例如:
myList=[['AB', 'AC', 'ACC'], ['AB','ACC'],['ACC'],['AC','ACC'],['ACC','BB','AC']],
那么,对于“pairs question”的期望输出应为:“AC”、“ACC”是最常见的一对,“AB”、“ACC”是第二常见的一对。
itertools.combinations
和collections.Counter
的函数将会更有帮助。至于frozenset
,它是内置函数。 - Stef