给定下面格式的文本文件,每行最多50个列表 名。编写程序会生成一系列显示的名称 在至少五十个不同的列表中一起
Tyra,Miranda,Naomi,Adriana,Kate,Elle,Heidi Daniela,Miranda,Irina,Alessandra,Gisele,Adriana
在上面的例子中,米兰达和阿德里安娜一起出现两次,但是 每隔一对只出现一次。它应该回来 “米兰达,阿德里安娜\ n”。可以返回近似解决方案 列表至少出现50次概率很高。
我在考虑以下解决方案:
在阅读完文件后生成Map <Pair,Integer>
pairToCountMap。
遍历地图,打印计数> = 50
有更好的方法吗?该文件可能非常大,我不确定近似解决方案的含义。任何链接或资源将非常感激。
答案 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)
。