Проблема
У меня есть приложение, в котором я хочу отсортировать массив a элементов a 0, a 1,..., a n-1к югу > . У меня есть функция сравнения cmp (i, j), которая сравнивает элементы a i и j и swap-функцию swap (i, j), которая меняет элементы a i и j массива. В приложении выполнение функции cmp (i, j) может быть чрезвычайно дорогостоящим до такой степени, когда одно выполнение cmp (i, j) занимает больше времени, чем любые другие шаги в сортировке (кроме других cmp (i, j ) звонит, конечно) вместе. Вы можете думать о cmp (i, j) как о довольно длительной операции ввода-вывода.
Пожалуйста, примите во внимание этот вопрос, что нет способа быстрее сделать cmp (i, j). Предположим, что все оптимизации, которые могли бы сделать cmp (i, j) быстрее уже выполненными.
Вопросы
-
Есть ли алгоритм сортировки, который минимизирует количество вызовов cmp (i, j)?
-
В моем приложении возможно написать предикат дорогой (i, j), который является истинным, если вызов cmp (i, j) займет много времени. дорогой (i, j) дешево и дорого (i, j) &; дорогой (j, k) → дорогой (i, k) в основном выполняется в моем текущем приложении. Однако это не гарантируется.
Может ли существование дорогостоящих (i, j) вариантов улучшить алгоритм, который пытается избежать дорогостоящих операций сравнения? Если да, можете ли вы указать мне на такой алгоритм?
-
Я бы хотел, чтобы указатели содержали дополнительные материалы по этой теме.
Пример
Это пример, который не совсем не похож на приложение, которое у меня есть.
Рассмотрим множество возможных файлов. В этом приложении целью является поиск дубликатов файлов среди них. Это, по сути, сводится к сортировке файлов по произвольному критерию и последующему их перемещению по порядку, выводящим последовательности одинаковых файлов, которые встречались.
Конечно, читатель в больших объемах данных дорог, поэтому можно, например, читать только первый мегабайт каждого файла и вычислять хэш-функцию по этим данным. Если файлы сравниваются равными, то и хешируют, но обратное может не выполняться. Два больших файла могут отличаться только в одном байте ближе к концу.
Реализация дорогостоящего (i, j) в этом случае - это просто проверка того, равны ли хеши. Если это так, необходимо дорогое глубокое сравнение.