Обновление: я расширил этот ответ в статье Сортировка со средним сравнением lg(n!)+o(n) .
Да, такой алгоритм существует. Я докажу только границу , но при вероятном предположении рандомизации мы также получим l g ( n ! ) + O ( n 1 - ε ) . Я также опишу попытку для n 0,5 + o ( 1 ) и O ( n 0,5 - ε ) .l g (n!)+o(n)l g (n!)+O( n1 - ε)N0,5 + о ( 1 )O ( n0,5 - ε)
Мы можем предположить, что все элементы различны, аннотируя их при необходимости; средний случай использует отдельные элементы в случайном порядке. Мы можем вычислить среднее количество сравнений, добавив потерю энтропии для каждого сравнения относительно использования справедливой монеты.
Отправной точкой является сортировка вставкой с двоичного поиска , чтобы решить , куда вставить следующий элемент в отсортированный подмножество . Когда ( 1 - ε ) 2 m ≤ | S | ≤ 2 m - 1 , вставка использует не более m сравнений, которые (с точки зрения энтропии) оптимальны с точностью до O ( ε ) аддитивного коэффициента (и для сложности в среднем случае 2 m ≤ | S | ≤ ( 1 +) ε ) 2 мS(1−ε)2m≤|S|≤2m−1mO(ε)2m≤|S|≤(1+ε)2mтоже работает). Теперь, когда не близко к степени 2, вставка элемента A является неоптимальной (даже в среднем случае и независимо от того, как мы уравновешиваем каждый запрос), но если тратить o ( 1 ) сравнений, мы можем направить A к приблизительно равномерному распределению на отрезке длины S, близком к степени 2, мы получаем желаемую оптимальность.|S|Ao(1)AS
Мы достигаем этого, добавляя элементы в пакетах, а иногда эффективно сравнивая элементы пакета друг с другом, так что интервал соответствующий элементу A, уменьшается квазислучайным образом (и с распределением вероятности A внутри интервала почти равномерные), и , когда длина интервала достаточно близко к власти 2, делая бинарный поиск для вставки A .SAAA
Общие конструкции
Мы будем хранить подмножество отсортированных элементов, и для каждого несортированного элемента A мы будем отслеживать минимальный интервал I A в S, где известно, что A находится. | Я А | длина I A ; I A = I B является тождеством интервалов.SAIASA|IA|IAIA=IB
Пусть будет: сравнивать A с B , а затем (в случайном порядке) сравнивать A и B с соответствующими элементами S, пока их интервалы не пересекаются (или имеют длину 1). Элемент S выбирается (в согласованном порядке) , чтобы сделать вероятности для сравнения как можно ближе к 1/2 , насколько это возможно, при условии , что , когда С о т р г е называется, ( , Б )Compare(A,B)ABABSSCompare(A,B)равномерно распределена на . Из-за дизъюнктности в конце концов, С о т р г е сохраняет однородность предположение.IA×IBCompare
Следующие разделы могут быть прочитаны независимо друг от друга.
алгоритмlg(n!)+o(n)
Дано: отсортированный список и пакет из m несортированных элементов; m ∈ ω ( 1 ) ∩ o ( | S | ) ; неотсортированные элементы являются случайными по отношению к S .Smm∈ω(1)∩o(|S|)S
Повторите (1) - (3), пока это возможно:
1. Выберите два элемента и B из партии с I A = I B (любой выбор будет работать).
2. Запуск С о т р г е ( , Б ) .
3. Если | Я А | достаточно близко к степени 2, (примечание 1) удалите A из партии (не забывая I A ); и сделать так же с B . Наконец: вставьте все элементы вABIA=IB
Compare(A,B)
|IA|AIAB
и завершить сортировку.S
Примечание 1: для «достаточно близко» любая относительная ошибка (как функция m ) работает до тех пор, пока элементы m - o ( m ) будут удалены на шаге (4) (возможно, примечанием 2). При предположительном предположении рандомизации, используя c log log m / log m, относительная ошибка фиксирует m ( 1 - log - Θ ( c ) m ) элементов, позволяя a l g ( n ! )o(1)mm−o(m)cloglogm/logmm(1−log−Θ(c)m) алгоритм сортировки среднего сравнения.lg(n!)+O(nloglogn/logn)
Примечание 2: Поскольку одна и та же последовательность сравнений приводит к одному и тому же ограничивающему интервалу, почти все элементы пройдут этап (1) раз (если не будут удалены на этапе 4). В начале, если A < B и мы выбираем A , мы сравниваем A с элементом S [ ≈ ( 1 - 1 / √Ω(logm)A<BAA, и каждое применение шага (3) кAимеетO(1)вероятность уменьшения| ЯА| в≈1/(1-1/ √S[≈(1−1/2–√)|S|]AO(1)|IA|раз. Теперь для каждого отношенияa>1, которое не является рациональной степенью 2, имеем∀ε>0∀d>0∃m,n∈N≈1/(1−1/2–√)a>1, и поэтому мы получаемоценкуo(n).∀ε>0∀d>0∃m,n∈N1−ε<amd2n<1+εo(n)
Вероятный алгоритм lg(n!)+O(n1−ε)
По модулю предположения рандомизации мы можем достичь среднего сравнения следующим образом.lg(n!)+O(n1−ε)
Произвольно перемешайте элементы и отсортируйте первую половину в список , сохранив вторую половину как несортированную партию.S
A∈batchG={B∈batch:|P(A<B)−0.5|<n−0.51ε}GAS
- B∈GΘ(1)Compare(A,B)|IA|n−εCompare(A,B)|IA|n−εAS
- B∈GCompare(A,B)B∈G
AnΘ(1)nΘ(1)Θ(logn)εlg(n!)+O(n1−ε)AB
Compare(A,B)ε≈(1−ε)/4/log4/32≈0.09
Возможно, гораздо лучший подход состоит в том, чтобы подождать, пока интервал не станет близким к степени 2, управляя не отдельными длинами интервалов, а распределением длин.
lg(n!)+n0.5+o(1)
|S|=nnIA|IA|n1−o(1)|IA|2⌊lg|IA|⌋A<S[i]n0.5+o(1)
|IA|2⌊lg|IA|⌋
S
|IA|2⌊lg|IA|⌋|IA|/2⌊lg|IA|⌋|IA|2⌊lg|IA|⌋
Compare(A,B)P(A<B)≈0.5IAIAComparek=ω(1)k=ω(1)kSO(logkn+logk)kΘ(logk)k
1/2+n−0.5O(1/n)no(1)n0.5+o(1)
lg(n!)+O(n0.5−ε)|S|+n0.5+ε≈n0.5+ε≈n0.5+εn0.5−ε/2+o(1)SnεIAΘ(nε/2)n1−o(1)nε/2−o(1)lg(n!)+O(n1−ε)O(n0.5−ε′)ε
lg(n!)+o(n)1.5n+o(n)(2+ε)n−O(1)