![](/user_photo/1144_wzNgE.jpg)
Полезная методичка
.pdfно ых эл м нто или исключ ния эл м нто . О н ко н пр ктик ч сто н о хо имо ыполнять проц уры ключ ния и исключ ния от льных эл м нто , что при о ит к н о хо имости р р отки структур нных, по р и ющих эти оп р ции.
4.1.1Лин йны списки и о ы оп р ции н ними
Список кон чн я посл о т льность эл м нто , поря ок которых опр ля тся с помощью ссылок.
Êо ым оп р циям ля списк относятся:
1.поиск н которо о нно о эл м нт с ключом x (тру о м- кость O(n) );
2.поиск м ксим льно о (миним льно о) эл м нт (тру о м- кость O(n) );
3.ключ ни эл м нт (тру о мкость O(1) );
4.исключ ни эл м нт (тру о мкость O(1) );
5.формиро ни списк (тру о мкость O(n) );
6.просмотр списк (тру о мкость O(n) ).
Сущ ст уют р личны спосо ы р ли ции списк . Н и ол р спростр н нными я ляются сл ующи .
Ð ëè öèÿ è óõ ì ññè î A è B .
Пусть i ин кс эл м нт списк , то A[i] ñ ì ýë - ì íò, B[i] ин кс сл ующ о эл м нт списк A . Åñëè k ин кс посл н о эл м нт списк , то B[k] = 0 . Êðîì òî î, ñóù ñò óþò ï ð ì ííû : nz ин кс н ч л нятых компон нт и ns ин кс н ч л с о о ных компон нт.
Òî ì ññè
2; 12; 17
у т р ли о н сл ующим о р ом.
51
![](/html/1144/349/html_rS5Bm8Zart.Ng0Z/htmlconvd-iF9jw352x1.jpg)
2 |
17 |
12 |
* |
* |
* |
A |
|
|
|
|
|
|
|
1 |
2 |
3 |
4 |
5 |
6 |
|
|
|
|
|
|
|
|
3 |
0 |
2 |
5 |
6 |
0 |
B |
|
|
|
|
|
|
|
nz = 1
ns = 4
Сл ующ я р ли ция списк состоит исполь о нии посл о т льно с я нных компон нт.
Д нн я р ли ция мо т ыть осущ ст л н сл ующим о - р ом: к я компон нт списк состоит и ух яч к п - мяти (п р я со р ит с м эл м нт ли о ук т ль н о м - стополо ни , тор я ук т ль н сл ующий эл м нт) (лин йный список, о нон пр л нный список).
Òî ì ññè
2; 12; 17
у т р ли о н сл ующим о р ом.
2 |
- 12 |
- 17 nil |
Óïð í íè .
Н пис ть проц уры, р ли ующи о ы оп р ции н списком, который мо лиру тся с помощью ух м сси о .
При м р ли цию н которых о ых оп р ций ля р оты с лин йным списком.
uk =" el; el=record key : data;
next : uk; end;
52
![](/html/1144/349/html_rS5Bm8Zart.Ng0Z/htmlconvd-iF9jw353x1.jpg)
Включ ни эл м нт список
Включ ни эл м нт мо т ыть осущ ст л но н сколькими спосо ми. В с я и с т м, что списк с и стно о н ч ло, тр иционно но ый эл м нт ключ ют н ч ло списк .
Сн ч л при м прим р проц уры ключ ния эл м нт с ключом x посл эл м нт , н который ук ы т ссылк p .
p |
1 |
- 6 |
|
4 q
Ïðî ð ììí ÿ ð ëè öèÿ ííîé ïðîö óðû ìî ò ûòü ñë óþ- ù é.
new(q);
q " :key := x;
q " :next := p " :next; p " :next := q;
Т к я р ли ция оп р ции ключ ния р нтиру т (при нном p ) тру о мкость O(1) .
Т п рь пр поло им, что ну но ключить эл м нт с ключом x п р эл м нтом н который ук ы т ссылк p .
Ïðî ð ììí ÿ ð ëè öèÿ ííîé ïðîö óðû ìî ò ûòü ñë ó- þù é.
new(q);
q " :key := p " :key; q " :next := p " :next; p " :key := x;
p " :next := q;
53
![](/html/1144/349/html_rS5Bm8Zart.Ng0Z/htmlconvd-iF9jw354x1.jpg)
|
|
|
|
|
p |
|||||
|
|
|
- |
|
|
|
|
- |
|
|
1 |
|
|
6 |
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
4
q
p
1- 4
* 6
q
Ç ì òèì, ÷òî ñëè è ñòíî p , то мо но ыполнить ключ ни и п р эл м нтом р мя O(1) .
Формиро ни списк
Н чин я с пусто о списк , посл о т льно ключ м эл м нты н ч ло списк .
head:=nil; while true do
{
new(p);
p " :next := head; p " :key := x; head := p;
}
 ýòîì ñëó÷ í í î î ð òû òü îò ëüíî ñèòó öèþ, êî
ключ тся эл м нт пустой список, о н ко поря ок сл о ния
54
![](/html/1144/349/html_rS5Bm8Zart.Ng0Z/htmlconvd-iF9jw355x1.jpg)
эл м нто списк о р т н поря ку их ключ ния. В случ ях, ко-
поря ок сл о ния ол н со п ть с поря ком их ключ - ния, н о хо имо сти ук т ль н посл ний поступи ший эл - м нт ( tail ) и ключ ть эл м нты н оло у списк ( head ), посл посл н о поступи ш о эл м нт . В этом случ п р ый и клю- ч мых эл м нто о р ты тся ин ч , ч м ост льны эл м нты.
Ни при о ится про р ммн я р ли ция опис нной проц у- ры формиро ния списк .
head:=nil;
tail:=nil; while true do
{
new(p);
p " :next := nil; p " :key := x;
if head = nil then head := p else tail " :next := p; tail := p;
}
Исключ ни эл м нт и списк
Сн ч л р ссмотрим исключ ни эл м нт и списк посл эл м н- т , н который ук ы т ссылк p .
J |
|
|
- J |
- |
|
|
J |
|
|
J |
|
pJJ
Про р ммн я р ли ция исключ ния эл м нт и списк мо тыть сл ующ й.
q := p " :next;
p " :next := q " :next; dispose(q);
Т п рь исключим эл м нт и списк , н который ук ы т ссылк p . Для это о исключ м сл ующий p эл м нт, п - р этим с о поля копируются яч йку п мяти, н которую ук ы т ссылк p .
55
![](/html/1144/349/html_rS5Bm8Zart.Ng0Z/htmlconvd-iF9jw356x1.jpg)
|
|
|
|
T |
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
- |
T |
|
- |
|
|
|
- |
|
|
||
|
|
|
|
|
|
|
|
|
|
|
nil |
|||
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
T |
|
|
|
` ` ` |
|
|
|
||
|
|
|
|
T |
|
|
|
|
|
|
||||
p |
q |
T |
|
|
|
s |
Для то о, что ы н о р ты ть от льно ситу цию, ко у ля-мый эл м нт я ля тся посл ним, исполь у тся р спростр н нный при м: пост но к рь р ( о мо но пр ст ить, к к пустой эл - м нт конц списк ). Пр поло им, что п р м нн я s я ля тся ук т л м н яч йкурь р. То про р ммн я р ли ция про- ц уры у л ния мо т ыть сл ующ й.
q := p " :next;
ifelsep " :next = s then s := p
{
p " :key := q " :key;
}p " :next := q " :next;
dispose(q);
Отм тим, что о оих случ ях тру о мкость проц уры у л ния р н O(1) .
Поиск эл м нт
Поиск эл м нт x н упоря оч нном списк осущ ст ля тся посл о т льным просмотром эл м нто . Он к нчи тся ли о при о н ру нии тр у мо о эл м нт , ли о при ости нии конц списк . Для то о, что ы оптими иро ть усло и оконч ния просмотр , у м исполь о ть т хнику рь р ( s ). П р м нн я headу т ук ы ть н н ч ло списк .
Ни при о ится про р ммн я р ли ция проц уры поиск эл м нт x .
s " :key := x; w := head;
while (w " :key 6= x) do w := w " :next;
if w 6= s then { w ссылк н эл м нт с ключом x } else { ýë ì íò í í é í }
56
Для то о, что ы проц ур отр от л пр ильно случ , ко-
список пустой, н о хо имо при формиро нии списк ыполнить оп р тор: head := s:
Тру о мкость опис нной ыш проц уры поиск сть O(n) . Усо рш нст о ть м то поиск мо но, сли осущ ст лять по-
иск упоря оч нном списк . В упоря оч нном списк эл м нт x мо но к нчи ть при о н ру нии п р о о ключ со н ч ни мольшим, ч м x . Упоря оч нность списк ости тся пут м клю- ч ния но о о эл м нт по хо ящ ля н о м сто, что по оля т полностью исполь о ть и кость списко ой структуры. О н ко,
упоря оч нны лин йны списки н по оляют ор ни о ть нич о по о но о н оичный поиск м сси х.
К оп р циям р оты со списк ми т к мо но отн сти:
Конк т н цию (сц пл ни ) ух списко , р ульт т которой о р у тся иный список. ту оп р цию мо но ыполнить р мя O(1) , сли им ются р с п р о о и посл - н о эл м нто списко , что по олит ыполнить оп р цию сц пл ния полно о просмотр о но о и списко ля опр -л ния р с о посл н о эл м нт . Если и стны толь-
ко н ч льны р с , то тру о мкость нной оп р ции сть O(n+m) , n; m - колич ст о эл м нто сц пля мых спис- к х.
Р сц пл ни списк . ту оп р цию мо но ыполнить р - мя O(1) , сли и ст н ук т ль н эл м нт н поср ст нно пр ш ст ующий м сту р сц пл ния.
4.1.2Ñò êè è î û îï ð öèè í íèìè
Ино при р от со списко ой структурой о ник т потр ностьключ ть и исключ ть эл м нты опр л нном поря к . Если р -ли у тся принцип "посл ний ош л п р ый ыш л", то т кую списко ую структуру н ы ют ст ком или м ином.
Н помним, что л оритмы р ш ния т ких и стных ч, к к про рк л нс ско ок рифм тич ском ыр нии, ычисл - ни н ч ния ыр ния, исполь уют ст к. В льн йш м н ми у-н р ссмотр н щ ря ч, которых у т исполь о ться эт структур нных.
57
![](/html/1144/349/html_rS5Bm8Zart.Ng0Z/htmlconvd-iF9jw358x1.jpg)
Если р н и стно м ксим льно колич ст о эл м нто ( l ), о но р м нно хр нящихся ст к , то ц л соо р но мо лиро ть ст к н м сси постоянной лины. Пусть п р м нн я top ñî ð-èò èí êñ ïîñë í î êëþ÷ ííî î ñò ê ýë ì íò (ï ð îí ÷ ëüíî top = 0 ), то проц уры ключ ния и исключ ния эл м нт и ст к р ли уются сл ующим о р ом:
Включ ни эл м нт ст к, р ли о нный и о ном рно о м сси
if top > l then { í ò ì ñò } else
{
inc(top);; A[top] := x;
}
Исключ ни эл м нт и ст к , р ли о нно о и о ном рно о м сси
if top < 1 then { ñò ê ïóñò } else
{
x := A[top]; dec(top);
}
В случ , ко колич ст о эл м нто р н н и стно, ст к мо т ыть р ли о н и списко ой структуры:
uk =" el; el=record val : data; next : uk; end;
Òî ï ð ì íí ÿ top ó ò ñî ð òü ð ñ ïîñë í î êëþ- ÷ ííî î ñò ê ýë ì íò (ï ð îí ÷ ëüíî top = nil ), проц урыключ ния и исключ ния эл м нт у ут им ть сл ующий и .
58
![](/html/1144/349/html_rS5Bm8Zart.Ng0Z/htmlconvd-iF9jw359x1.jpg)
Включ ни эл м нт ст к, р ли о нный и списко ой структуры
new(dop);
dop " :val := x; dop " :next := top; top := dop;
Исключ ни эл м нт и ст к , р ли о нно о и списко ой структуры
if top = nil then { ñò ê ïóñò } else
{
x := top " :val; dop := top;
top := top " :next; dispose(dop);
}
Тру о мкость проц ур ключ ния и исключ ния эл м нт и ст ксть O(1) .
4.1.3Î÷ ð è è î û îï ð öèè í íèìè
Оч р ь я ля тся щ о ним сп ци льным и ом списк , ко эл - м нты с ключ ются кон ц списк , исключ ются и н ч л списк , т. . р ли у тся принцип "п р ый ош л п р ый ыш л".
С н о хо имостью р оты с оч р ью мы у ст лки лись при р ссмотр нии л оритм л ксико р фич ской (цифро ой сортиро - ки).
Если м ксим льно колич ст о эл м нто , о но р м нно хр нящихся оч р и н пр осхо ит l , то мо но смо лиро ть цикли- ч скую оч р ь н м сси постоянной лины l . Ñ î÷ ð üþ ñ ÿ-ì ï ð ì ííû head è tail , опр ляющи ин ксы п р о о и посл н о эл м нто оч р и (п р он ч льно head = 1 è tail = = 0 ) è ï ð ì ííóþ óë ñêî î òèï empty , котор я р н true ñëó÷ , êî î÷ ð ü ïóñò .
59
![](/html/1144/349/html_rS5Bm8Zart.Ng0Z/htmlconvd-iF9jw360x1.jpg)
Включ ни эл м нт циклич скую оч р ь, р ли о нную и о ном рно о м сси
inc(tail);
if tail = l + 1 then tail := 1; A[tail] := x;
if empty then empty := false;
Исключ ни эл м нт и циклич ской оч р и, р ли о нной и о ном рно о м сси
if empty then { î÷ ð ü ïóñò } else
{
x := A[head];
if head = tail then empty := true; inc(head);
if head = l + 1 then head := 1;
}
Если колич ст о эл м нто оч р и р н н и стно, то ля р ли ции оч р и исполь у тся списко я структур . В этом слу- ч п р м нн я head ñî ð èò ð ñ ï ð î î ýë ì íò î÷ ð è, tail ïîñë í î ýë ì íò î÷ ð è (ï ð îí ÷ ëüíî head; tail =
=nil ).
Включ ни эл м нт оч р ь, р ли о нную и списко ой структуры
new(dop);
dop " :val := x; dop " :next := nil;
if head <> nil then tail " :next := dop else head := dop;
tail := dop;
60