Академический Документы
Профессиональный Документы
Культура Документы
mark(l+j+\ ');
}
'"
р СIЩЖВИК АлГОРIml<Ы на С ++
" """"""
,1,1,1,1,1,1,1, ,1,1,1,1,1,1,1,
1111111111111111111111111111111
гulв (O I 3:, З)
шагJt(4 , З)
nйe(O , 41 2)
!!II.aU. (2:, 2)
rule(O~ 2. 1)
::nark( l. 1)
:rule CO . 1 ~ О)
:rule ( l. 2:~ О)
rule(2:~ 40, 1)
mark:(3. 1 )
:rul8(2 . 3, О)
n1e(3. 4. О)
ru1e<4. В. 2)
"""'(6. 2)
nЙO(4. 6. 1)
mark(Б . 1)
:rule (4 . 1:>, О)
:ru1e (Б , 6, О)
rule (б, 8 , 1)
mark(7 . 1)
:rulе (б . 7~ О)
:rule(7 . 8, о)
•••••••••••••••
•••• •••••••••••
•••• •••••••••••
••••
•••• •••••••••••
•••••••••••
••• ••
••
••
• ••
•• ••
•••• • ••
•••••••••••••
•••• •••••••••••
•••• •••••••••••
•••• •••••••••••
ICICICICICICICIC
ICICICICICICICIC
ICICICICICICICIC
ICICICICICICICIC
ICICICICICICICIC
хххххххх
ХХХХХХХХ
хххххххх
ММИМ
ММИХ
ММИХ
ммих
Н"'
D О !tOOVe'tQ
2781 kOChR
О 'Е шrJЧetао
91 81 100cJlR
О 54I!ЮЧ8tCJ
381 kocbR
D 81 !IЮVet()
i 81 loocJlR
,troloo
Таблица 5.1. Основные алгоритмы типа ' 'р аздел яй и властвуй "
рекуррентное приближенное
соотношение решение
Бинарный поиск
количество сравнений 19 N
Сортировка слиянием
количество рекурсивных
N
вызовов
'"
Р. СIЩЖ ВИК АлГОРIml<Ы на С ++
Упражнения
'"
Р. СIЩЖ ВИК АлГО РIml<Ы на С ++
метки на линейке с 2 П
- 1 метками.
знач ения .
5.35. И зме ни те программу рисования звезды Коха , прив еде нную на рис.
5.13, для создания д ругого фрактала , на основе фигуры , со стоящей из 5
линий нулевого порядка, вычерчиваемых смещениями на одну
условную единицу в во сточно м, се верном , во сточн ом, южном и
Динамическое программирование
Р. СIЩЖ ВИК АлГО РIml<Ы на С ++
1 О
ш
Р. СIЩЖ ВИК АлГОРIml<Ы на С ++
BF (6)
5 У(5)
э У(4)
2 «3)
1 F(2)
1 F(1)
О «О)
1 У(1)
1 У ( 2)
1 F(1)
О F(O)
2 П3)
1 У ( 2)
1 F(1)
О F(O)
lFШ
3 у(4)
2 F (3)
1 У(2)
1 <(1)
О У(О)
lFШ
1 F (2)
lFШ
О «О)
F[O] = О ; F[1 ] = 1;
for (i == 2; i <= N; i++ )
F[i] = F[i -1 ] + F [i -2];
ш
Р. СIЩЖ ВИК АлГОРIml<Ы на С ++
iпt F(iпt i)
{
иО < l)геturпО ;
if (i == 1) гешт 1;
геturп F(i -1) + F(i -2);
}
линейное!
ш
Р. СIЩЖ ВИК АлГОРIml<Ы на С ++
выполнения до линейного.
int F(int i)
{ static int krюwпF [maxN ];
if (knownF[i] != О) геtшп knownF[i] ;
intt =~
if (i < О) ге turп О ;
if (; > 1) t = F(i -1) + F(i - 2);
геtшп knownF[i] = t;
'"
Р. СIЩЖ ВИК АлГОРIml<Ы на С ++
ш
Р. СIЩЖ ВИК АлГОРIml<Ы на С ++
О 1 2 3 •
• ,
itM А В С D Е
~i%4!
.о'
, ,•
3 7
10 11 13
00000
Д в с D Е
ш D Е
ШД с с
d
dJ
шш
ддд в е
return ша х;
}
'"
Р. СIЩЖ ВИК АлГО РIml<Ы на С ++
iпt knaр(iпt М)
{ int ~ space, тах, таю = О, t;
if (ma xК no wn[M ] != unknown) return тa xК no wn[M] ;
for (i = О , тах = О ; i < N; i++)
if «space = М -items[i] .s ize) >= О)
if«t = knap(space) + items[i].val) > тах)
{ тax= t;maxi = ~}
тaxК nown[M ] = тах; ite mКno wn[ M] = [ешs[maю];
return та х;
95 6 7 1 С1 11
2 З. 4 1 В
меньших или равных данному аргумен ту, при условии, что затраты на
'"
Р. СIЩЖ ВИК АлГОРIml<Ы на С ++
ш
Р. СIЩЖ ВИК АлГО РIml<Ы на С ++
Ynражнения
CN = N + N ? (K j + CN k) дл я N > 1, при СО 1.
N1 < K< N
ш
Р. СIЩЖ ВИК АлГОРIml<Ы на С ++
Деревья
ал горитмов ' 'р азделяй и властвуй ". Ч етв е ртым пример ом служит де рево
синтаксического разбора пр едложе ния английского (или любого другого
языка) на составляющие его части; такие дерев ья те с но связаны с
'"
Р. СIЩЖ ВИК АлГОРIml<Ы на С ++
• Деревья
• Деревья с корнем
• Упорядоченные деревья
• М -арные и бинар ны е деревья
ш
Р. СIЩЖ ВИК АлГОРIml<Ы на С ++
только одного п уги, соединяющего любые два узла . Есл и между какой -
либо парой узлов существует более одного пуги, или если междУ какой -
либо парой узлов пугь отсугствует, то это граф, а не дерево .
Несвязанное м ножество деревьев называется лесом (forest).
КО p.;lж"
ЛJ1Сl ~
ИЖlWflИЙ'(ЗQЛ
ДD'КIРI-IИЙ ---о
y~'
ш
Р. СIЩЖ ВИК АлГОРIml<Ы на С ++
говорить о левом дочер н ем узле (left сlШd) и правом дочернем узле (right
сlШd) внугренних узлов. Каждый внугренний узел должен иметь и
левый, и правый дочерние узлы, хотя один И З ни х или оба мо гуг бы ть
внешними узлами. Лист в М -ар ном дереве - это внугренний узел, все
дочерние узлы которого являются внешними.
понятий:
• деревья с корнем
• свободные деревья
значениями тип а float, ц ел ых ч и сел значе ниями т ипа int и т.д . Когда мы
ри суем дере во с узлом в корне, связа нным ребрами с левым
по.цдеревом, р асп оложен ным слева, и с правым подцеревом,
Это просто код С ++ для определения 5.1. Узл ы состоят и з элеме нтов и
пар указа телей на узлы; указател и на узлы называются также ссылками .
Так, например , абстрактная операция п ереход к левому подцереву
реализуется с помощью обращения ч ерез указатель наподобие х = х -
>1 .
роди тельскому узлу Для ал гори тмов, где тр ебуются таки е о п ера ции ,
можно добави ть в каждый узел тр етью ссылку, направ лен н ую к его
роди тельскому узлу Эт а альтернатива анал оги чн а д вухсвязным с пи скам .
Как и в случае со связными с пи скам и (см. рис. 3.б), в некоторых
си туациях удобнее хра ни т ь узл ы де ре ва в массиве и использовать в
качестве ссылок ин декс ы , а не указател и. Конкр ет ны й п ример такой
реализации бу,цет рассмотрен в разделе 12.7 'Таблицы символов и
деревья бинарного пои ска". Для о п ределенных сп ециальны х
Р. СIЩЖ В ИК АлГОРIml< Ы н а С ++
ш
Р. СIЩЖ ВИК АлГОРIml<Ы на С ++
пугем (simple path). Граф является связным (connected), если для любой
пары узлов существует связывающий их простой пугь. Простой пугь, у
которого первый и последний узел совпадают, называется циклом
(cycle).
ш
Р. СIЩЖ ВИК АлГОРIml<Ы на С ++
Упр ажнения
'"
Р. СIЩЖ ВИК АлГО РIml<Ы на С ++
1110010110001011000
ш
Р. СIЩЖ ВИК АлГОРIml<Ы на С ++
строке
Лемма 5.7. Длина в н еlllilе го пуги любого бинар н ого дерева , имеющего
N в н уг р енних узлов, на 2N боль ше длины внугреннего п уги .
~ -
"Ю~
'О _
ураООflь1 --
УРОИr:>IН. 4 --
Ynражнения
властвуй l /2 J
" из N узлов в одном п одцереве и де ревом ''раздел яй и
5.76. Дерево вида "об ъединяй и властвуй ", состоящее из N узлов - это
бинар н ое дерево с корнем, обозначенным N, деревом "объединяй и
'"
Р. СIЩЖ ВИК АлГО РIml<Ы на С ++
Обход дерева
'"
Р. СIЩЖ ВИК АлГОРIml<Ы на С ++
tr.а.vегзс Е
viэit ~
И.аУег.s:e D
Vi5it D
tra.verse В
visi't Б
trаvoerэ е А
vi.sit А
tr:a.verse 11:
tr:a.verse 11:
trа~э е С
vi..sit с
tr:a.verse 11;
tr:a.verse 11;
tra.verse ..
t.ravers:e Н
Vi9it Н
tra.verse F
visi't F
'trаvаэ е +:
'tra~g e G
visi't G
t raversll'J ..
t raversll'J 4;
tra.verэе "
'"
Р. СIЩЖВИК АлГОРIml<Ы на С ++
;~"<.)d7f; )'~
?~
~
)(
~ ~r;: )'(~
'f< ~ 'f~щ, Cf{~
i"---..
о .
~
}i. G С ~
"'c/~ ~~
, ~ , С
.
Г
6~ ~ r.Y'"
t'fгrя
.
~ ~
~
, ,
-f
, о
~ ~~ f f'
'"
Р. СIЩЖ ВИК АлГОРIml<Ы на С ++
i ~
, (]о ~@
11 D ~ ® " "о@, ~
liI
• D$D ~$ . CD(}~~
... ~ ... ~ () ~
, о r;;
, о;
," , B@Oto@
@о ~ @
@е O~E
, CIiDH
g о@о;
1r:
• , , С D IC
(]о ~®
~
• o®~
,@
, ® ,
о
" ~' ,
"0 ~~ ,, ", " ,
" ®,@ , F@H
@" , , " ," ,
G ,
, @ , ",
G "
,
G
G G
" ",
"
Рис. 5.27. Соде р жимое стека для алгоритмов обхода дерева
'"
Р. СIЩЖВИК АлГОРIml<Ы на С ++
Ynражнения
~'!
8
С
F
G
5.81 . Покажите , что прямой обход леса экв ив алентен пр ямому обходу
соответствующего бинарно го дерева (см. лемму 5.4), а обратн ый обход
леса эквивален тен поперечному обходу бинар н ого дерева.
Н
• Е
D
• В
G А
• •
F •
• с
Е •
• •
D •
• н
С F
в
• •G
• •
А
•
• •
Рис. 5.29. Вывод дерева (п ри п оперечном и п рямом обходе)
схематическом формате.
int count(link h)
{
if (h == О) геШт О;
геturп СО Шlt(h ->1) + СО Шlt(h -> г) + 1;
}
Р. СIЩЖВИК АлГОРIml<Ы на С ++
iпt hеight(1iпk h)
(
if(h == О) return -1;
iпt II = height(h - >1), v = height(h ->г) ;
if(u > у) геturп u+1; else геturпv+ 1 ;
}
'"
Р. СIЩЖ ВИК АлГО РIml<Ы на С ++
struct node
{ Item ке т; node * ~ * г;
node(Item х)
{ ке т = х; 1= О ; r = О ; }
};
typedef node* liпk ;
link max(Item а [ ], iпt 1, iпt г)
{ int m = (I+ г)/2;
link х = new node(a[m]);
if (1 == г) retum х;
х · >1= та х(а , 1, т) ;
х · >г = та х(а , т+ 1 , г);
Item u = х · > I-> itе щ v = х - > г -> item;
if ( и > у) х · > Ке т = и; else х · >item = у;
Р. СIЩЖ ВИК АлГО РIml<Ы на С ++
return х;
}
рассматриваемых в лекциях 12 - 15 .
+C\...----~' f
Iа
Ynражнения
Обход графа
• п осе щаем у;
7
® 4
б 5
3
ло~::це ,,::ие 1}
г. О~J-a1 ~ 3 ( ~Т'"АЙ 3 = 1 = 5 )
r:pc:<вepKa .5 :5 СЛИСЮ;: 3
~ epKa 4 ~ C~~ 3
r:poE epI<:iI. 7 з сПУ.ске 4
r:poE epI<:iI. 3 з CnY.CKe 4.
про~ер:ка .5 I'! C;y'CK~ D
npoвер!':д. .2 Е C1Y.CK€ D
i!pOвер!':д. 1 в СПZСК€ D
ПРJf.е РЖd Е в с;у.сКЕ D
'"
Р. СIЩЖ ВИК АлГОРIml<Ы на С ++
'"
Р. СIЩЖВИК АлГОРIml<Ы на С ++
Или же , как это было сделано для обхода дерева, можно создать стек,
'"
Р. СIЩЖ ВИК АлГОРIml<Ы на С ++
'"
Р. СIЩЖВИК АлГОРIml<Ы на С ++
о о 7 о 7 5 '
~~~~20 ®
7 7 1 2 0 4 5126
I 1 7 О 2 045 I 2 6
о о® 7 2 О 2 О 4 5 2 6
7 2 О 5 20 4 5 26
2 ' ф7@0@ 2 7 О О 4 5 2 6
, О 7 О о@ 00 4 5 26
7 О О 5 0 4 5 2 6
7 4 О 5 4 5 1 2 6
4 4 6 О 5 4 6 5 7 3 5 2 6
6 6 4 4 5 о@ б 4 О 5 7 3 5 2 6
6 О 4 5 о@ 05735 , 6
4 5 О 5 5 7 3 5 2 б
5 5 О 4 7 0<]) 5 о 4 3 73 5 2 Б
5 4 4 7 0<]) 4 3 7 3 5 2 6
5 3 4 7 O~ 3 7 3 5 2 б
3 3 .5 4 7 О 5 3 5 4 735126
3 4 4 7 О 5 4 7351 2 6
4 7 О 5 7 3 5 2 6
4 3 О 5 3 5 1 2 6
О 5 5 , 6
О 2 2 б
О 2 б
О 6 6
Стек, обес п ечивающий п оиск в глубину, можно пред ставить себе как
соде р жащий элементы , каждый из которых состоит и з узла и ссылки на
список смежности для этого узла (показан узлом в кр ужке) (слева) .
Таким образом , обработка начинается с находящегося в стеке узла О со
ссылкой на первый узел в его с пи ске смежности - узел 7. Каждая строка
отражает результат выталкивания из стека , занесения ссылки на
Более того , чтобы о гра ни чить размер стека числом вершин и все - таки
п осе щать узлы в том же порядке, как и пр и поиске в глубину,
н еобходи мо использовать стек с забыва ни ем старого элемента. Если
Р. СIЩЖ ВИК АлГОРIml<Ы на С ++
н е опустеет.
о о
о 7 5 2 6 О 7 5 2 6
7 5 2 1 6 2 4 7 5 2 6 4
5 2 6 2 4 4 3 5 2 6 4 3
2 1 б 1 2 4 4 3 2 1 б 4 3
I б t 2 4 4 3 I б 4 3
6 2 4 4 3 4 6 4 3
2 4 4 3 4 4 3
4 4 3 4 3
4 4 3 4 3
3 4 3
3 4 3
3
'"
Р. СIЩЖ ВИК АлГОРIml<Ы на С ++
'"
Р. СIЩЖВИК АлГОРIml<Ы на С ++
множеством д ругих.
Ynражнения
упражнение 3.70).
Перспективы
'"
Р. СIЩЖ В ИК АлГОРIml< Ы н а С ++
ш
Р. СIЩЖ ВИК
'"
Р. СIЩЖ ВИК
Правила игры
сортировке. В них также применяется операция < для сравне ния ключей
элемен тов и функции ехс Ь или compexch, выполняющие обмен
элемен тов . Чтобы разли ч ать методы сортировки, мы будем п р и сваивать
различным пр о граммам сортиров ки разные имена. В клиентской
пр о гр амме, наподобие пр о граммы 6.1, достато ч но п ере и меновать одну
и з этих программ, изменить драйвер или задействовать указатели на
функции для п ереключе ни я с одного ал горитма н а другой - без
внесения изменений в п рограммную реал и зацию со ртиро вки.
сей ча с и переходим.
#include <iostream.h>
#include <stdlib .h>
template <class Item>
уоИl exch(Item &А, Item &В)
( "еm' = А; А = В; В = '; )
template <class Item>
уоИl compexch(Item &А, Item &В)
( ~ (В < А) exch(A, В); }
template <class Item>
уоИl sort(ltem а[] , int 1, int г)
{ for (int i = l+1; i <= г; i++ )
for (in' j = \ j > \ j-- )
compexch(aO-l], аО1);
}
int main(int argc, char *argv[])
( in, \ N = ato~argv[l]), sw = ato~argv[2]);
int *а = пеw int[N];
~(sw)
for(i= О; i < N; i++)
a[i] = IOOO*(I.O*rand()IRAND_MAX);
Р. СIЩЖВИК
e~e
{N = О; while (с iп » a[N]) N ++ ; }
50 rt(a, О, N- l);
for (i = О; i < N; i++ ) cout « а[П«" ";
cout« endl;
}
Определе ни е 6.1. Гово рят, что метод сортировки устой чив , если он
сохр ан я ет относи тел ьный порядок размещения в файле элеме н тов с
оди на ко выми Юlюч ам и.
'"'
Р. СIЩЖВИК
Матэ
Black 2
В гowп 4
Jackson 2
Jones 4
Smith
Тhompson 4
Wаshi пфо п 2
White 3
Wllson 3
Adarrn;
Smith
WаShi ПQtо п 2
Jackson 2
Вlaск 2
White 3
Wllson 3
Тhompson 4
В гowп 4
Jones 4
Adarrn;
Smith
Вlaск 2
Jackson 2
Washington 2
White 3
Wllson 3
В г<7IЧ П 4
Jones 4
Тhотрsoп 4
'"
Р. СIЩЖ ВИК
Упражнения
6.2. Для выполнения карточного трюка нужно , чтобы колода карт была
упорядочена по мастям (пики, потом червы , трефы и бубны), а внугри
каждой масти - по старшинству. Попро си те нескольких своих друзей
выполнить эту задачу (перед каждой попыткой перета суй те карты!) и
запишите методы, которыми они пользовались.
6.3. Объясните, как вы БУдете сортировать колодУ карт при условии , ЧТО
карты необходимо уюыДывать в ряд лицевой стороной вниз, и
допускается только проверка значений двух карт и (при необходимости)
обмен этих карт местами.
6.4. Объясните, как вы БУдете сортировать колодУ карт при условии , что
'"
Р. СIЩЖ ВИК
Сортировка выбором
(Ns
, о R Т N аЕ.Х"'М р L Е
,, S о R Т N G Е. Х @М
®Х 5 М
Р L Е
,, ,, о
Е
R
R
Т
Т
N G
N G О Х S
Р
Р
L
LЮ
Е
,, ,, Е Е Т I Н @О Х S " Р L R
Е Е G (i) N Т О Х S " Р
L R
,, Е Е G I N r о х "
5 М P(L)R
5@Р N А
,, ,, Е
Е
Е
Е
G L Т О Х
Р(м)А
,, Е Е
G
G
L
L "" О Х
N Х
5 1
S 1 Р@А
,, ,, Е Е '® )[
Е Е
G L
" N О S R
Р 1з )[00
,, Е Е
G L
" N О
А®Х 1
,, ,, Е Е
G
G
L
L "" N
N
О
О
Р
Р R S кф
Е Е
Е Е
G
G
L
L "" N
N
О
О
Р
Р
R S
R S
Т
r
Х
х
да нный момент элеме н том (плюс код , н еобходим ый для сдвига индекса
текущего элемента и проверки, что он н е выходит за гра ниц ы массива) .
Проще н е придумаешь . Действи я по перемещению элементов находятся
вне в н угре нн е го ци юы: каждая операция обмена элемен тов
уста н авл ива ет оди н из них в окончательную позицию, так что всего
'"
Р. СIЩЖВИК
Уп ражнения
Р. СIЩЖ ВИК
Сортировка вставками
п реобразова ни я.
, s о R Т
,,
,, ,, ,,
О
, р L
~ iEO R Т
,, ,, • ,
,, О " р L Е
" О S А Т О д р L
~ т
o(R)s
" ОR S фl
I
, , , •"" ,
, О д р L Е
Т ,,, ,, , • ,
О р L
" фо А S О д р L
" 1000
~~ ~
I
R S о
О R S Т
r
д , , •" р
р
L
L
Е
Е
,
,
Е G
, G
•• , r , •" ,
О R S
О R 1 ®д
д р
р
L
L
Е
,," ®, Е rr (i;i) ,
G
Е G
N о R S Т ,
о R S Т Х
• р
Р
L
L
Е
Е
, Д Е G 1 М N О @А S r
,, х L Е
,, Д
д
EG I Q)MNO P R S
Е (Е) G L М N , О Р
Т
R S Т
д Е Е G I L М N О Р R S Т Х
'"
Р. СIЩЖ ВИК
С игнал ьны е ключи н е в се гда Удоб ны: иногда бывает трудно определить
з н ач ени е минимально возможного ключа , а иногда в вызыв аю щей
программе нет места для до полни тельно го ключа. В пр ограмме б.З
предлагается один из способов обойти ср азу обе эт и проблемы: с начала
выполняется отдельный проход по масс иву, который п оме ща ет в первую
позицию элеме нт с минимальным ключом. Затем сортируется
остальной массив , а первый, он же наи мен ыlш, ' элемен т служи т в
качестве сигнального ключа. Обычно мы БУдем избегать употребления в
коде сиrnальных ключей, п оскол ьку часто легче понять код с явными
проверками. Но мы БУдем обязательно отмечать ситуации, когда
сигнальные ЮIючи MOryг оказаться поле зными дл я упрощения
затем
'"
Р. СIЩЖ ВИК
Ynражнения
Пузырьковая сортировка
'"'
Р. СIЩЖ ВИК
Для каждого iOT I до r-l внугренний циЮl Ш по элементам аП], ... , a[r]
помещает минимальный элемент в аШ, перебирая элементы справа
налево и выполняя сравнение с обменом соседних элементов .
Наименьший элемент перемеща ется при всех таких сравнениях и "
вс п лывает" в начало файла. Как и в сортировке выбором , индекс i
перемещается по файлу слева направо , а элемен ты слева от него
находятся в окончательных позициях.
'"
Р. СIЩЖ ВИК
ASOR T N GE X A M P L E
A ® SORT N GE X@M P L
AA @ SORT N GE X(b)M P
Д Д E@ S О R Т N G(b) x@XV
Д Д Е Е @S О R Т I N CDiJ)x ®
AAEEG (D SORTCD N @ Р Х
AAEEGI (b) SORT @ N Р Х
AAEEGIL @SOR T N Р Х
AAEEGILM ® SOR т
P~
AAEEG LM N@S® R Т Х
AAE:EG LM N O ®S R Т Х
AAEEG LM N OP @ S т х
А А Е Е G L М N О Р R s т х
А А Е Е G L М N О Р R s Т >&
А А Е Е G L М N О Р R s т х
А А Е Е G L М N О Р R S Т Х
Уп ражнения
'"
Р. СIЩЖВИК
элементов.
методов СОРТИРОВКИ
'"
Р. СIЩЖ ВИК
заЮlючение.
'"
Р. СIЩЖ ВИК
'"