用于生成重复对列表的算法

时间:2012-06-30 14:39:25

标签: algorithm optimization combinatorics

  

给定下面格式的文本文件,每行最多50个列表   名。编写程序会生成一系列显示的名称   在至少五十个不同的列表中一起

Tyra,Miranda,Naomi,Adriana,Kate,Elle,Heidi
Daniela,Miranda,Irina,Alessandra,Gisele,Adriana
     

在上面的例子中,米兰达和阿德里安娜一起出现两次,但是   每隔一对只出现一次。它应该回来   “米兰达,阿德里安娜\ n”。可以返回近似解决方案   列表至少出现50次概率很高。

我在考虑以下解决方案:

  1. 在阅读完文件后生成Map <Pair,Integer> pairToCountMap。

  2. 遍历地图,打印计数> = 50

  3. 的地图

    有更好的方法吗?该文件可能非常大,我不确定近似解决方案的含义。任何链接或资源将非常感激。

2 个答案:

答案 0 :(得分:2)

首先让我们假设名称的长度有限,因此对它们的操作是恒定的时间。

如果答案适合记忆,你的答案应该是可以接受的。如果您的N行各有m个名称,那么您的解决方案应该O(N*m*m)完成。

如果该数据集不适合内存,您可以将对写入文件,使用合并排序对该文件进行排序,然后扫描到计数对。运行时间为O(N*m*log(N*m)),但由于有关磁盘访问速度的详细信息,实际运行速度会快得多。

如果您有分布式群集,则可以使用MapReduce。它的运行方式与上一个解决方案非常相似。

至于统计方法,我的猜测是,它们意味着遍历文件列表以查找每个名称的频率,以及其中包含不同名称数量的行数。如果我们假设每一行是一个随机的名称分类,使用统计数据我们可以估计任何一对共同名称之间有多少交叉点。这将与文件的长度大致呈线性关系。

答案 1 :(得分:1)

您可以为每个名称获取它出现的行号列表(使用哈希表来存储名称),然后为每对名称获取相应行索引的交集大小(在两个递增序列,这是线性时间)。 假设名称的长度受常数限制。因此,如果您有N个名称和M行,那么构建列表就像O(MN),最后一个阶段是O(N^2 M)