问题
我有一个应用程序,我想对元素数组a进行排序a 0, a 1,...,a n-1。我有一个比较函数cmp(i,j)比较元素a i和a j和一个交换函数swap(i,j),它交换数组的元素a i和a j。在应用程序中,执行cmp(i,j)函数可能非常昂贵,以至于一次执行cmp(i,j)比排序中的任何其他步骤花费的时间更长(除了其他cmp(i,j )电话,当然)在一起。你可能认为cmp(i,j)是一个相当冗长的 IO 操作。
为了这个问题,请假设没有办法让cmp(i,j)更快。假设所有可能使cmp(i,j)更快的优化已经完成。
问题
是否有一种排序算法可以最大限度地减少对cmp(i,j)的调用次数?
如果调用cmp(i,j)需要很长时间,则可以在我的应用程序中编写一个为 true的谓词昂贵(i,j) 。昂贵的(i,j)便宜且昂贵的(i,j) ∧ 昂贵的(j,k) → 昂贵的(i,k)主要适用于我当前的应用程序。但是,这并不能保证。
昂贵(i,j)的存在是否允许更好的算法试图避免昂贵的比较操作?如果是的话,你能指出我这样的算法吗?
我想要关于这个主题的更多材料的指针。
例子
这是一个与我拥有的应用程序并不完全不同的示例。
考虑一组可能很大的文件。在此应用程序中,目标是在其中找到重复的文件。这基本上归结为通过一些任意标准对文件进行排序,然后按顺序遍历它们,输出遇到的相等文件的序列。
当然,大量数据的读取器是昂贵的,因此可以例如只读取每个文件的第一兆字节并对该数据计算哈希函数。如果文件比较相等,则哈希值也相等,但反过来可能不成立。两个大文件只能在接近末尾的一个字节上有所不同。
在这种情况下,昂贵(i,j)的实现只是检查哈希是否相等。如果是,则需要进行昂贵的深度比较。