排序对,每个元素之间的更改次数最少

时间:2011-01-17 14:16:41

标签: algorithm math sorting

一位同事来找我,我设法回答了一个问题,但我不知道我的答案是否正确甚至是好的......

他正在创建一个程序来比较各种文件中的数据 - 在这种情况下是excel电子表格。他有一个比较列表,可以归结为两个文件,并引用其中的单元格。对于每次比较,都需要打开文件,进行比较,然后关闭文件。

当然,如果您订购比较时可以优化这一点,以便您可以保留一个文件而只是更改另一个文件。

那么您应该如何对文件进行排序以最大限度地减少需要关闭和打开文件的次数?

应该注意的是,打开所有文件的想法是不可行的,因为可能会有超过500种不同的电子表格进行比较。

我的解决方案是找到大多数比较中出现的表格,并处理涉及第一个比较的所有比较。然后重复该过程,忽略已经完成的所有比较。

我想知道当你处理第一批时,你想先做最不常见的那些,最后得到最常见的表 - 这就是你接下来处理的表(意味着仍然只有一个文件更改)。 / p>

那么有人可以给我一个更好的选择或确认我的想法是好的(或足够好)吗?

具体例子:

下面是一个示例比较列表,旁边有一个注释,显示每次需要卸载和加载的文件数。例如,在比较fileA和fileB之后,它只需要卸载FileB并加载FileC来进行下一个compariosn。在比较FileA和FileF之后,需要卸载它们以加载FileB和FileC。

FileA   FileB   
FileA   FileC   One file change
FileA   FileD   One file change
FileA   FileE   One file change
FileA   FileF   One file change
FileB   FileC   Two file changes
FileB   FileF   One file change
FileC   FileD   Two file changes
FileC   FileE   One file change
FileD   FileF   Two file changes
FileE   FileF   One file change

理论上,在此示例中,可以重新排列比较的顺序,使其在每个步骤中只需卸载并重新加载一个文件。

FileA   FileB   
FileA   FileD   One file change
FileA   FileE   One file change
FileA   FileF   One file change
FileA   FileC   One file change
FileB   FileC   One file change
FileC   FileD   One file change
FileC   FileE   One file change
FileE   FileF   One file change
FileB   FileF   One file change
FileD   FileF   One file change

所以我想知道的是,最好的算法是对文件对进行排序,以获得最小的文件卸载/加载操作总数。

我应该注意,每次将其更改为一个文件更改并不总是可行的,如下面的简单对比所示:

FileA   FileB   
FileC   FileD   Two file changes

1 个答案:

答案 0 :(得分:1)

这是一个想法:

考虑一个图表,其中每个文件都是一个节点,每个必需的比较都是边缘。

现在,如果您在图表中找到Eulerian Path,则此路径将表示一个序列,以便在每次比较后只发生一次文件替换。

如果不存在欧拉路径,那么一旦你无法继续路径,只需跳转到具有奇数边数的某个节点(如果它们都具有偶数个边,则只需选择任何节点)。这种方法可能仍然会给你最好的结果,但在序列中的某些点,你将不得不替换两个文件而不是一个。我相信应该很容易证明,如果不存在欧拉路径,则不存在仅在每一步替换一个文件的序列。