Это зависит от того, что вы подразумеваете под в среднем здесь. В области CS среднее значение имеет очень точное значение: Среднее значение для всех возможных наборов входных сигналов, если предположить, что каждый возможный входной набор имеет такую же вероятность. Это определение удобно, потому что оно точный и довольно простой в обращении, но в некоторых случаях не самый полезный, поскольку реальные данные слова обычно отличаются от случайных чисел, поэтому, возможно, лучшее определение в среднем будет: означает все входные наборы реального мира. Но это не очень точно и не будет работать в научном контексте, поэтому вы не найдете этого в академических кругах. Разница обоих определений огромна: в реальных данных вы можете разумно предположить, что есть фиксированный процент K1
входных наборов, которые можно сортировать в линейном времени с помощью чего-то вроде timsort. Для случайных данных процент K2(n)
, который можно сортировать по линейному времени, очень быстро опускается до нуля, например K2=Exp(-n)
, причем n
является размером набора входных данных. Итак, точный, академический ответ на ваш вопрос: No, вы не можете улучшить средний случай. Ответ от реального инженера будет Возможно,, все зависит, мы можем попробовать. И они это делают.
http://en.wikipedia.org/wiki/Timsort –
Энтропия случайной перестановки равна n log n, так что нет, в среднем мы не можем сделать лучше –
@Niklas В этом случае у вас нет дополнительной информации о базовых данных, которые редко случаются. – pentadecagon