问题
我有一个应用程序,其中我想对元素 a0, a1,...,an-1 组成的数组 a 进行排序。我有一个比较函数 cmp(i,j),它比较元素 ai 和 aj,以及一个交换函数 swap(i,j),它交换数组中的元素 ai 和 aj。在应用程序中,执行 cmp(i,j) 函数可能非常昂贵,甚至比排序中任何其他步骤(当然除了其他 cmp(i,j) 调用)的时间都要长得多。您可以将 cmp(i,j) 视为相当冗长的 IO 操作。
请假设出于本问题的目的,没有办法使 cmp(i,j) 更快。假设可能使 cmp(i,j) 更快的所有优化已经完成。
问题
是否存在一种排序算法,可以最小化对 cmp(i,j) 的调用次数?
在我的应用程序中,可能会编写谓词 expensive(i,j),如果调用 cmp(i,j) 将花费很长时间,则该谓词为 true。在我的当前应用程序中,expensive(i,j) 是廉价的,并且 expensive(i,j) ∧ expensive(j,k) → expensive(i,k) 大多数情况下成立。尽管不保证。
是否存在一种利用 expensive(i,j) 的更好的算法来避免昂贵的比较操作?如果是,您能否指出此类算法?
我想了解更多关于此主题的资料。
示例
这是一个与我所拥有的应用程序有些相似的示例。
考虑一组可能很大的文件。在这个应用程序中,目标是在它们之中找到重复的文件。这本质上归结为按照某些任意标准对文件进行排序,然后按顺序遍历它们,输出遇到的相等文件的序列。
当然,读取大量数据是昂贵的,因此可以例如仅读取每个文件的前1MB并计算此数据的哈希函数。如果文件比较相等,则哈希也相等,但反过来不一定成立。两个大文件可能只在末尾附近的一个字节上有所不同。
在这种情况下,expensive(i,j)的实现简单地检查哈希是否相等。如果相等,则需要进行昂贵的深度比较。