Скачиваний:
83
Добавлен:
01.05.2014
Размер:
3.82 Mб
Скачать

Original pages: 218-294 121

следовательно, необходимо выполнить около n log2 n сравнений.

Соотношение (1) часто называют ”теоретико-информационной нижней оценкой”, поскольку специалист в области теории информации сказал бы, что в процессе сортировки проверяется (log2 n!) ”битов информации”; каждое сравнение дает не более одного ”бита информации”. Такие деревья, как на рис. 34, называют также ”вопросниками” (”questionnaires”), а их математические свойства исследованы в книге Клода Пикара Theorie des questionnaires (Paris: Gauthier-Villars, 1965). Из всех рассмотренных нами методов сортировки три метода требуют меньше всего сравнений: бинарные вставки (ср. с п. 5.2.1), выбор из дерева (ср. с п. 5.2.3) и простое двухпутевое слияние, как оно описано в алгоритме 5.2.4L. Нетрудно видеть, что максимальное число сравнений для метода бинарных

вставок равно

X

 

B(n) =

dlog2 ke = ndlog2 ne − 2dlog2 ne + 1

(3)

1 k n

(ср. с упр. 1.2.4-42), а максимальное число сравнений для алгоритма 5.2.4L приведено в упр. 5.2.4-14. Оказывается (см. п. 5.3.3), что для выбора из дерева верхняя оценка числа сравнений либо такая же, как для бинарных вставок, либо такая же, как для двухпутевого слияния, в зависимости от того, как строится дерево. Во всех трех случаях имеем асимптотическое значение n log2 n; объединяя верхнюю и нижнюю оценки для S(n), докажем, что

lim

S(n)

= 1:

(4)

 

n!1 n log2 n

 

 

Таким образом, мы получили приближенную формулу для S(n), однако желательно иметь более точную информацию. В следующей таблице приведены значения указанных выше величин при малых n:

n = 1 2 3 4 5

6

7

8

9 10 11 12 13 14 15 16 17

dlog2 n!e = 0 1 3 5 7

10

13

16

19 22 26 29 33 37 41 45 49

B(n) = 0 1 3 6 8

11

14

17

21 25 29 33 37 41 45 49 54

L(n) = 0 1 3 5 9

11

14

17

25 27 30 33 38 41 45 49 65

Здесь B(n) и L(n) относятся соответственно к бинарным вставкам и слиянию списков. Можно показать, что B(n) L(n) при любом n (см. упр. 2).

Как видно из приведенной выше таблицы, S(4) = 5, но S(5) может равняться либо 7, либо 8. В результате снова приходим к задаче, поставленной в начале x 5.2. Каков наилучший способ сортировки пяти элементов? Возможна ли сортировка пяти элементов при помощи всего семи сравнений?

Такая сортировка возможна, но сам способ найти не так просто. Начинаем так же, как при сортировке четырех элементов посредством слияний, сравнивая сперва K1 : K2, затем K3 : K4, а затем наибольшие элементы обеих пар. Эти сравнения порождают конфигурацию, которую можно изобразить диаграммой

Picture:

Рис. стр. 222

показывающей, что a < b < d и c < d. (Для представления известных отношений порядка между элементами удобно воспользоваться направленными графами, такими, как этот, где неравенство x < y считается известным тогда и только тогда, когда на графе есть путь от xк y.) Теперь вставляем пятый элемент K5 = e в соответствующее место среди fa; b; d g; для этого требуются всего два сравнения, поскольку можно сравнить его сначала с b, а затем с a или d. Таким образом, остается одна из четырех возможностей:

Picture: p.223

и в каждом случае достаточно еще двух сравнений, чтобы вставить c в цепочку остальных элементов, меньших d. Такой способ сортировки пяти элементов впервые обнаружил Г. Б. Демут [Ph. D. thesis, Stanford University (Oct., 1956). 41–43].

Сортировка вставками и слиянием. Изящное обобщение изложенного выше метода принадлежит Лестеру Форду мл. и Селмеру М. Джонсону. Поскольку оно объединяет некоторые особенности двух способов сортировки: посредством слияний и посредством вставок, то мы назовем этот метод сортировкой вставками и слиянием. Рассмотрим, например, задачу сортировки 21 элемента. Начать можно со сравнений десяти пар ключей K1 : K2, K3 : K4, : : : , K19 : K20, затем следует отсортировать вставками и слиянием большие элементы пар. В результате получим конфигурацию

Picture: 223.2

122Original pages: 218-294

аналогичную (5). Следующий шаг состоит в том, чтобы вставить элемент b3 в последовательность fb1; a1; a2 g, а затем b2—в последовательность остальных элементов, меньших a2, приходим к конфигурации

Picture: 223.3

Назовем верхние элементы главной цепочкой. Элемент b5 можно вставить в главную цепочку за три сравнения (сравнив его сначала с c4, затем с c2 или c6 и т. д.); затем еще за три сравнения можно переместить в главную цепочку b4, что приводит к конфигурации

Picture: 224.1

Следующий шаг решающий; ясно ли вам, что делать дальше? При помощи всего четырех сравнений вставляем b11 не b7) в главную цепочку. После этого элементы b10, b9, b8, b7, b6 (именно в таком порядке) можно вставить в нужное место в главной цепочке не более чем за четыре сравнения каждый.

Аккуратный подсчет числа требуемых сравнений показывает, что 21 элемент можно отсортировать не более чем за 10 + 22 + 2 + 2 + 3 + 3 + 4 + 4 + 4 + 4 + 4 + 4 = 66 шагов. Поскольку

265 < 21! < 266;

ясно также, что и в любом другом случае необходимо не менее 66 сравнений; следовательно,

S(21) = 66:

(10)

(При сортировке бинарными вставками понадобилось бы 74 сравнения.)

В общем случае сортировка вставками и слиянием дляnэлементов выглядит следующим образом:

i)Произвести сравнения bn=2cнепересекающихся пар элементов. (Если n нечетно, то один элемент не участвует в сравнениях.)

ii)Отсортировать bn=2c больших элементов пар, найденных в шаге (i), вставками и слиянием.

iii)Для элементов введем обозначения a1, a − 2, : : : , abn=2c, b1, b2, : : : , bdn=2e, как в (7), где a1 a2

: : : abn=2c и bi ai при 1 i bn=2c; назовем b1 и все элементы a ”главной цепочкой”. Не трогая элементов bj при j > dn=2e, вставить бинарными вставками в главную цепочку остальные

элементы b в следующем порядке:

b3; b2;b5; b4;b11; b10; : : :; b6;btk; btk−1; : : : ; btk−1+1; : : : :

(11)

Нам хотелось бы определить последовательность (t1; t2; t3; t4; : : :) = (1; 3; 5; 11; : : :), участвующую в (11), таким образом, чтобы каждый из элементов btk, btk−1, : : : , btk−1+1 можно было вставить в главную цепочку не более, чем за k сравнений. Обобщая (7), (8) и (9), получим диаграмму

Picture:

224.2

где главная цепочка доkatk−1 включительно содержит 2tk−1 + (tk − tk−k1 − 1) элементов. Это число

должно быть меньше 2

; для нас лучше всего положить его равным 2

− 1, и тогда

 

tk−1 + tk = 2k:

(12)

Поскольку t1 = 1, то для удобства можно положить t0 = 1; тогда, суммируя геометрическую прогрессию, найдем

tk = 2k − tk−1 = 2k − 2k−1 + tk−2 = : : :

 

: : : = 2k − 2k−1 + + (−1)k20 = (2k+1 + (−1)k)=3:

(13)

(Любопытно, что точно такая же последовательность возникла при изучении алгоритма вычисления наибольшего общего делителя двух целых чисел; ср. с упр. 4.5.2-27.)

Пусть F(n)—число сравнений, необходимых для сортировки п элементов вставками и слиянием. Ясно, что

F(n) = bn=2c + F(bn=2c) + G(dn=2e);

(14)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Original pages: 218-294 123

где функция G описывает количество работы, выполняемой в шаге (iii). Если tk−1

m tk, то,

суммируя по частям, получаем

 

 

 

 

 

X

 

 

 

 

 

 

 

 

 

 

 

 

G(m) =

 

j(tj − tj−1) + k(m − tk−1) =

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1 j<k

 

 

 

 

 

 

 

 

 

 

 

 

 

 

= km − (t0 + t1 + + tk−1):

(15)

Положим

 

wk = t0 + t1 + + tk−1 =

 

 

 

 

 

 

 

2k+1=3 ;

(16)

w

; w ; w ; w ; w ; : : :

) = (0

;

1

;

2

;

5

;

10

;

21

; : : :

). В упр.

13 показано, что

 

и тогда ( 0

1 2 3 4

 

 

 

 

 

 

 

 

 

 

 

 

F(n) − F(n − 1) = k тогда и только тогда, когда w − k < n wk+1;

(17)

а последнее условие эквивалентно неравенствам

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2k+1

< n

2k+2

;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3

 

3

 

 

 

 

 

 

 

 

 

 

 

k + 1 < log2(3n) k + 2;

 

следовательно,

 

 

F(n) − F(n − 1) = log2

 

4n :

(18)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3

 

 

(Этой формулой мы обязаны А. Адьяну [Ph. D. thesis, Univ. of Minnesota (1969), 38–42].) Отсюда вытекает, что функция F выражается удивительно простой формулой:

F(n) =

1 k n log2

 

4k ;

(19)

 

X

 

3

 

 

которая очень похожа на соответствующую формулу (3) для бинарных вставок. В ”замкнутом виде” эту сумму можно найти в упр. 14.

Воспользовавшись (19), нетрудно построить таблицу значений функции F(n); имеем

n = 1

2

3

4

5

6

7

8

9 10

11

12

13

14

15

16

17

dlog2 n!e = 0

1

3

5

7

10

13

16

19 22

26

29

33

37

41

45

49

F(n) = 0

1

3

5

7

10

13

16

19 22

26

30

34

38

42

46

50

n = 18 19

20

21

22

23

24

25

26 27

28

29

30

31

32

33

 

dlog2 n!e = 53 57

62

66

70

75

80

84

89 94

98

103

108

113

118

123

 

F(n) = 54 58

62

66

71

76

81

86

91 96

101

106

111

116

121

126

 

Заметим, что при 1 n 11 и при 20 n 21 F(n) = dlog2 n!e; таким образом, при этих значениях сортировка вставками и слиянием оптимальна:

S(n) = dlog2 n!e = F(n) при 1 n 11 и 20 n 21:

(20)

Задачу нахождения функции S(n) поставил Гуго Штейнгауз во втором издании своей классической книги Mathematical Snapshots (Oxford University Press, 1950, 38–399). Он описал бинарные вставки, которые являются наилучшим способом сортировки n элементов при условии, что n-й элемент не рассматривается до тех пор, пока не отсортированы первые n − 1 элементов; и он сделал предположение о том, что метод бинарных вставок оптимален и в общем случае. Несколько лет спустя [Calcutta Math. Soc. Golden Jubilee Commemoration, 2 (1959), 323–327] он сообщил, что двое его коллег, С. Трибула и С. Пин, ”недавно” опровергли его предположение и нашли значения S(n) при n 11. Вероятно, Трибула и Пин независимо пришли к сортировке вставками и слиянием, по которой вскоре появилась публикация Л. Р. Форда и С. М. Джонсона [AMM, 66 (1950), 387–389].

После изобретения сортировки вставками и слиянием первым неизвестным значением функции S(n) стало S(12). Из табл. 1 видно, что число 12! довольно близко к 229, поэтому существование 29-шаговой процедуры сортировки 12 элементов весьма маловероятно. Для решения этого вопроса

9 Есть перевод первого издания этой книги: Математический калейдоскоп, М., Гостехиздат, 1949.–

Прим. перев.

124Original pages: 218-294

Марком Уэлсом был предпринят исчерпывающий поиск (занявший на вычислительной машине Маниак II около 60 ч.), который показал, что S(12) = 30 [Proc. IFIP Congress 65, 2 (1965), 497–498]. Итак, процедура вставок и слияний оказывается оптимальной и при n = 12.

Таблица 1

Значения факториалов в двоичной системе счисления

1 = 1!

10 = 2!

110 = 3!

11000 = 4!

1111000 = 5!

1011010000 = 6!

1001110110000 = 7!

1001110110000000 = 8!

1011000100110000000 = 9!

1101110101111100000000 = 10!

10011000010001010100000000 = 11!

11100100011001111110000000000 = 12!

101110011001010001100110000000000 = 13!

1010001001101111110110010100000000000 = 14!

10011000001110111011101110101100000000000 = 15!

100110000011101110111011101011000000000000000 = 16!

*Более подробный анализ. Чтобы более тщательно исследовать функцию S(n), внимательно изучим диаграммы частичного упорядочения, такие, как (5). Полученные после нескольких сравнений сведения можно представить в виде направленного графа. Этот направленный граф в силу транзитивности отношения < не содержит циклов; следовательно, его всегда можно изобразить таким образом, чтобы все дуги шли слева направо; поэтому удобнее удалить из диаграммы стрелки. В результате диаграмма (5) преобразуется в

Picture: p.227

Пусть G—такой направленный граф; обозначим через T(G) число перестановок, согласующихся с G, т. е. число способов пометить вершины графа G целыми числами f1; 2; : : : ; n g так, чтобы число в вершине x было меньше числа в вершине y, если дуга x ! y принадлежит G. Пример перестановки, согласующейся с (21): a = 1, b = 4, c = 2, d = 5, e = 3. Мы изучили функцию T(G) для различных G в п. 5.1.4, где было замечено, что T(G) есть число способов ”топологически отсортировать” граф G.

Пусть G—граф из n элементов, который можно получить после k сравнений; определим эффективность графа G функцией

E(G) =

n!

:

(22)

2kT(G)

(Эта идея принадлежит Франку Хуану и Шень Линю.) Строго говоря, эффективность не есть функция лишь самого графа G—она зависит от того пути, которым мы пришли к G в процессе сортировки, однако нам удобно допустить эту маленькую неточность. Выполнив еще одно сравнение над элементами i и j, получим два графа G1, и G2: один—для случая Ki < Kj и другой—для случая Ki > Kj. Ясно, что

 

T(G) = T(G1) + T(G2):

 

 

Если T(G1) T(G2), то имеем

 

 

 

 

 

 

T(G) 2T(G1);

 

 

 

n!

E(G)T(G)

E(G):

 

E(G1) =

 

=

 

(23)

2k+1T(G1)

2T(G1)

Следовательно, каждое сравнение приводит к графу меньшей или равной эффективности; нельзя увеличить эффективность за счет дополнительных сравнений.

Заметим, что если G совсем не содержит дуг, то k = 0 и T(G) = n!, т. е. начальная эффективность равна 1. Если же граф G представляет окончательный результат сортировки, то G выглядит как отрезок прямой, и T(G) = 1. Так, например, если нам нужно построить процедуру сортировки, которая бы сортировала пять элементов за семь или менее сравнений, то необходимо получить линейный граф

Picture: 228.1

n0
n0 + n00

Original pages: 218-294 125

эффективность которого равна 5!=(27 1) = 120=128 = 15=16. Отсюда следует, что все графы, возникающие в процессе сортировки, должны иметь эффективность 1516; если бы появился какой-нибудь граф меньшей эффективности, то по крайней мере один из его потомков тоже имел бы меньшую эффективность, и мы бы в конце концов пришли к линейному графу с эффективностью < 1516. В общем случае это рассуждение показывает, что все графы, соответствующие узлам дерева для некоторой процедуры сортировки n элементов, должны иметь эффективность n!=2l, где l + 1—число уровней в дереве. Это еще один способ доказательства неравенства S(n) dlog2 n!e, хотя такое рассуждение на самом деле не сильно отличается от приведенного выше.

Граф (21) имеет эффективность 1, поскольку T(G) = 15 и граф G был получен за три сравнения. Чтобы выяснить, какие вершины должны участвовать в следующем сравнении, можно построить

матрицу сравнений

 

 

0

a

b

c

d

e

1

 

 

 

a

0

15

10

15

11

 

 

 

b

0

0

5

15

7

 

 

 

 

B

 

 

 

 

 

C

 

 

C G

c

 

5

10

0

15

9

C

;

(24)

( ) =

d B

0

0

0

0

3

 

 

 

 

B

 

 

 

 

 

C

 

 

 

 

@

 

 

 

 

 

A

 

 

 

e B

4

8

6

12

0

C

 

 

где Cij есть T(G1) для графа G1, полученного из G путем добавления дуги i ! j. Если мы, например, сравним Kc с Ke, то 15 перестановок, согласующихся с G, распадутся на две группы: Cec = 6, в которых

Ke < Kc, и Cce = 9, в которых Kc < Ke. Последний граф имел бы эффективность 15=(2 9) = 56 < 1516, так что это сравнение не может привести к семишаговой процедуре сортировки. Следующим сравнением,

для того чтобы сохранить эффективность 1516, обязано быть Kb : Ke.

Понятие ”эффективность” особенно полезно при рассмотрении ”связных компонент” графов. Возьмем, например, граф

Picture: p.229.1

он состоит из двух компонент

Picture:

p.229.2

где ни одна дуга не соединяет G0 и G00; следовательно, он был образован путем нескольких сравнений вершин только G0 и независимо нескольких сравнений вершин только G00. В общем случае предположим, что граф G = G0+G00 не содержит дуг, связывающих G0 и G00, где G0 и G00 имеют соответственно n0 и n00 вершин; легко видеть, что

T(G) = T(G0)T(G00); (25)

поскольку каждая перестановка, согласующаяся с G, получается путем выбора n0 элементов, которые считаются принадлежащими графу G0, и последующего составления перестановки, согласующейся с G0, и независимо, перестановки, согласующейся с G00. Пусть внутри G0 выполнено k0 сравнений, а внутри G00—соответственно k00 сравнений; получаем основной результат

E(G) =

(n0 + n00)!

 

=

n0!

 

n00!

= E(G0)E(G00);

(26)

2k0+k00 T(G)

2k0T(G0)

2k00T(G00)

показывающий, что между эффективностью графа и эффективностями его компонент существует простая связь. Поэтому мы можем ограничить наше рассмотрение графами, имеющими только одну компоненту.

Теперь предположим, что G0 и G00—однокомпонентные графы, и мы хотим связать их вместе, сравнив вершину x графа G0 с вершиной y графа G00. Нужно выяснить, насколько эффективным

получится граф. Для этой цели нам необходима функция, которую можно обозначить через

 

 

 

 

p

q

 

 

 

 

m

< n ;

(27)

равная по определению числу перестановок, согласующихся с графом

 

Picture:

p.230

 

 

 

Таким образом,

p

< q есть произведение

m+n

на вероятность того, что p-й наименьший элемент из

 

m

n

m

 

 

множества mчисел меньше q-го наименьшего элемента из независимо выбранного множества nчисел.

 

 

 

 

126 Original pages: 218-294

Вупр. 17 показано, что функцию mp < nq можно выразить через биномиальные коэффициенты двумя

способами:

p m

< nq

=

X m − p + n − k m − p

0 k<q

=

X n − q + m − j

n − q

p j m

 

p −

1

 

 

p − 1 + 1

=

 

 

q − 1

 

(29)

 

q − 1

+ j

:

(Между прочим, алгебраически никоим образом не очевидно, что эти две суммы произведений биномиальных коэффициентов должны быть равны.) Имеем также формулы

p

q

q

p

=

 

m + n

;

 

 

 

m

< n +

n

< m

 

m

 

 

(30)

 

 

q

p

=

 

m

1

p

n + 1

q

 

 

 

n

< m

 

+m

<

n

:

(31)

Для ясности рассмотрим два графа

 

 

 

 

 

 

 

 

 

 

Picture: p.231

 

 

 

 

 

 

 

 

 

 

 

 

Нетрудно показать простым перечислением, что T(G0) = 42и T(G00) = 5; так что если G—граф с 11 вер-

шинами, содержащий G0 и G00 в качестве своих компонент, то по формуле (25) T(G) =

114 42 5 =

69 300. Это число перестановок слишком внушительно, чтобы их можно было выписать и, таким образом, выяснить, в скольких из них xi < yj для всех i и j. Однако это вычисление менее чем за час можно проделать вручную следующим образом. Построим матрицы A(G0) и A(G00), где Aik—число перестановок, согласующихся с G0 (или G00), в которых xi (или yi) равно k. Тогда число перестановок,

согласующихся с G, в которых x

 

 

y есть сумма по всем p и q,

1

p

7

,

1

q

4

, произве-

 

 

 

 

 

 

 

 

i меньше

pj,

 

q

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

дений (ip)-го элемента матрицы A(G0) на

7 <

 

4

и на (jq)-й элемент матрицы A(G00). Иначе говоря,

нужно вычислить произведение матриц A(G0)

 

L

A(G00)T , где Lpq =

 

p7 < 4q

 

. Оно равно

 

 

 

 

21

16

5

0

0

0

0

 

210

294

322

 

329

 

 

 

 

 

 

 

48169

 

42042

66858

64031

 

B

0

5

10

12

10

5

0

 

126

238

301

 

325

C

 

 

 

 

 

B

22825

 

 

16005

53295

46475

 

 

16

5

0

0

0

CB

70

175

265

 

 

 

1

0

2

2

 

 

 

 

42042

66858

 

C

 

021

01

0

 

3151

2

3

0

0

 

048169

 

 

640311

 

B

 

 

 

 

 

 

CB

 

 

 

 

 

 

C

0

0

3

2

 

B

 

 

 

 

 

 

 

 

C

 

 

0

0

12

18

12

0

0

 

35

115

215

 

295

 

B

2

0

C

=

 

 

22110

 

 

14850

54450

47190

:

B

 

 

 

 

 

 

CB

 

 

 

 

 

 

C

 

 

 

 

 

B

 

 

 

 

 

 

 

 

C

 

B

0

0

0

0

5

16

21CB

15

65

155

 

260C

 

 

 

A

 

B

5269

 

 

2442

27258

21131C

 

@

 

 

 

 

 

 

A

@

 

 

 

 

 

 

A

 

 

 

 

@

 

 

 

 

 

 

 

 

A

 

B

0

5

10

12

10

5

0CB

5

29

92

 

204C@

 

 

 

B22825

 

 

16005

53295

46475C

 

B

0

0

0

0

5

16

21CB

1

8

36

 

120C

 

 

 

 

 

B

5269

 

 

2442

27258

21131C

 

Таким образом, ”наилучший” способ соединить G0 с G00—это сравнить x1 с y2; в 42 042 случаях получим x1 < y2 и в 69 300 − 42 042 = 27 258 случаях—x1 > y2. (В силу симметрии, по существу, к тем же результатам привели бы сравнения x3 с y2, x5 с y3 или x7 с y3.) Эффективность полученного графа

для x1 < y2 равна

69 300

84084E(G0)E(G00);

т.е. не особенно высока; следовательно, по-видимому, вообще не стоит ни в одном методе сортировки применять соединение G0 с G00! Смысл этого примера в том, что мы смогли принять такое решение, не производя непомерно больших вычислений. Этими идеями можно воспользоваться также для независимого подтверждения принадлежащего Марку Уэлсу доказательства того, что S(12) = 30.

Начав с графа, содержащего одну вершину, мы можем повторять попытки добавления сравнений к одному из наших графов G или к паре компонент графа G0 и G00 с таким расчетом, чтобы оба полученных графа содержали 12

Picture:

Рис. 36. Некоторые графы и их эффективности, полученные в начале длин-

 

ного доказательства неравенства S(12) > 29.

или менее вершин и обладали эффективностью 12!=229 0:89221. Всякий раз, как это оказывается возможным, мы выбираем граф с меньшей эффективностью и добавляем его к нашему множеству, если только он не является изоморфным одному из уже включенных в множество графов (или двойственным к нему, т. е. получается обращением отношения порядка). Если оба полученных графа имеют одинаковую эффективность, то произвольным образом выбирается один из них. Первые 24 графа, полученные таким способом, изображены на рис. 36, где приведены также их эффективности.

Original pages: 218-294 127

При помощи вычислительной машины было построено ровно 1594 графа, прежде чем этот процесс завершился. Поскольку граф не был получен, можно сделать вывод о том, что S(12) > 29. Весьма правдоподобно, что и для доказательства неравенства S(22) > 70 можно произвести аналогичный эксперимент за вполне разумное время, поскольку 22!=270 0:952—это чрезвычайно высокая эффективность для сортировки за 70 шагов. (Из 1594 найденных графов с 12 или менее вершинами всего 92 имеют столь высокую эффективность.)

Промежуточные результаты дают веские основания предположить, что S(13) = 33, и, следовательно, сортировка вставками и слиянием не оптимальна при n = 13. Но до сих пор никому не удалось обнаружить ни одного такого значения n, что S(n) < F(n).

Наверняка можно доказать, что S(16) < F(16), поскольку F(16)—это как раз такое число сравнений, какое требуется, чтобы сначала отсортировать 10 элементов за S(10) шагов, а затем посредством бинарных вставок вставить по одному остальные шесть элементов. Непременно должен существовать более хороший способ!

Среднее число сравнений. До сих пор мы рассматривали процедуры, наилучшие в том смысле, что они не плохи в наихудшем случае; мы искали ”минимаксные” процедуры, минимизирующие максимальное число сравнений. Поищем теперь ”минисредние” процедуры, минимизирующие среднее число сравнений в предположении, что входные данные случайны, т. е. все перестановки равновероятны.

Рассмотрим еще раз изображенное на рис. 34 представление процедуры сортировки в виде дерева. Среднее число сравнении по всем перестановкам для этого дерева равно

2 + 3 + 3 + 3 + 3 + 2 = 22: 6 3

В общем случае среднее число сравнений для метода сортировки есть длина внешнего пути дерева, деленная на n. (Напомним, что длина внешнего пути—это сумма всех расстояний от корня до каждого из внешних узлов; см. п. 2.3.4.5.) Из обсуждения в п. 2.3.4.5 легко видеть, что минимум длины внешнего пути достигается на таком бинарном дереве с N внешними узлами, у которого имеется 2q − N внешних узлов на уровне q − 1 и 2N − 2q на уровне q, где q = dlog2 Ne. (Корень находится на нулевом уровне.) Таким образом, минимальная длина внешнего пути равна

(q − 1)(2q − N) + q(2N − 2q) = (q + 1)N − 2q:

(33)

Имеется еще один интересный способ охарактеризовать минимальную длину пути: расширенное бинарное дерево имеет минимальную длину внешнего пути тогда и только тогда, когда существует такое число l, что все внешние узлы находятся на уровнях l и l + 1. (См. упр. 20.)

Если положить q = log2 N + , где 0 < 1, то формула минимальной длины внешнего пути примет вид

N(log2 N + 1 + − 2 ):

(34)

График функции 1 + − 2 изображен на рис. 37; при 0 < < 1 она принимает положительные, но очень малые значения, не превышающие

1 − (1 + lnln2)=(ln2) = 0:08607 13320 55934 + :

(35)

Picture: Рис. 37. Функция 1 + − 2 .

Таким образом, минимальная возможная средняя длина пути, которая получается в результате деления (34) на N, не может быть меньше log2 N и больше log2 N +0:0861. (Этот результат впервые получил Э. Глисон в неопубликованной заметке (1956).)

Если теперь положим N = n!, то получим нижнюю оценку среднего числа сравнений по всем схемам сортировки. Заметим, что оценка равна log2 n! + O(1) = n log2 n − n=(ln2) + O(log n).

Пусть —среднее число сравнений, выполняемых алгоритмом сортировки вставками и слия-

F(n)

нием; имеем

n = 1

2

3

4

5

6

7

8

Нижняя оценка(33) = 0

2

16

112

832

6896

62368

619904

 

2

16

112

832

6912

62784

623232

n!F(n) = 0

Итак, сортировка вставками и слиянием оптимальна в обоих смыслах при n 5, однако при n = 6 при таком методе выполняется в среднем 6912=720 = 9:6 сравнения вместо возможных, согласно нижней оценке, 6896=720 = 9:577777 : : : сравнения. Немного подумав, нетрудно понять, почему это так: некоторые ”удачные” перестановки шести элементов сортируются методом вставок и слияний

128Original pages: 218-294

всего за восемь сравнений, и тогда дерево сравнений имеет внешние узлы на трех, а не на двух уровнях. Из-за этого увеличивается суммарная длина пути. В упр. 24 показано, что можно построить процедуру сортировки шести элементов, требующую всегда девять или десять сравнений; следовательно, этот метод превосходит метод вставок и слияний в среднем и не хуже него в худшем случае.

И.Сезари [thesis (Paris, 1968), р. 37] доказал, что при n = 7 не существует метода сортировки, при котором бы достигалась нижняя оценка 62368 длины внешнего пути. (Используя результат упр. 22, этот факт можно доказать вручную.) С другой стороны, он построил процедуры, для которых достигается нижняя оценка (33) при n = 9 или 10. Вообще же задача минимизации среднего числа сравнений гораздо сложнее нахождения функции S(n). Вполне даже возможно, что при некоторых n все методы, минимизирующие среднее число сравнений, в худшем случае требуют более S(n) сравнений.

Упражнения

1.[20] Нарисуйте деревья сравнений для сортировки четырех элементов методами (a) бинарных вставок; (b) простого двухпутевого слияния. Каковы длины внешних путей для этих деревьев?

2.[М24] Докажите, что B(n) L(n), и найдите все значения n, при которых имеет место равенство.

3.[М22] Если допускаются равные ключи, то при сортировке трех элементов возможны 13 исходов:

K1 = K2 = K3; K1 = K2 < K3; K1 = K3 < K2;

K2 = K3 < K1;

K1 < K2 = K3;

K2 < K1 = K3;

K3 < K1 = K2;

K1 < K2 < K3;

K1 < K3 < K2;

K2 < K1 < K3; K2 < K3 < K1; K3 < K1 < K2; K3 < K2 < K1:

Обозначим через Pn число возможных исходов при сортировке n элементов, если допускаются

равные ключи, так что (P0; P1; P2; P3; P4; P5; : : :) = (1; 1; 3; 13; 75; 541; : : :). Докажите, что произво-

дящая функция P(z) =

Pn 0 Pnzn=n! равна 1=(2 − ez). Указание: покажите, что

 

X

n

 

 

Pn = k>0

k Pn−k

при n > 0.

4.[ВМ27] (О. А. Гросс.) Найдите предел последовательности чисел Pn из упр. 3 при n ! 1. [Возможное указание: рассмотрите частичное разложение в дробь ctg z.]

5.[16] Если допускаются равные ключи, то каждое сравнение может иметь не два, а три результата: Ki < Kj, Ki = Kj, Ki > Kj. В этой общей ситуации алгоритмы сортировки можно представлять в виде расширенных тернарных деревьев, в которых каждый внутренний узел i : j имеет три поддерева: левое, среднее и правое, соответствующие трем возможным исходам сравнения.

Нарисуйте расширенное тернарное дерево, определяющее алгоритм сортировки для n = 3, если допускаются равные ключи. В вашем дереве должно быть 13 внешних узлов, соответствующих 13 возможным исходам, перечисленным в упр. 3.

>6. [М22] Пусть S0(n)—минимальное число сравнений, необходимых для сортировки n элементов и выявления всех равенств между ключами, если каждое сравнение имеет три возможных результата, как в упр. 5. Нетрудно обобщить ”теоретико-информационное” рассуждение, приведенное в тексте, и показать, что S0(n) dlog3 Pne, где Pn—функция, изученная в упр. 3 и 4; докажите, что на самом деле S0(n) = S(n).

7.[20] Нарисуйте расширенное тернарное дерево в смысле упр. 5 для сортировки четырех элементов, если известно, что все ключи равны либо 0, либо 1. (Так, например, если K1 < K2 и K3 < K4, то

понятно, что K1 = K3 и K2 = K4!) Добейтесь минимального числа сравнений в среднем, считая, что все 24 возможных исходных файлов равновероятны.

8.[26] Нарисуйте расширенное тернарное дерево, как в упр. 7, для сортировки четырех элементов, если известно, что все ключи равны либо −1, либо 0, либо +1. Добейтесь минимального числа сравнений в среднем, считая, что все 34 возможных исходных файлов равновероятны.

9.[М20] Каково минимальное число сравнений в наихудшем случае при сортировке n элементов, как в упр. 7, когда известно, что все элементы равны либо 0, либо 1?

>10. [М25] Каково минимальное среднее число сравнений при сортировке n элементов, как в упр. 7, когда известно, что все ключи равны либо 0, либо 1? Результат представьте в виде функции от n.

11.[ВМ25] Пусть Sm(n)—минимальное число сравнений, необходимое в наихудшем случае для сортировки n элементов, как в упр. 5, если известно, что все ключи принадлежат множеству

f1; 2; : : : ; m g. [Таким образом, согласно упр. 6, Sn(n) = S(n).] Докажите, что Sm(n) стремится к n log2 m при фиксированном m и n ! 1.

Original pages: 218-294 129

>12. [М25] (У. Г. Бурисиус, около 1954 г.) Предположим, что равные ключи могут встречаться, но мы хотим просто отсортировать элементы fK1; K2; : : :; Kn g так, чтобы определить перестановку a1 a2 : : : an, такую, что Ka1 Ka2 : : : Kan; нам не важно, имеет ли место равенство между

элементами Kai и Kai+1.

Будем говорить, что дерево сравнений сильно сортирует последовательность ключей, если оно сортирует эту последовательность в вышеуказанном смысле, независимо от того, какой путь выбирать

вузлах i : j, для которых Ki = Kj. (Дерево бинарное, а не тернарное.)

a)Докажите, что дерево, не содержащее избыточных сравнений, сильно сортирует любую последовательность ключей тогда и только тогда, когда оно сортирует любую последовательность различных ключей.

b)Докажите, что дерево сравнений сильно сортирует любую последовательность ключей тогда и только тогда, когда оно сильно сортирует любую последовательность нулей и единиц.

13.[М28] Докажите утверждение (17).

14.[М24] Выразите сумму (19) в ”замкнутом виде”.

15.[М21] Определите асимптотическое поведение функции B(n) и F(n) с точностью до O(log n). [Указание: покажите, что в обоих случаях коэффициент при n содержит функцию, изображенную на рис. 37.]

16.[ВМ26] (Ф. Хуан и Ш. Линь.) Докажите, что при n 22 выполняется неравенство F(n) > dlog2 n!e.

17.[М20] Докажите тождество (29).

18.[20] Если бы процедура, начало которой изображено на рис. 36, породила граф

Picture: p.236

с эффективностью 12!=229, то было ли бы тем самым доказано, что S(12) = 29?

19.[40] Проведите эксперименты со следующим эвристическим правилом решения относительно того, какую пару ключей сравнивать следующей при конструировании дерева сравнений. Пусть

на каждой стадии сортировки ключей fK1; : : : ; Kn g число ключей, о которых на основании выполненных до сих пор сравнений известно, что они Ki, обозначается через ui, а число ключей, о которых известно, что они Ki, обозначается через vi, 1 i n.

Перенумеруем ключи так, чтобы последовательность ui=vi стала возрастающей: u1=v1 u2=v2

:: : un=vn. Теперь сравним Ki : Ki+1, где i—индекс, минимизирующий выражение juivi+1 − ui+1vij. (Хотя этот метод использует гораздо меньше информации, чем содержится в полной матрице сравнений, подобной (24), он, как оказывается, во многих случаях дает оптимальные результаты.)

>20. [М26] Докажите, что расширенное бинарное дерево имеет минимальную длину внешнего пути тогда и только тогда, когда существует такое число l, что все внешние узлы находятся на уровнях l

и l + 1 (или, быть может, только на уровне l).

21.[М21] Высотой расширенного бинарного дерева называется максимальный номер уровня, на котором есть внешние узлы. Пусть x—внутренний узел расширенного бинарного дерева; обозначим через t(x) число внешних узлов-потомков узла x, а через l(x) корень левого поддерева узла x. Если x—внешний узел, то положим t(x) = 1. Докажите, что расширенное бинарное дерево имеет минимальную высоту среди всех бинарных деревьев с тем же числом узлов тогда и только тогда, когда для всех его внутренних узлов x выполняется неравенство

jt(x) − 2t(l(x))j 2dlog2 t(x)e − t(x):

22.[М24] Продолжение упр. 21. Докажите, что бинарное дерево имеет минимальную длину внешнего пути среди всех бинарных деревьев с тем же числом узлов тогда и только тогда, когда для всех его внутренних узлов x выполняются неравенства

jt(x) − 2t(l(x))j 2dlog2 t(x)e − t(x) и jt(x) − 2t(l(x))j t(x) − 2blog2 t(x)c:

[Так, например, если t(x) = 67, то должно быть t(l(x)) = 32, 33, 34 или 35. Если нужно просто минимизировать высоту дерева, то, согласно предыдущему упражнению, достаточно, чтобы 3 t(l(x)) 64.]

23.[10] В тексте доказано [см. формулу (34)], что среднее число сравнений, выполняемых любым

методом сортировки n элементов, не может быть меньше dlog2 n!e n log2 n. Однако при сортировке вставками в несколько списков (алгоритм 5.2.1М) затрачивается в среднем всего O(n) единиц времени. Чем это объясняется?

24.[27] (К. Пикар.) Постройте такое дерево сортировки для шести элементов, чтобы все его внешние узлы располагались на уровнях 10 и 11.

130Original pages: 218-294

25.[11] Если бы существовала процедура сортировки семи элементов, на которой достигался минимум среднего числа сравнений, вычисляемый при помощи формулы (34), то сколько внешних узлов было бы на уровне 13 соответствующего дерева?

26.[М42] Найдите процедуру сортировки для семи элементов, минимизирующую среднее число выполняемых сравнений.

>27. [20] Пусть известно, что конфигурации (K1 < K2 < K3, K1 < K3 < K2, K2 < K1 < K3, K2 < K3 < K1, K3 < K1 < K2, K3 < K2 < K1) встречаются с вероятностями соответственно (:01, :25, :01, :24, :25, :24). Найдите дерево сравнений, которое бы сортировало такие три элемента с наименьшим средним числом сравнений.

28.[40] Напишите MIX-программу, которая сортирует 5 однословных ключей за минимально возможное время, после чего останавливается. (См. основные правила в начале x 5.2.)

29.[М25] (С. М. Чэйз.) Пусть a1 a2 : : :an—перестановка множества f1; 2; : : :; n g. Докажите, что любой алгоритм, который распознает, является ли данная перестановка четной или нечетной (т. е. содержит ли она четное или нечетное число инверсий), и основанный исключительно на

сравнениях элементов a, должен выполнить не менее n log2 n сравнений, хотя он имеет всего два возможных исхода.

30.[М23] (Оптимальная обменная сортировка.) Любой алгоритм обменной сортировки в смысле определения, данного в п. 5.2.2, можно представить в виде дерева сравнений-обменов, а именно в виде структуры бинарного дерева, внутренние узлы которого имеют вид < i : j >, где i < j, и интерпретируются следующим образом: ”если Ki Kj, то продвинуться по левой ветви дерева; если Ki > Kj, то поменять местами записи i и j и продвинуться по правой ветви дерева” По достижении внешнего узла должны выполняться условия K1 K2 : : : Kn. Таким образом, дерево сравнений-обменов отличается от дерева сравнений тем, что оно описывает не только операции сравнения, но и операции перемещения данных.

Обозначим через Se(n)минимальное число сравнений-обменов, необходимых в наихудшем случае

для сортировки элементов при помощи дерева сравнений-обменов. Докажите, что Se(n) S(n)+n−1.

31.[М38] Продолжение упр. 30. Докажите, что Se(5) = 8.

32.[М42] Продолжение упр. 31. Исследуйте значения функции Se(n) при малых n > 5.

33.[M30] (Т. Н. Хиббард.) Вещественнозначным деревом поиска порядка x с разрешением называется расширенное бинарное дерево, каждый узел которого содержит неотрицательное действительное значение, такое, что (i) значение в любом внешнем узле ; (ii) значение в любом внутреннем узле суммы значений двух его сыновей; (iii) значение в корне равно x. Длина взвешенного пути такого дерева определяется как сумма по всем внешним узлам номеров уровней этих узлов, умноженных на содержащиеся в них значения.

Докажите, что вещественнозначное дерево поиска порядка x с разрешением 1 имеет минимальную среди всех таких деревьев того же порядка и с тем же разрешением длину взвешенного пути тогда и только тогда, когда в (ii) имеет место равенство и для всех пар значений x0 и x1, принадлежащих узлам-братьям, выполняются следующие условия: (iv) не существует целого числа k 0, такого, что x0 < 2k < x1 или x1 < 2k < x0; (v) dx0e − x0 + dx1e − x1 < 1. (В частности, если x—целое число, то из условия (v) следует, что все значения в дереве—целые, а условие (iv) эквивалентно результату упр. 22.)

Докажите также, что соответствующая длина взвешенного пути равна xdlog2 xe + dxe − 2dlog2 xe. 34. [М50] Определите точные значения функции S(n) для бесконечного множества аргументов n.

5.3.2. *Слияние с минимальным числом сравнений

Рассмотрим теперь вопрос, имеющий отношение к предыдущему пункту: каков наилучший способ слияния упорядоченного множества m элементов с упорядоченным множеством n элементов? Обозначим элементы сливаемых множеств через

A1 < A2 < : : : < Am;

 

B1 < B2 < : : : < Bn:

(1)

Как и в п. 5.3.1, будем предполагать, что все m+nэлементов различны. Элементы Aсреди элементов B

могут располагаться

 

m+n

способами; таким образом, из рассуждения, которым мы воспользовались

 

 

 

m

 

 

 

 

в задаче о

сортировке, следует, что необходимо выполнить по крайней мере

 

 

 

 

 

 

 

(2)

 

 

 

 

log2

m

 

 

 

 

 

m + n

 

 

сравнений. Если положить m = n и устремить n к 1, оставив неизменным, то по формуле Стир-

линга

 

n + n

= n ((1 + )log2(1 + ) − log2 ) −

1

 

 

log2

log2 n + O(1):

(3)

 

 

 

n

 

2

Соседние файлы в папке Дональд Кнут. Искусство программирования. т.3