【问题标题】:How to find differences between 2 almost-identical files very fast?如何快速找到 2 个几乎相同的文件之间的差异?
【发布时间】:2011-10-27 04:48:07
【问题描述】:

如果您有两个基本相同的文件,其中包含 1000 多条记录,您将如何编写代码来找出它们之间的差异。假设不允许使用 unix/linux 命令。

我的想法:

由于大部分条目是相同的,我们可以对两个文件的条目进行排序,然后逐一比较每个条目,例如file1 中的条目 i 与 file2 中的条目 i 进行比较。它是 O(n lg n),n 是文件的大小。

有 O(n) 的解决方案吗?

【问题讨论】:

  • 这听起来很像家庭作业......
  • 在一定大小的输入范围内,哈希表可以为您提供线性时间。
  • 相同记录的位置是否需要匹配,或者是否可以在两个文件之间的不同位置找到两条相同的记录?
  • 两种情况都有可能,我们需要考虑这两种情况。
  • @GWW 我不这么认为,但是我从来没有上过编程课。

标签: c++ c algorithm data-structures comparison


【解决方案1】:

哈希表是你的朋友。

  1. 从文件 1 中获取记录。
  2. 散列。
  3. 获取对应的内存地址。
  4. 将其设置为1
  5. 对文件 1 中的所有记录重复。
  6. 对文件 2 中的所有记录重复,但添加 2 而不是设置为 1。

现在您知道哪条记录存在于两个文件中(值 3),哪些只存在于第一个文件中(值 1),哪些只存在于第二个文件中(值 2)。并且在线性时间内。

注意:如果您要实现自己的哈希表,则必须根据需要处理表大小的增长以及冲突。我敢肯定,如果你能做到这一点,那么你不会很难回答这个问题,所以请使用库。

【讨论】:

  • 除非你有一个完美的哈希值,否则你可能会得到高于 3 的值。在这种情况下你打算做什么?
  • 碰撞检测必须用哈希表实现,我在简化......虽然如果有人要求我实现它,我只需将每个对象的不同哈希与其计数器一起存储(错误- 容易但不太可能我不会担心家庭作业)。
  • 你总是可以散列哈希。 (它更快。)
  • @paxdiablo:因为我们在这里讨论冲突,我假设你有两个条目 E1E2h(E1) == h(E2),但这并不意味着 E1 == E2 因此arne 的解决方案是有道理的。
  • @bdares 哦,哎呀。 :) 好吧,您总是可以对一半数据以及“完整哈希”进行哈希处理。它仍然更快,并且不像我最初的建议那样容易出错。 ;)
猜你喜欢
  • 2010-12-04
  • 2011-04-02
  • 2010-10-23
  • 1970-01-01
  • 2012-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多