Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 每个元素之间更改次数最少的已排序对_Algorithm_Math_Sorting - Fatal编程技术网

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

Algorithm 每个元素之间更改次数最少的已排序对,algorithm,math,sorting,Algorithm,Math,Sorting,一位同事向我提出一个问题,我设法回答了,但我不知道我的答案是对的还是好的 他正在创建一个程序来比较各种文件中的数据——在本例中是excel电子表格。他有一个比较列表,可以归结为两个文件,其中包含对单元格的引用。对于每次比较,必须打开文件,进行比较,然后关闭文件 当然,如果您对比较进行排序,这样您就可以保留一个文件而只更改另一个文件,那么这一点就可以得到优化 那么,您应该如何对文件进行排序,以尽量减少关闭和打开文件的次数 应该注意的是,仅仅打开所有文件的想法是不可行的,因为可能会有500多个不同的

一位同事向我提出一个问题,我设法回答了,但我不知道我的答案是对的还是好的

他正在创建一个程序来比较各种文件中的数据——在本例中是excel电子表格。他有一个比较列表,可以归结为两个文件,其中包含对单元格的引用。对于每次比较,必须打开文件,进行比较,然后关闭文件

当然,如果您对比较进行排序,这样您就可以保留一个文件而只更改另一个文件,那么这一点就可以得到优化

那么,您应该如何对文件进行排序,以尽量减少关闭和打开文件的次数

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

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

我想知道,当您处理第一批时,您是否希望先处理最不常见的批,最后生成最常见的表-这就是您接下来处理的表(意味着仍然只有一个文件更改)

那么,有谁能给我一个更好的选择,或者确认我的想法是好的(或者足够好)

具体例子:

下面是一个比较示例列表,旁边有一个注释,显示每次需要卸载和加载多少文件。例如,在比较fileA和fileB之后,只需卸载fileB和加载FileC即可进行下一次比较。在比较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
这里有一个想法:

考虑一个图,其中每个文件都是一个节点,每个所需的比较都是一条边

现在,如果您在图中找到一个,那么这个路径将表示一个序列,这样在每次比较之后只会发生一个文件替换


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

用一个具体的例子更容易理解True。本打算添加一个,但最后忘了。:)@笑脸人,@ran:更新了一个例子,希望能澄清我的目标。听起来它肯定会起作用。如果没有欧拉路径,那么问题就变成了如何最大限度地减少重新启动路径的次数的关键问题…@Chris:我编辑了一点来处理没有欧拉路径的情况。基本上,跳到具有奇数条边的节点-这将为剩余的比较找到最佳覆盖率。就像以前的谜语一样,你必须在不从纸上提起铅笔的情况下画一幅画……现在我突然想到,最小重启次数可以通过奇数度的顶点数计算出来(如果我正确理解术语的话)。这些奇点应该是最优解的起点和终点。现在我只需要看看如何最好地跟踪图形和其他东西你的最后一句话错了。考虑一下你有一个文件需要和其他3个文件进行比较的情况。没有欧拉路径,而是一个简单的最优文件比较序列。因此,前面的声明(该算法是最优的)也是错误的。