В основном мы говорим о двух соседних интервалах [a..b-1]
и [b..n]
(границы включены), и вы спрашиваете, почему он представлен как (a, b, n)
вместо (a, b-1, b, n)
?
Вы сами сказали: это "такая маленькая деталь".
Это не влияет на корректность, и любая производительность, полученная при не пересчете b-1
, может быть компенсирована стоимостью передачи его в качестве дополнительного параметра. Стоит ли усилий по профилированию расследовать так или иначе? Нет. Это не влияет на асимптотику алгоритма, и любая разница в производительности незначительна; о таких мелочах не стоит суетиться.
Кстати, стоит отметить, что способ вычисления среднего числа из двух чисел, как указано выше, теперь считается неработоспособным (см .: Блог Google Research: дополнительная информация, дополнительная информация - прочитать все об этом: почти все двоичные запросы и Сломаны слияния ). Джош Блох рекомендует:
int mid = (low + high) >>> 1;
Возвращаясь к исходному вопросу, вообще говоря, если параметр может быть получен из другого, то часто лучше его опустить; это упрощает вызов, а также упрощает анализ из-за явно меньшей области.
Функцию, которая принимает 10 параметров, 5 из которых являются производными, анализировать гораздо сложнее, чем функцию, которая просто занимает 5. Конечно, если производные параметры дороги и / или нетривиальны для вычисления, и вы уже вычислили их значения перед вызовом функции, затем вы можете рассмотреть возможность их передачи.
На самом деле, в примере сортировки слиянием достаточно (a, n)
, поскольку b
выводится из обоих. Однако это вычисление не является тривиальным (ошибка, которую Блох упоминает, избегает обнаружения на 2 десятилетия), поэтому было решено просто пропустить его.
b-1
, напротив, слишком тривиален и лучше его опускать.