将一个输入文件与给定数量的文件匹配的算法

Posted

技术标签:

【中文标题】将一个输入文件与给定数量的文件匹配的算法【英文标题】:Algorithm to match one input file with given numbers of file 【发布时间】:2013-03-27 01:09:16 【问题描述】:

上周我接受了一次采访。我被困在算法回合中的一个问题中。我回答了这个问题,但面试官似乎并不相信。这就是我分享相同内容的原因。

请告诉我这个问题的优化方法,以便在以后的面试中帮助我。

问题:-

给出了 20 个文本文件,所有文件都是 ASCII 文本文件,有 大小小于 10^9 字节。还给出了一个输入,这是 还有一个 ASCII 文件,比如 input.txt。

我们的任务是策略性地将这个输入文件的内容与 给定 20 个文件,并打印最接近的匹配文件的名称。这 输入文件的内容可能仅部分匹配

提前致谢。期待您的友好回复。

【问题讨论】:

这个表格真的没法回答。这些文件是真实文本,还是任何可打印的 ASCII、基本 ASCII 或扩展 ASCII?结果必须是最佳匹配,还是近似值就足够了? 我相信有一个用于这个特定目的的系统工具。 cmp我相信是被命名的。符合 POSIX 标准的 SO。 @Kira 有些事情告诉我这不是面试官所希望的! @JBentley 哈哈,只是说 XD,有时重新发明可用工具并不明智。 @Kira 除了cmp 做了一些完全不同的事情。 【参考方案1】:

作为设计真正功能强大、可扩展的文档相似性系统的建议,我建议阅读Mining Massive Datasets 的第 3 章,该文档可在线免费获得。那里提出的一种方法是通过将字数向量化为集合来“拼凑”数据集,然后对这些字数进行散列处理,并将散列结果族与 Jaccard 相似度进行比较,以获得所有文档之间的分数。如果操作正确,这可以以高精度处理数 PB 的文件。可以从斯坦福的CS246 Slides on Locality Sensitive Hashing 中阅读带有良好图表的明确细节。书中还介绍了更简单的方法,例如词频计数。

【讨论】:

【参考方案2】:

您可以创建某种索引(例如:trie)来汇总输入文件。然后您可以检查有多少索引在文档中匹配。

例如。为长度为 10 的输入文件创建一个 trie。对于文本文件中每个长度为 10(重叠)的字符串,检查其中有多少匹配在 trie 中。

【讨论】:

文件很大,使用trie效率低,使用B+tree会更好。【参考方案3】:

区分它们并通过 wc -l,或在 C++ 中实现 Levenshtein distance,将每一行视为单个字符(或考虑主题域的任何更合适的单元)

【讨论】:

+1,非常好的答案,但是,使用编辑距离算法有点难以实现(在我看来)。 @anonymous:在没有建设性 cmets 的情况下投反对票 - 不好

以上是关于将一个输入文件与给定数量的文件匹配的算法的主要内容,如果未能解决你的问题,请参考以下文章

查找与输入和输出匹配的数学算法

自动将输出文件与输入文件匹配(Applescript x FFMPEG)

grep, egrep, fgrep - 打印匹配给定模式的行

grep命令

(原创)数据结构之利用KMP算法解决串的模式匹配问题

JAVA-文件操作与输入输出流