ŚûÝţþďĄÚóŘ üœŚśõ ø ŚûďŚţąŚĺùćŘć ' $ ùćŚĺ ýŚûďŚţąŚĺùćŘć ŚûťÆČó • ýŘĆÖܧ ,ĆþĄĺøć ,ĆþĄĺŒþ ŚûťÆČó -ĆţÈŢ -Óň -üÜî ýŚûťÆČó -ŚûťÆČó ýŚûćÂŞďŚî -- & üĺÀì ÀÞ¡õ c ° 1389 öŚŞŊ 1 1 ÂŮĄČşõŚî üĺÀĂúõ ýùÀØÈœŘć % ŚûÝţþďĄÚóŘ üœŚśõ ø ŚûďŚţąŚĺùćŘć ' Śûťąďć • $ üþøćøć ,üÜî ýŚûťąďć -ŚûöŊ ŚŞ ďŚî ø ŰďŚśä ťąďć -ĄŻøťÆŻ üþøćøć ťąďć -- & üĺÀì ÀÞ¡õ c ° 1389 öŚŞŊ 1 2 ÂŮĄČşõŚî üĺÀĂúõ ýùÀØÈœŘć % ŚûÝţþďĄÚóŘ üœŚśõ ø ŚûďŚţąŚĺùćŘć ' $ ŚûťÆČó ťĺŘ Ýúõ ŚûöŊ řČŮÂŮ Ćî ,ÂňŚĂä ěŘ ýŘĆóŚśœć ñøŘÀţõ ñŚÞäŘ üúŮ ťÆČó Œþ 挟þŘ • (ťÆČó ýùěŘÀœŘ) ťÆČó ďć 楯Ąõ ÂňŚĂä ćŘÀãŮ ýĆśĺŚ¡õ • ťÆČó ýŚúţœŘ Śþ ýŘÀţŞŘ ďć ÂÊĂä Œþ Žďć • ùÀłùćŘć ÂÊĂä Œþ ěŘ Ûśì Śþ ÀãŞ ÂÊĂä Œþ Žďć • ťÆČó (ýÀãŞ ÂÊĂä Śþ ,ŚúţœŘ ,ŘÀţŞŘ) ěŘ ÂÊĂä Œþ éÁ§ • & üĺÀì ÀÞ¡õ c ° 1389 öŚŞŊ 1 3 ÂŮĄČşõŚî üĺÀĂúõ ýùÀØÈœŘć % ŚûÝţþďĄÚóŘ üœŚśõ ø ŚûďŚţąŚĺùćŘć ' $ (ĆõŘćŘ) ŚûťÆČó :ÀœĄłüõ ĆţąŚĂł Âþě üõŚĺŘ ŚŞ ŚûťÆČó ,ÂÊĂä Œþ éÁ§ Śþ Žďć öŚØõ ĆŞ ĆţÆŞ ťÆČó éÂÏ Œþ ďć ÍÖê éÁ§ ø Žďć :(stack) ĆţÈŢe • First-In-Last-Out (FILO) Śþ Last-In-First-Out (LIFO) ýŘÀţŞŘ ěŘ éÁ§ ø ŚúţœŘ ďć ÍÖê Žďć :(queue) Óň • First-In-First-Out (FIFO) ýŚûťÆČó ø üśŮŘÂõĆÜÆÜĺ ,ýŘĆÖܧ ,ĆþĄĺøć ,ĆþĄĺŒþ (üÎą) :ýÀœĄČŢ ýŚûťÆČó áŘĄœŘ üÜî & üĺÀì ÀÞ¡õ c ° 1389 öŚŞŊ 1 4 ÂŮĄČşõŚî üĺÀĂúõ ýùÀØÈœŘć % ŚûÝţþďĄÚóŘ üœŚśõ ø ŚûďŚţąŚĺùćŘć ' $ ĆþĄĺŒþ ýÀœĄČŢ ýŚûťÆČó class Node { private Object element; private Node next; // constructors Node(){ this(null,null); } public Node(Object e, Node n){ element = e next = n; } void setElement(Object newElem){ element = newElem;} void setNext(Node newNext){ next = newNext;} Object getElement(){ return element;} Node getNext() {return next;} } & üĺÀì ÀÞ¡õ c ° 1389 öŚŞŊ 1 5 ÂŮĄČşõŚî üĺÀĂúõ ýùÀØÈœŘć % ŚûÝţþďĄÚóŘ üœŚśõ ø ŚûďŚţąŚĺùćŘć ' $ first[L] ýćŚä ýÀœĄČŢ ťÆČó L ťÆČóÂĺ first[L] L ďŘćťÆČóÂĺ ťÆČóÂĺ üúŮ ťÆČó L ťÆČóÂĺ first[L] L ýŘĆÖܧ ďŘćťÆČóÂĺ ťÆČóÂĺ L & üĺÀì ÀÞ¡õ c ° 1389 öŚŞŊ 1 üúŮ ťÆČó 6 ÂŮĄČşõŚî üĺÀĂúõ ýùÀØÈœŘć % ŚûÝţþďĄÚóŘ üœŚśõ ø ŚûďŚţąŚĺùćŘć ' $ CLRS ŚŞ ýěŚĺùćŚČŢ size[L] ø element ,next :ŚûĆÔóĄõ (Java) ŘøŚŻ CLRS ÀîĆśł x = new Node() x ← Allocate-Node() x = new Node(element e, next n) x ← Allocate-Node(e, n) null x Free-Node(x) x.getNext() next[x] x.setNext(n) next[x] ← n & üĺÀì ÀÞ¡õ c ° 1389 öŚŞŊ 1 7 ÂŮĄČşõŚî üĺÀĂúõ ýùÀØÈœŘć % ŚûÝţþďĄÚóŘ üœŚśõ ø ŚûďŚţąŚĺùćŘć ' $ üÎą ťÆČó Œþ ýøď ÂŞ üÜňŘ ñŚÞäŘ L üúŮ ťÆČó Œþ 挟þŘ :Create-List(L) • ÀœŘćÂðüõ ÂŞ Řď ťÆČó ÂňŚĂä ćŘÀãŮ :Size(L) • ÀœŘćÂðüõÂŞ Řď ñøŘ ÂÊĂä :First(L) • üóŚą ťÆČó ŚþŊ Ćî ÀĂîüõ É£Èõ :isEmpty(L) • L ýŘÀţŞŘ ďć x ďŘÀÖõ ŚŞ ýÂÊĂä Žďć :Insert-First(L, x) • L ďć n ÂÊĂä ěŘ ÅŢ x ďŘÀÖõ ŚŞ ýÂÊĂä Žďć :Insert-After(L, x, n) • ÀĂîüõ éÁ§ Řď L ťÆČó ñøŘ ÂÊĂä :Delete-First(L) • ÀĂîüõ éÁ§ Řď L ďć n ÂÊĂä ěŘ ÅŢ ÂÊĂä :Delete-After(L, n) • & üĺÀì ÀÞ¡õ c ° 1389 öŚŞŊ 1 8 ÂŮĄČşõŚî üĺÀĂúõ ýùÀØÈœŘć % ŚûÝţþďĄÚóŘ üœŚśõ ø ŚûďŚţąŚĺùćŘć ' $ ýěŚĺùćŚČŢ Create (L) 1 size [L] ← 0 Size (L) 1 return size[L] First (L) 1 if Size(L) 6= 0 2 then return first[L] 3 else error list is empty isEmpty (L) 1 return Size(L) = 0 & üĺÀì ÀÞ¡õ c ° 1389 öŚŞŊ 1 9 ÂŮĄČşõŚî üĺÀĂúõ ýùÀØÈœŘć % ŚûÝţþďĄÚóŘ üœŚśõ ø ŚûďŚţąŚĺùćŘć ' $ Insert-First (L, x) 1 first[L] ← Allocate-Node (x, First(L)) 2 size[L] ← size[L] + 1 Insert-After (L, x, n) 1 if n = null 2 then error element is empty 3 next[n] ← Allocate-Node (x, next[n]) 4 size[L] ← size[L] + 1 & üĺÀì ÀÞ¡õ c ° 1389 öŚŞŊ 1 10 ÂŮĄČşõŚî üĺÀĂúõ ýùÀØÈœŘć % ŚûÝţþďĄÚóŘ üœŚśõ ø ŚûďŚţąŚĺùćŘć ' first[L] $ next L element L x first[L] ← Allocate-Node (x, First(L)) Insert-First(L, x) first[L] L n x next[n] ← Allocate-Node (x, next[n]) Insert-After(L, x, n) & üĺÀì ÀÞ¡õ c ° 1389 öŚŞŊ 1 11 ÂŮĄČşõŚî üĺÀĂúõ ýùÀØÈœŘć % ŚûÝţþďĄÚóŘ üœŚśõ ø ŚûďŚţąŚĺùćŘć ' $ Delete-First (L) 1 if isEmpty (L) 2 then error list is empty 3 n ← First(L) 4 first[L] ← next[n] 5 Free-Node(n) 6 size[L] ← size[L] − 1 & üĺÀì ÀÞ¡õ c ° 1389 öŚŞŊ 1 12 ÂŮĄČşõŚî üĺÀĂúõ ýùÀØÈœŘć % ŚûÝţþďĄÚóŘ üœŚśõ ø ŚûďŚţąŚĺùćŘć ' $ Delete-After (L, n) 1 if isEmpty (L) or n = null or next[n] = null 2 then error element does not exist 3 r ← next[n] 4 next[n] ← next[r] 5 Free-Node(r) 6 size[L] ← size[L] − 1 & üĺÀì ÀÞ¡õ c ° 1389 öŚŞŊ 1 13 ÂŮĄČşõŚî üĺÀĂúõ ýùÀØÈœŘć % ŚûÝţþďĄÚóŘ üœŚśõ ø ŚûďŚţąŚĺùćŘć ' $ L first[L] ← next[ first[L]] Delete-First(L) n next[n] ← next[next[n]] Delete-After(L, n) & üĺÀì ÀÞ¡õ c ° 1389 öŚŞŊ 1 14 ÂŮĄČşõŚî üĺÀĂúõ ýùÀØÈœŘć % ŚûÝţþďĄÚóŘ üœŚśõ ø ŚûďŚţąŚĺùćŘć ' & üĺÀì ÀÞ¡õ .ťĺŘ ôŚźœŘ ÛŞŚì O(1) ďć ñŚÞäŘ ßþŘ ěŘ Œþ Âû Ćî ťĺŘ ßłøď c ° 1389 öŚŞŊ 1 15 ÂŮĄČşõŚî üĺÀĂúõ ýùÀØÈœŘć $ % ŚûÝţþďĄÚóŘ üœŚśõ ø ŚûďŚţąŚĺùćŘć ' $ üÎą ýĆþĄĺøć ťÆČó ďć éÁ§ ø Žďć Insert-After (L, x, n) . ÀĂîüõ Žďć L ýĆþĄĺøć ťÆČó ďć n ÂÊĂä ěŘ ÅŢ Řď x ýŘĄţ¡õ ŚŞ ýÂÊĂä 1 if isEmpty(L) or n = null 2 then error element n does not exist 3 r ← next[n] 4 next[n] ← Allocate-Node (x, n, r) 5 prev[r] ← next[n] 6 size[L] ← size[L] + 1 & üĺÀì ÀÞ¡õ c ° 1389 öŚŞŊ 1 16 ÂŮĄČşõŚî üĺÀĂúõ ýùÀØÈœŘć % ŚûÝţþďĄÚóŘ üœŚśõ ø ŚûďŚţąŚĺùćŘć ' $ Delete-After (L, n) . ÀĂîüõ éÁ§ L ýĆþĄĺ øć ťÆČó ďć Řď n ýÀãŞ ÂÊĂä 1 if isEmpty(L) or n = null or next[n] = null 2 then error element does not exist 3 r ← next[n] 4 if next[r] 6= null 5 then prev[next[r]] ← n 6 next[n] ← next[r] 7 Free-Node(r) 8 size[L] ← size[L] − 1 & üĺÀì ÀÞ¡õ c ° 1389 öŚŞŊ 1 17 ÂŮĄČşõŚî üĺÀĂúõ ýùÀØÈœŘć % ŚûÝţþďĄÚóŘ üœŚśõ ø ŚûďŚţąŚĺùćŘć ' first[L] prev $ next L element ýĆþĄĺøć üÎą ťÆČó r n x Insert-After(L, x, n) n r Delete-After(L, n) & üĺÀì ÀÞ¡õ c ° 1389 öŚŞŊ 1 18 ÂŮĄČşõŚî üĺÀĂúõ ýùÀØÈœŘć % ŚûÝţþďĄÚóŘ üœŚśõ ø ŚûďŚţąŚĺùćŘć ' $ ťÆČó Œþ ďć ýďŘÂØŮ ÂňŚĂä éÁ§ :ŚûťÆČó ýøď ÂŞ ÂÚþć ŰŚČÜÞä L L x p & üĺÀì ÀÞ¡õ c ° 1389 öŚŞŊ 1 x q next[q] ← next[next[q] 19 ÂŮĄČşõŚî üĺÀĂúõ ýùÀØÈœŘć % ŚûÝţþďĄÚóŘ üœŚśõ ø ŚûďŚţąŚĺùćŘć ' $ PurgeList (L) . ÀĂîüõ éÁ§ üØþ ÃŻ Řď öŚÆØþ ÂňŚĂä ýĆÞû 1 p ← First (L) 2 while p <> null 3 do q ← p 4 while next[q] <> null 5 do if element[p] = element[next[q]] 6 then Delete-After (L, q) 7 else q ← next[q] 8 p ← next[p] ?ćŘć ôŚźœŘ O(n lg n) ďć Řď ďŚî ßþŘ öŘĄŮüõ ŚþŊ & üĺÀì ÀÞ¡õ c ° 1389 öŚŞŊ 1 20 ÂŮĄČşõŚî üĺÀĂúõ ýùÀØÈœŘć % ŚûÝţþďĄÚóŘ üœŚśõ ø ŚûďŚţąŚĺùćŘć ' $ ŚûÂðùďŚłŘ ÂČČçŮ ŚŞ ťÆČó Œþ öćÂî öøďŘø p p q & üĺÀì ÀÞ¡õ c ° 1389 öŚŞŊ 1 r 21 ÂŮĄČşõŚî üĺÀĂúõ ýùÀØÈœŘć % ŚûÝţþďĄÚóŘ üœŚśõ ø ŚûďŚţąŚĺùćŘć ' $ Recursive-Reverse (L, p) . .ÀœŘćÂðüõÂŞ Řď ÛňŚ§ ø ÀĂîüõ öøďŘø ÀãŞ ĆŞ p ÂÊĂä ěŘ Řď L ťÆČó 1 if p = null or next[p] = null 2 then return p 3 q ← next[p] 4 r ← Recursive-Reverse (L, q) 5 next[q] ← p 6 next[p] ← null 7 return r & üĺÀì ÀÞ¡õ c ° 1389 öŚŞŊ 1 22 ÂŮĄČşõŚî üĺÀĂúõ ýùÀØÈœŘć % ŚûÝţþďĄÚóŘ üœŚśõ ø ŚûďŚţąŚĺùćŘć ' $ üţÈð쌪ÂČè ŰďĄňĆŞ ťÆČó Œþ öćÂî öøďŘø first[L] p & üĺÀì ÀÞ¡õ c ° 1389 öŚŞŊ 1 q r 23 ÂŮĄČşõŚî üĺÀĂúõ ýùÀØÈœŘć % ŚûÝţþďĄÚóŘ üœŚśõ ø ŚûďŚţąŚĺùćŘć ' $ NR-Reverse (L) 1 if Size(L) ≤ 1 2 then return first[L] 3 p ← null 4 q ← First(L) 5 r ← next[q] 6 while r 6= null 7 do next[q] ← p 8 p← q 9 q← r 10 r ← next[r] 11 next[q] ← p 12 return q & üĺÀì ÀÞ¡õ c ° 1389 öŚŞŊ 1 24 ÂŮĄČşõŚî üĺÀĂúõ ýùÀØÈœŘć % ŚûÝţþďĄÚóŘ üœŚśõ ø ŚûďŚţąŚĺùćŘć ' $ ğĄêěøę ýĆÜßÆõ ďć ø 1 ýùďŚÞł ěŘ áøÂł ŚŞ ø ÀœÂČÚŞ ďŘÂì ýŘùÂþŘć ďøć n ŚŮ 1 ýŚûùďŚÞł ŚŞ ÂÔœ n ÂðŘ ýŘùďŚÞł Ćİ ÂÔœ ßþÂąŊ ,ÀÈØŞ Řď ľćĄą ÂÔœ (ßČõŘ k Śþ) ßČõøć  Âû ćÂðťäŚĺ ťúŻ ?ćďŘć & üĺÀì ÀÞ¡õ c ° 1389 öŚŞŊ 1 25 ÂŮĄČşõŚî üĺÀĂúõ ýùÀØÈœŘć % ŚûÝţþďĄÚóŘ üœŚśõ ø ŚûďŚţąŚĺùćŘć ' 10 1 2 9 3 8 4 7 6 $ 5 .ÂÔœ 10 ŚŞ ğĄêěøę ýĆÜßÆõ ùÀ œě 5 ø À Ă Ă îü õ ü È îćĄ ą 9 ,1 ,7 ,3 ,10 ,8 ,6 ,4 ,2 ćŘ êŘ ř Č Ů ŮĆ Ş n = 10 ýŘÂ Ş .ÀœŚõüõ & üĺÀì ÀÞ¡õ c ° 1389 öŚŞŊ 1 26 ÂŮĄČşõŚî üĺÀĂúõ ýùÀØÈœŘć % ŚûÝţþďĄÚóŘ üœŚśõ ø ŚûďŚţąŚĺùćŘć ' ěŘ Řď ŠŘĄ Ż öŘĄ Ůü õ ø ť ĺŘ Ć ś ĺŚ ¡ õ Û ŞŚ ì ü őŚ þď ŰďĄ ňĆ Ş J(n) Ć Ü ß Æ õ ß þŘ ŠŘĄ Ż $ .ćďøŊ ťĺćĆŞ Âþě üţÈð쌪 ýĆÎŞŘď J(1) = 1 J(2n) = 2J(n) − 1, for n ≥ 1, J(2n + 1) = 2J(n) + 1 for n ≥ 1. J(n) ÝČûć üœŘďøć šİ ťÔČł ťČŞ Œþ ŘďöŊ ø ÝČÆþĄĂŞ üþøćøć ćÀä ŰďĄňĆŞ Řď n ÂðŘ .ÀþŊüõ ťĺćĆŞ .ťĺŘ J(n) = (100101)2 = 73 ŠŘĄŻ ,n = 100 = (110010)2 ýŘÂŞ Ě f ůõ & üĺÀì ÀÞ¡õ c ° 1389 öŚŞŊ 1 27 ÂŮĄČşõŚî üĺÀĂúõ ýùÀØÈœŘć % ŚûÝţþďĄÚóŘ üœŚśõ ø ŚûďŚţąŚĺùćŘć ' $ ýŘĆÖܧ ýÀœĄČŢ ťÆČó ŚŞ ğĄêěøę ýĆÜßÆõ Û§ & üĺÀì ÀÞ¡õ c ° 1389 öŚŞŊ 1 28 ÂŮĄČşõŚî üĺÀĂúõ ýùÀØÈœŘć % ŚûÝţþďĄÚóŘ üœŚśõ ø ŚûďŚţąŚĺùćŘć ' $ Joesephous (n) . ÀĂîüõ 挟þŘ ùÂð n ŚŞ ýĄÖܧ ýÀœĄČŢ ťÆČó Œþ ŘÀţŞŘ ďć 1 Create(L) 2 first[L] ← q ← Allocate-Node(1, null ) 3 p← q 4 for i ← 2 to n 5 do next[p] ← Allocate-Node(i, next[p]) 6 p ← next[p] 7 next[p] ← q; size[L] ← n . ğĄêěøę ýĆÜßÆõ ÀĂîe Û§ùŘď ĎŚ§ ø 8 p ← First(L) 9 while next[p] 6= p 10 do Delete-After(L, p) 11 p ← next[p] 12 Print element[p] & üĺÀì ÀÞ¡õ c ° 1389 öŚŞŊ 1 29 ÂŮĄČşõŚî üĺÀĂúõ ýùÀØÈœŘć % ŚûÝţþďĄÚóŘ üœŚśõ ø ŚûďŚţąŚĺùćŘć ' $ üÆþÀœŘ ýŚûÂðùďŚłŘ ŚŞ ŚûťÆČó ýěŚĺùćŚČŢ ?ÝČĂîüõ ýěŚĺùćŚČŢ ĆœĄðĆİ Řď ŚûťÆČó öÂŮÂê öŚŞě Śþ & üĺÀì ÀÞ¡õ c ° 1389 öŚŞŊ 1 30 ÂŮĄČşõŚî üĺÀĂúõ ýùÀØÈœŘć % ŚûÝţþďĄÚóŘ üœŚśõ ø ŚûďŚţąŚĺùćŘć ' L prev next A 11 $ B element C 3 7 D 4 L 11 4 element C D B prev 7 3 11 next 2 4 5 6 7 3 1 3 8 9 10 11 7 A .ÀĂţÆû ÅþÀœŘ ŚûÂðùďŚłŘ .prev ø element ,next ýĆþŘďŊ Ćĺ & üĺÀì ÀÞ¡õ c ° 1389 öŚŞŊ 1 31 ÂŮĄČşõŚî üĺÀĂúõ ýùÀØÈœŘć % ŚûÝţþďĄÚóŘ üœŚśõ ø ŚûďŚţąŚĺùćŘć ' L1 11 L2 5 4 2 13 3 element b C D prev 5 7 3 next 1 4 5 2 a 6 7 3 B 11 8 $ 9 10 11 12 13 7 A c 2 .ćÂî ýěŚĺùćŚČŢ ĆÑêŚ§ öŚÞû ďć öŘĄŮüõ Řď (L2 ø L1 Ě f ůõ) ťÆČó Œþ ěŘ ÇČŞ & üĺÀì ÀÞ¡õ c ° 1389 öŚŞŊ 1 32 ÂŮĄČşõŚî üĺÀĂúõ ýùÀØÈœŘć % ŚûÝţþďĄÚóŘ üœŚśõ ø ŚûďŚţąŚĺùćŘć ' $ L 19 prev 1 2 3 4 next 5 13 C 6 7 7 4 8 D 9 10 11 12 13 14 19 B 15 4 19 20 21 A 13 element .ćÂî ùćŚÔţĺŘ ťÆČó Œþ ýěŚĺùćŚČŢ ýŘÂŞ ĆþŘďŊ Œþ ěŘ ÍÖê öŘĄŮüõ & üĺÀì ÀÞ¡õ c ° 1389 öŚŞŊ 1 33 ÂŮĄČşõŚî üĺÀĂúõ ýùÀØÈœŘć % ŚûÝţþďĄÚóŘ üœŚśõ ø ŚûďŚţąŚĺùćŘć ' $ ćŘěŊ ýŚÌê ťþÂþÀõ .ÀœÂČðüõ ďŘÂì avail ôŚœĆŞ üţÆČó ďć ćŘěŊ ÂňŚĂä ýĆÞû • .ÀœćŘěŊ ŚûĆþŘďŊ ÂňŚĂä ýĆÞû ŘÀţŞŘ ďć • ďć ùÀł éÁ§ avail ěŘ ćŘěŊ ťÆČó ÂÊĂä ßČóøŘ ,Žďć ýŘÂŞ (Allocate-Object ÛÞä) • ćÂČðüõ ďŘÂì ďŚČţąŘ .楳üõ ćŘěŊ avail ťÆČó ýŘÀţŞŘ ďć Žďć ŚŞ ÂÊĂä (Free-Object ÛÞä) • & üĺÀì ÀÞ¡õ c ° 1389 öŚŞŊ 1 34 ÂŮĄČşõŚî üĺÀĂúõ ýùÀØÈœŘć % ŚûÝţþďĄÚóŘ üœŚśõ ø ŚûďŚţąŚĺùćŘć ' $ üÆþÀœŘ ÂðùďŚłŘ ŚŞ ťÆČó Œþ ďć éÁ§ ø Žďć ěŘ üóŚůõ & üĺÀì ÀÞ¡õ c ° 1389 öŚŞŊ 1 35 ÂŮĄČşõŚî üĺÀĂúõ ýùÀØÈœŘć % ŚûÝţþďĄÚóŘ üœŚśõ ø ŚûďŚţąŚĺùćŘć ' $ L 11 avail 1 1 next 2 3 2 6 4 4 5 6 7 8 9 10 11 12 13 12 13 10 5 3 9 12 8 7 13 element C D B prev 7 3 11 A üÜňŘ ťÆČó (ÓóŘ) L 11 avail 2 1 2 3 next 11 6 4 element prev E 4 5 c ° 1389 öŚŞŊ 1 7 8 9 10 11 10 5 3 9 12 8 7 13 C D B A 7 3 11 1 (ÓóŘ) ťÆČó ñøŘ ÂÊĂä öŘĄĂäĆŞ & üĺÀì ÀÞ¡õ 6 36 E Žďć ěŘ ÅŢ (Š) ÂŮĄČşõŚî üĺÀĂúõ ýùÀØÈœŘć % ŚûÝţþďĄÚóŘ üœŚśõ ø ŚûďŚţąŚĺùćŘć ' $ L 11 avail 2 1 2 3 next 11 6 4 element E prev 4 5 6 7 8 9 10 11 12 13 12 13 10 5 3 9 12 8 7 13 C D B A 7 3 11 1 (ÓóŘ) ťÆČó ñøŘ ÂÊĂä öŘĄĂäĆŞ E Žďć ěŘ ÅŢ (Š) L 11 avail 7 1 2 3 next 11 6 4 element prev E c ° 1389 öŚŞŊ 1 5 6 7 8 9 10 11 10 5 2 9 12 8 3 13 C D A 11 3 1 (Š) ťÆČó ďć & üĺÀì ÀÞ¡õ 4 B ÂÊĂä éÁ§ ěŘ ÅŢ (Ť) 37 ÂŮĄČşõŚî üĺÀĂúõ ýùÀØÈœŘć % ŚûÝţþďĄÚóŘ üœŚśõ ø ŚûďŚţąŚĺùćŘć ' $ ýěŚĺùćŚČŢ Initialize () 1 null ← 0 2 avail ← 1 3 for i ← 1 to M − 1 4 do next[i] ← i + 1 5 next[M ] ← null & üĺÀì ÀÞ¡õ c ° 1389 öŚŞŊ 1 38 ÂŮĄČşõŚî üĺÀĂúõ ýùÀØÈœŘć % ŚûÝţþďĄÚóŘ üœŚśõ ø ŚûďŚţąŚĺùćŘć ' $ (ĆõŘćŘ) ýěŚĺùćŚČŢ Allocate-Object () 1 if avail = null 2 then error out of space 3 x ← avail 4 avail ← next[avail] 5 return x Free-Object (x) 1 next[x] ← avail 2 avail ← x & üĺÀì ÀÞ¡õ c ° 1389 öŚŞŊ 1 39 ÂŮĄČşõŚî üĺÀĂúõ ýùÀØÈœŘć % ŚûÝţþďĄÚóŘ üœŚśõ ø ŚûďŚţąŚĺùćŘć ' $ (Garbage Collection) üŞøďĆóŚŞě & üĺÀì ÀÞ¡õ c ° 1389 öŚŞŊ 1 40 ÂŮĄČşõŚî üĺÀĂúõ ýùÀØÈœŘć % ŚûÝţþďĄÚóŘ üœŚśõ ø ŚûďŚţąŚĺùćŘć ' $ ŚûĆţÈŢ S ýĆţÈŢ ýĎŚŞ ďć x ÂÊĂä Œþ Žďć :Push(S, x) • žČû :üŻøÂą ,(üČł) ÂÊĂä :ýćøďø b ĆţÈŢ ýĎŚŞ ÂÊĂä öÀœŘćÂð쌪 ø éÁ§ :Pop(S) • ÀłŚŞ üóŚą ĆţÈŢ ÂðŘ :ŚÎą ,(üČł) ÂÊĂä :üŻøÂą ,žČû :ýćøďø b ĆţÈŢ ďć 楯Ąõ ÂňŚĂä ćŘÀãŮ :Size(S) • ijČ¡ň ćÀä Œþ :üŻøÂą ,žČû :ýćøďø ťĺŘ üóŚą ĆţÈŢ ŚþŊ Ćî ÀĂîüõ É£Èõ :isEmpty(S) • ťĺďćŚœ Śþ ťĺďć :üŻøÂą ,žČû :ýćøďø ÀœŘćÂðüõÂŞ Řď ĆţÈŢ ýĎŚŞ ÂÊĂä :Top(S) • & üĺÀì ÀÞ¡õ ÀłŚŞ üóŚą ĆţÈŢ ÂðŘ :ŚÎą ,(üČł) ÂÊĂä :üŻøÂą ,žČû :ýćøďø b c ° 1389 öŚŞŊ 1 41 ÂŮĄČşõŚî üĺÀĂúõ ýùÀØÈœŘć % ŚûÝţþďĄÚóŘ üœŚśõ ø ŚûďŚţąŚĺùćŘć ' 8, 7, 6, 5, 4, 3, 2, 1 $ 8, 1, 2, 7, 3, 6, 4, 5 .ŚûďŚÎì ýĆţÈŢ ?ďĄÏĆİ .ťĺŘ ÀČóĄŮ ÛŞŚì h8, 1, 2, 7, 3, 6, 4, 5i & üĺÀì ÀÞ¡õ c ° 1389 öŚŞŊ 1 42 ÂŮĄČşõŚî üĺÀĂúõ ýùÀØÈœŘć % ŚûÝţþďĄÚóŘ üœŚśõ ø ŚûďŚţąŚĺùćŘć ' 8, 7, 6, 5, 4, 3, 2, 1 $ 8, 1, 2, 7, 3, 6, 4, 5 .ŚûďŚÎì ýĆţÈŢ ?ďĄÏĆİ .ťĺŘ ÀČóĄŮ ÛŞŚì h8, 1, 2, 7, 3, 6, 4, 5i Push, Push, Push, Push, Push, Pop, Pop, Push, Pop, Pop, Push, Pop, Pop, Pop, Push, Pop ?ďĄÏĆİ h1, 8, 3, 6, 2, 7, 4, 5i & üĺÀì ÀÞ¡õ c ° 1389 öŚŞŊ 1 43 ÂŮĄČşõŚî üĺÀĂúõ ýùÀØÈœŘć % ŚûÝţþďĄÚóŘ üœŚśõ ø ŚûďŚţąŚĺùćŘć ' $ ĆÜßÆõ ÀĂİ .ÀČĂî ŰŚśŹŘ ŘďöŊ ?ťÆČİ ÀłŚŞ ÀČóĄŮ ÛŞŚì Ćî ĆóŚśœć Œþ ýŘÂŞ üêŚî ø ôěĎ ŕÂł (1 .Àûć ÉČ£ÈŮ Řď ýŘĆóŚśœć ö楪 ÀČóĄŮ ÛŞŚì ŚŮ ÀČûć ĆŐŘďŘ O(n) ěŘ üÞţþďĄÚóŘ (2 üĂãþ ;ćďŘć 楯ø üŻøÂą ø ýćøďø ýŚûďŚÎì ßČŞ Ýû ÝČÖţÆõ Ûþď Œþ ÀČĂî ŋÂê (3 ÛÖţĂõ üŻøÂą Ûþď ĆŞ fŚÞČÖţÆõ Śþ ø ćøď ĆţÈŢ ÛąŘć ĆŞ Śþ ÀœŘĄŮüõ ýćøďø ďŚÎì ßČóøŘ Œ þ ÉČ £ÈŮ Ýţ þďĄ ÚóŘ ŰďĄ ň ßþŘ ďć .ýćøďø ĆŞ ü ŻøÂą ěŘ Å ØäÂŞ Śþ ø ,ćĄ ł .ÀČûć ĆŐŘďŘ Řď ÀČóĄŮ ÛŞŚì ýĆóŚśœć & üĺÀì ÀÞ¡õ c ° 1389 öŚŞŊ 1 44 ÂŮĄČşõŚî üĺÀĂúõ ýùÀØÈœŘć % ŚûÝţþďĄÚóŘ üœŚśõ ø ŚûďŚţąŚĺùćŘć ' & üĺÀì ÀÞ¡õ .ÀČĂî Û§ ÛØł ÕŞŚÎõ ýŘĆţÈŢ øć ÝţÆČĺ ýŘÂŞ Řď üÜňŘ ýĆÜßÆõ (4 c ° 1389 öŚŞŊ 1 45 ÂŮĄČşõŚî üĺÀĂúõ ýùÀØÈœŘć $ % ŚûÝţþďĄÚóŘ üœŚśõ ø ŚûďŚţąŚĺùćŘć ' $ ĆþŘďŊ ŚŞ ĆţÈŢ ýěŚĺùćŚČŢ ďć 楯Ąõ ÂÊĂä ßþÂŮĎŚŞ ÅþÀœŘ Ćî top[S] ýĆÔóĄõ ø max ÂůîŘÀ§ ýùěŘÀœŘ ŚŞ S ýĆþŘďŊ b .ťĺŘ S public class ArrayStack implements Stack { public static final int CAPACITY=1000; private int capacity; private object S[]; private int top = -1; public ArrayStack(){ this(CAPACITY); } public ArrayStack(int cap){ capacity = cap; S = new object[capacity]; } & üĺÀì ÀÞ¡õ c ° 1389 öŚŞŊ 1 46 ÂŮĄČşõŚî üĺÀĂúõ ýùÀØÈœŘć % ŚûÝţþďĄÚóŘ üœŚśõ ø ŚûďŚţąŚĺùćŘć ' Stack 1 23 $ top[S] max S .ĆþŘďŊ ŚŞ ĆţÈŢ ýěŚĺùćŚČŢ & üĺÀì ÀÞ¡õ c ° 1389 öŚŞŊ 1 47 ÂŮĄČşõŚî üĺÀĂúõ ýùÀØÈœŘć % ŚûÝţþďĄÚóŘ üœŚśõ ø ŚûďŚţąŚĺùćŘć ' Size (S) 1 return top[S] $ . assuming that initially top[S] = 0 isEmpty (S) 1 return Size(S) = 0 Top (S) 1 if isEmpty(S) 2 then error (”stack is empty”) 3 return S[top[S]] & üĺÀì ÀÞ¡õ c ° 1389 öŚŞŊ 1 48 ÂŮĄČşõŚî üĺÀĂúõ ýùÀØÈœŘć % ŚûÝţþďĄÚóŘ üœŚśõ ø ŚûďŚţąŚĺùćŘć ' $ Push (S, x) 1 if Size(S) = max 2 then error (”stack is full”) 3 top[S] ← top[S] + 1 4 S[top[S]] ← x Pop (S) 1 if isEmpty() 2 then error (”stack is empty”) 3 e ← S[top[S]] 4 top[S] ← top[S] − 1 5 return e & üĺÀì ÀÞ¡õ c ° 1389 öŚŞŊ 1 49 ÂŮĄČşõŚî üĺÀĂúõ ýùÀØÈœŘć % ŚûÝţþďĄÚóŘ üœŚśõ ø ŚûďŚţąŚĺùćŘć ' S 1 23 top1 top2 $ N .ĆþŘďŊ ŚŞ ĆţÈŢ ÀĂİ ýěŚĺùćŚČŢ & üĺÀì ÀÞ¡õ c ° 1389 öŚŞŊ 1 50 ÂŮĄČşõŚî üĺÀĂúõ ýùÀØÈœŘć % ŚûÝţþďĄÚóŘ üœŚśõ ø ŚûďŚţąŚĺùćŘć ' $ ÛČÜ¡Ů .ÀœĄłüõ ôŚźœŘ O(1) ďć ñŚÞäŘ ýĆÞû & üĺÀì ÀÞ¡õ c ° 1389 öŚŞŊ 1 51 ÂŮĄČşõŚî üĺÀĂúõ ýùÀØÈœŘć % ŚûÝţþďĄÚóŘ üœŚśõ ø ŚûďŚţąŚĺùćŘć ' $ ýÀœĄČŢ ťÆČó ŚŞ ĆţÈŢ ýěŚĺùćŚČŢ Size (S) 1 return size[S] isEmpty (S) 1 return (size[S] = 0) Top (S) 1 if isEmpty(S) 2 then error (”stack is empty”) 3 return top[S] & üĺÀì ÀÞ¡õ c ° 1389 öŚŞŊ 1 52 ÂŮĄČşõŚî üĺÀĂúõ ýùÀØÈœŘć % ŚûÝţþďĄÚóŘ üœŚśõ ø ŚûďŚţąŚĺùćŘć ' $ Push (S, x) 1 top[S] ← Allocate-Node (x, top[S]) 2 size[S] ← size[S] + 1 Pop (S) 1 if isEmpty(S) 2 then error (”stack is empty”) 3 n ← top[S] 4 temp ← element[n] 5 top[S] ← next[n] 6 size[S] ← size[S] − 1 7 Free-Object(n) 8 return temp & üĺÀì ÀÞ¡õ c ° 1389 öŚŞŊ 1 53 ÂŮĄČşõŚî üĺÀĂúõ ýùÀØÈœŘć % ŚûÝţþďĄÚóŘ üœŚśõ ø ŚûďŚţąŚĺùćŘć ' $ Óň ťÆČó ýŘÀţŞŘ ďć éÁ§ ø ŚúţœŘ ďć Žďć & üĺÀì ÀÞ¡õ c ° 1389 öŚŞŊ 1 54 ÂŮĄČşõŚî üĺÀĂúõ ýùÀØÈœŘć % ŚûÝţþďĄÚóŘ üœŚśõ ø ŚûďŚţąŚĺùćŘć ' $ Óň ýŚúţœŘ ďć ÂÊĂä Œþ Žďć :Enqueue(Q, x) • žČû :üŻøÂą ,(üČł) ÂÊĂä :ýćøďø b Óň ýŘÀţŞŘ ěŘ ÂÊĂä éÁ§ :Dequeue(Q) • ÀłŚŞ üóŚą ÂðŘ :ŚÎą ,(üČł) ÂÊĂä :üŻøÂą ,žČû :ýćøďø b Óň ďć 楯Ąõ ÂňŚĂä ćŘÀãŮ :Size(Q) • ijČ¡ň ćÀä Œþ :üŻøÂą ,žČû :ýćøďø ťĺŘ üóŚą Óň ŚþŊ Ćî ÀĂîüõ É£Èõ :isEmpty(Q) • ťĺďćŚœ Śþ ťĺďć :üŻøÂą ,žČû :ýćøďø ÀœŘćÂðüõÂŞ Řď Óň ýŘÀţŞŘ ÂÊĂä :Front-Element(Q) • ÀłŚŞ üóŚą ÂðŘ :ŚÎą ,ÂÊĂä :üŻøÂą ,žČû :ýćøďø & üĺÀì ÀÞ¡õ c ° 1389 öŚŞŊ 1 55 ÂŮĄČşõŚî üĺÀĂúõ ýùÀØÈœŘć % ŚûÝţþďĄÚóŘ üœŚśõ ø ŚûďŚţąŚĺùćŘć ' $ ďŘøć ýĆþŘďŊ ŚŞ ýěŚĺùćŚČŢ rear 1 0 N −1 front rear empty queue & üĺÀì ÀÞ¡õ c ° 1389 öŚŞŊ 1 1 0 N −1 1 0 N −1 front rear front non-empty queue 56 full queue ÂŮĄČşõŚî üĺÀĂúõ ýùÀØÈœŘć % ŚûÝţþďĄÚóŘ üœŚśõ ø ŚûďŚţąŚĺùćŘć ' Q Óň Œþ $ max − 1 ŚŮ 0 ýŚûÅþÀœŘ ø max ýùěŘÀœŘ ŚŞ ĆþŘďŊ Œþ • .ÀœĄłüõ ùÂČąč ćÂðťäŚĺ ťúŻ ďć ø ďŘøć ŰďĄňĆŞ ÂňŚĂä • .ťĺŘ Q[i] ý c ÀãŞ ÂÊĂä Q[(i + 1) mod max] • Óň üþŘÀţŞŘ ÂÊĂä ÅþÀœŘ f ront[Q] ýĆÔóĄõ • .Óň ÂÊĂä ßþÂąŊ ýÀãŞ ÂÊĂä ÅþÀœŘ rear[Q] • .ťĺŘ max − 1 ÂňŚĂä ćŘÀãŮ ÂůîŘÀ§ ßþŘÂŞŚĂŞ • .ÝČûć ÃČÞŮ Ýû ěŘ ÝČœŘĄţŞ Řď "üóŚą Ě f õŚî’ ø "ÂŢ Ě f õŚî’ ťóŚ§ øć ÝČûŘĄąüõ • & üĺÀì ÀÞ¡õ c ° 1389 öŚŞŊ 1 57 ÂŮĄČşõŚî üĺÀĂúõ ýùÀØÈœŘć % ŚûÝţþďĄÚóŘ üœŚśõ ø ŚûďŚţąŚĺùćŘć ' $ Óň ÓÜţ£õ ýŚûťóŚ§ f ront[Q] = rear[Q] = 0 áøÂł ďć • .(max − f ront[Q] + rear[Q]) mod max ÂŞŘÂŞ ĆÈČÞû ÂňŚĂä ćŘÀãŮ • .f ront[Q] = rear[Q] ÝþďŘć ÀłŚŞ üóŚą Ě f õŚî Óň ÂðŘ • .(max − f ront[Q] + rear[Q]) mod max = max − 1 ÝþďŘć ÀłŚŞ ÂŢ Ě f õŚî ÂðŘ • & üĺÀì ÀÞ¡õ c ° 1389 öŚŞŊ 1 58 ÂŮĄČşõŚî üĺÀĂúõ ýùÀØÈœŘć % ŚûÝţþďĄÚóŘ üœŚśõ ø ŚûďŚţąŚĺùćŘć ' $ Size (Q) 1 return (max − f ront[Q] + rear[Q]) mod max isEmpty (Q) 1 return (f ront[Q] = rear[Q]) Front-Element (Q) 1 if isEmpty(Q) 2 then error ”Queue is empty” 3 return Q[f ront[Q]] & üĺÀì ÀÞ¡õ c ° 1389 öŚŞŊ 1 59 ÂŮĄČşõŚî üĺÀĂúõ ýùÀØÈœŘć % ŚûÝţþďĄÚóŘ üœŚśõ ø ŚûďŚţąŚĺùćŘć ' $ Enqueue (Q, x) 1 if Size(Q) = max − 1 2 then error ”Queue is full” 3 Q[rear[Q]] ← x 4 rear[Q] ← (rear[Q] + 1) mod max Dequeue (Q) 1 if isEmpty() 2 then error ”Queue is empty” 3 temp ← Q[f ront[Q]] 4 f ront[Q] ← (f ront[Q] + 1) mod max 5 return temp & üĺÀì ÀÞ¡õ c ° 1389 öŚŞŊ 1 60 ÂŮĄČşõŚî üĺÀĂúõ ýùÀØÈœŘć % ŚûÝţþďĄÚóŘ üœŚśõ ø ŚûďŚţąŚĺùćŘć ' & üĺÀì ÀÞ¡õ .ÀĂţÆû O(1) ěŘ ĆÞû ñŚÞäŘ ßþŘ c ° 1389 öŚŞŊ 1 61 ÂŮĄČşõŚî üĺÀĂúõ ýùÀØÈœŘć $ % ŚûÝţþďĄÚóŘ üœŚśõ ø ŚûďŚţąŚĺùćŘć ' $ ýÀœĄČŢ ťÆČó ŚŞ Óň ýěŚĺùćŚČŢ & üĺÀì ÀÞ¡õ c ° 1389 öŚŞŊ 1 62 ÂŮĄČşõŚî üĺÀĂúõ ýùÀØÈœŘć % ŚûÝţþďĄÚóŘ üœŚśõ ø ŚûďŚţąŚĺùćŘć ' $ front rear front rear front rear & üĺÀì ÀÞ¡õ c ° 1389 öŚŞŊ 1 63 ÂŮĄČşõŚî üĺÀĂúõ ýùÀØÈœŘć % ŚûÝţþďĄÚóŘ üœŚśõ ø ŚûďŚţąŚĺùćŘć ' $ isEmpty (Q) 1 return size[Q] = 0 Enqueue (Q, x) 1 next[rear[Q]] ← Allocate-Node (x, null ) 2 rear[Q] ← next[rear[Q]] 3 size[Q] ← size[Q] + 1 & üĺÀì ÀÞ¡õ c ° 1389 öŚŞŊ 1 64 ÂŮĄČşõŚî üĺÀĂúõ ýùÀØÈœŘć % ŚûÝţþďĄÚóŘ üœŚśõ ø ŚûďŚţąŚĺùćŘć ' $ Dequeue (Q) 1 if isEmpty(Q) 2 then error ’queue is empty’ 3 n ← f ront[Q] 4 x ← element[n] 5 f ront[Q] ← next[f ront[Q]] 6 Free-Node(n) 7 size[Q] ← size[Q] − 1 8 return x & üĺÀì ÀÞ¡õ c ° 1389 öŚŞŊ 1 65 ÂŮĄČşõŚî üĺÀĂúõ ýùÀØÈœŘć % ŚûÝţþďĄÚóŘ üœŚśõ ø ŚûďŚţąŚĺùćŘć ' $ ŚûťÆČó ěŘ üþŚûćÂŞďŚî ğ索 ďŘ쌪 üŞŚþěďŘ ýĆÜßÆõ & üĺÀì ÀÞ¡õ c ° 1389 öŚŞŊ 1 66 ÂŮĄČşõŚî üĺÀĂúõ ýùÀØÈœŘć % ŚûÝţþďĄÚóŘ üœŚśõ ø ŚûďŚţąŚĺùćŘć ' s0 = 1 s6 = 6 s1 = 1 s5 = 4 s3 = 2 s2 = 1 p0 p1 $ p2 s4 = 1 p3 p4 p5 p6 .(si) ěøď Âû ďć öŊ ý"ùďøć’ ø (pi) ğ索 ďŘ쌪 ďć Ýúĺ Œþ ĆœŘěøď ťÞČì & üĺÀì ÀÞ¡õ c ° 1389 öŚŞŊ 1 67 ÂŮĄČşõŚî üĺÀĂúõ ýùÀØÈœŘć % ŚûÝţþďĄÚóŘ üœŚśõ ø ŚûďŚţąŚĺùćŘć ' 楳üõ ĆČúŮ ÓÜţ£õ ýŚûěøď ďć ťîÂł Œþ ôŚúĺ ťÞČì $ :ÝČĂî ŘÀČŢ Řď "ôŚúĺ öŊ ýùďøć’ ěøď Âû ďć ÝČûŘĄąüõ ýŚ ûěøď ćŘÀ ã Ů Ś Ş ť ĺŘ Â ŞŘÂ Ş i ěøď ďć ùďøć ,À łŚ Ş pi  ŞŘÂ Ş i ěøď ďć ôŚ ú ĺ ť Þ Č ì  ðŘ .ÀłŚŞ pi ýøŚÆõ Śþ ÂŮÝî ôŚúĺ ťÞČì Ćî (i ÛõŚł) i ěŘ Ûśì ĆÜňŚêĚŞ P üþŚŮ n ýĆþŘďŊ :ýćøďø .ÀłŚŞ i ěøď ďć "ôŚúĺ ýùďøć’ S[i] Ćî S üþŚŮ n ýĆþŘďŊ :üŻøÂą & üĺÀì ÀÞ¡õ c ° 1389 öŚŞŊ 1 68 ÂŮĄČşõŚî üĺÀĂúõ ýùÀØÈœŘć % ŚûÝţþďĄÚóŘ üœŚśõ ø ŚûďŚţąŚĺùćŘć ' $ ÀĂî ÝţþďĄÚóŘ ComputeSpans (P ) . Input: n-element array P . Output: n-element array S 1 for i ← 0 to n − 1 2 do k ← 0 3 done ← false 4 repeat if P [i − k] ≤ P [i] 5 then k ← k + 1 6 else done ← true 7 until k = i or done 8 S[i] ← k + 1 9 return S & üĺÀì ÀÞ¡õ c ° 1389 öŚŞŊ 1 69 ÂŮĄČşõŚî üĺÀĂúõ ýùÀØÈœŘć % ŚûÝţþďĄÚóŘ üœŚśõ ø ŚûďŚţąŚĺùćŘć ' $ ÛČÜ¡Ů O(n2) & üĺÀì ÀÞ¡õ c ° 1389 öŚŞŊ 1 70 ÂŮĄČşõŚî üĺÀĂúõ ýùÀØÈœŘć % ŚûÝţþďĄÚóŘ üœŚśõ ø ŚûďŚţąŚĺùćŘć ' $ üÎą ÝţþďĄÚóŘ ComputeSpans2 (P ) . we use a stack D 1 for i ← 0 to n − 1 2 do done ← false 3 while ( not isEmpty(D) or done) 4 do if P [i] ≥ P [Top(D)] 5 then Pop(D) 6 else done ← true 7 if isEmpty(D) 8 then h ← −1 9 else h ← Top(D) 10 S[i] ← i − h 11 Push(D, i) 12 return S & üĺÀì ÀÞ¡õ c ° 1389 öŚŞŊ 1 71 ÂŮĄČşõŚî üĺÀĂúõ ýùÀØÈœŘć % ŚûÝţþďĄÚóŘ üœŚśõ ø ŚûďŚţąŚĺùćŘć ' $ ÛČÜ¡Ů .楳üõ éÁ§ ĆţÈŢ ěŘ ďŚŞŒþ ÂůîŘÀ§ ø Žďć ĆţÈŢ ďć Œþ fŚÖČìć ÂÊĂä Âû öĄİ O(n) & üĺÀì ÀÞ¡õ c ° 1389 öŚŞŊ 1 72 ÂŮĄČşõŚî üĺÀĂúõ ýùÀØÈœŘć % ŚûÝţþďĄÚóŘ üœŚśõ ø ŚûďŚţąŚĺùćŘć ' $ ťÆČó ŚŞ üõŚèćŘ ýěŚĺřŮÂõ MergeSort (L) . ÀĂîüõ řŮÂõ ŚûÂðùďŚłŘ ÂČČçŮ ŚŞ ÍÖê Řď ýÀœĄČŢ ťÆČó Œþ 1 if Size(L) > 1 2 then Create(L1); Create(L2) 3 first[L1], first[L2] ← Split(first[L]) 4 MergeSort (L1) 5 MergeSort (L2) 6 first[L]← Merge(first[L1], first[L2]) 7 return L & üĺÀì ÀÞ¡õ c ° 1389 öŚŞŊ 1 73 ÂŮĄČşõŚî üĺÀĂúõ ýùÀØÈœŘć % ŚûÝţþďĄÚóŘ üœŚśõ ø ŚûďŚţąŚĺùćŘć ' $ ` ùÀł ôŚèćŘ ťÆČó ĆŞ `1 ÀœĄłüõ ôŚèćŘ Ýû ďć üţÈð쌪 üœŘĄąŘÂê ŚŞ `2 .` ñøŘ ÂÊĂä ŚŞ řŮÂõ ťÆČó Œþ ÀČóĄŮ ø `2 ø `1 ñøŘ ÂňŚĂä ŚŞ řŮÂõ ťÆČó øć ôŚèćŘ & üĺÀì ÀÞ¡õ c ° 1389 öŚŞŊ 1 74 ÂŮĄČşõŚî üĺÀĂúõ ýùÀØÈœŘć % ŚûÝţþďĄÚóŘ üœŚśõ ø ŚûďŚţąŚĺùćŘć ' $ Merge (`1, `2) 1 if `1 = null 2 then return `2 3 if `2 = null 4 then return `1 5 if key[`1] ≤ key[`2] 6 then next[`1] ← Merge(next[`1], `2) 7 return `1 8 else next[`2] ← Merge(`1, next[`2]) 9 return `2 & üĺÀì ÀÞ¡õ c ° 1389 öŚŞŊ 1 75 ÂŮĄČşõŚî üĺÀĂúõ ýùÀØÈœŘć % ŚûÝţþďĄÚóŘ üœŚśõ ø ŚûďŚţąŚĺùćŘć ' ` `1 a1 a2 a3 a1 a2 a3 $ `2 n .ýĄÌä b 2 c ø d 2n e ťÆČó øć ĆŞ ýĄÌä n ťÆČó Œþ ÝČÆÖŮ & üĺÀì ÀÞ¡õ c ° 1389 öŚŞŊ 1 76 ÂŮĄČşõŚî üĺÀĂúõ ýùÀØÈœŘć % ŚûÝţþďĄÚóŘ üœŚśõ ø ŚûďŚţąŚĺùćŘć ' $ Split (`) 1 if ` = null 2 then return null , null 3 if next[`] = null 4 then return null , ` 5 `1 ← ` 6 `2 ← next[`] 7 next[`], next[`2] ← Split(next[`2]) 8 return `1, `2 & üĺÀì ÀÞ¡õ c ° 1389 öŚŞŊ 1 77 ÂŮĄČşõŚî üĺÀĂúõ ýùÀØÈœŘć % ŚûÝţþďĄÚóŘ üœŚśõ ø ŚûďŚţąŚĺùćŘć ' $ üÜî ýŚûťÆČó üÜî ťóŚ§ ďć ýŘĆÜÞŻÀĂİ Œþ • Ćî ťĺŘ cxex y ey z ez . . . áĄœ ěŘ ýŚûŰä âÞŻ • ø z ,y ,x ýŚ ûÂ Č ç ţ õ öŘĄ Ů ř þŘ ő ř Č Ů ŮĆ Ş. . . ,ez ,ey ,ex ø ŰďŚ ś ä ß þŘ ř þ ő c • Ě f ůõ .ÀĂţÆû. . . P = x10y 3z 2 + 2x8y 3z 2 + 3x8y 2z 2 + x4y 4z + 6x3y 4z + 6x3y 4z + 2yz (1) & üĺÀì ÀÞ¡õ c ° 1389 öŚŞŊ 1 78 ÂŮĄČşõŚî üĺÀĂúõ ýùÀØÈœŘć % ŚûÝţþďĄÚóŘ üœŚśõ ø ŚûďŚţąŚĺùćŘć ' :Âþě ñŚÞäŘ ŚŞ řĺŚĂõ ďŚţąŚĺùćŘć ü§ŘÂÏ éÀû $ ŰďŚśä ŤŚİ -öŊ ÕÞä ßþÂŮÇČŞ ßČČãŮ -ŰďŚśä Œþ öćÂî üşî -Űä øć ÕþÂÔŮ Śþ âÞŻ -ŚûÂČçţõ ěŘ üØþ řÆ§ÂŞ Űä ěŘ ýÂČðÕţÈõ -- & üĺÀì ÀÞ¡õ c ° 1389 öŚŞŊ 1 79 ÂŮĄČşõŚî üĺÀĂúõ ýùÀØÈœŘć % ŚûÝţþďĄÚóŘ üœŚśõ ø ŚûďŚţąŚĺùćŘć ' Âþě ÂňŚĂä ŚŞ ťÆČó Œþ :ñøŘ ľøď $ coef expx expy expz & üĺÀì ÀÞ¡õ c ° 1389 öŚŞŊ 1 link 80 ÂŮĄČşõŚî üĺÀĂúõ ýùÀØÈœŘć % ŚûÝţþďĄÚóŘ üœŚśõ ø ŚûďŚţąŚĺùćŘć ' $ üţÈð쌪 ďŚţąŚĺ ŚŞ üÜî ťÆČó ,z, y, x, nz , ny , nx řÆ§ÂŞ ýŘĆÜÞŻ ÀĂİ Œþ P (z, y, x, nz , ny , nx ) ÂðŘ ø x ø y ,z řČŮÂŮĆŞ ŚûÂČçţõ • ,ÀĂłŚŞ nx ø ny ,nz ÂŞŘÂŞ řČŮÂŮĆŞ ŚûöŊ ýĆŻďć • :ÝČĂîüõ ÓþÂãŮ Âþě ŰďĄňĆŞ ŘďöŊ P (z, y, x, nz , ny , nx) = cnz (Pnz (y, x, ny , nx)z nz + cnz −1(Pnz −1(y, x, ny , nx)z nz −1 + . . . + c0(P0(y, x, ny , nx)) & üĺÀì ÀÞ¡õ c ° 1389 öŚŞŊ 1 81 ÂŮĄČşõŚî üĺÀĂúõ ýùÀØÈœŘć % ŚûÝţþďĄÚóŘ üœŚśõ ø ŚûďŚţąŚĺùćŘć ' $ ñŚůõ (((x10 + 2x8)y 3 + 3x8y 2)z 2 + ((x4 + 6x3)y 4 + 2y)z) & üĺÀì ÀÞ¡õ c ° 1389 öŚŞŊ 1 82 ÂŮĄČşõŚî üĺÀĂúõ ýùÀØÈœŘć % ŚûÝţþďĄÚóŘ üœŚśõ ø ŚûďŚţąŚĺùćŘć ' var P z - link dlink nz − 1 link coef link nz exp $ 1 exp exp y - y Pnz (y, x, ny , nx ) y - Pnz −1 (y, x, ny , nx ) P0 (y, x, ny , nx ) P (z, y, x, nz , ny , nx ) = Pnz (y, x, ny , nx )z nz + Pnz −1 (y, x, ny , nx )z nz −1 + · · · + P0 (y, x, ny , nx ) node−type = poly var P z exp link dlink link 1 2 exp y - x & üĺÀì ÀÞ¡õ c ° 1389 öŚŞŊ 1 2 y - x - 3 8 3 coef link 1 10 2 8 exp 83 4 x - 1 x - 2 1 1 4 6 3 ÂŮĄČşõŚî üĺÀĂúõ ýùÀØÈœŘć % ŚûÝţþďĄÚóŘ üœŚśõ ø ŚûďŚţąŚĺùćŘć ' & üĺÀì ÀÞ¡õ $ .((x10 + 2x8)y 3 + 3x8 y 2)z 2 + ((x4 + 6x3 )y 4 + 2y)z c ° 1389 öŚŞŊ 1 84 ÂŮĄČşõŚî üĺÀĂúõ ýùÀØÈœŘć % ŚûÝţþďĄÚóŘ üœŚśõ ø ŚûďŚţąŚĺùćŘć ' $ ñŚÞäŘ Print-PList (P ) . ťĺŘ ùÀł ĆţąŚĺ ťĺďć ťÆČó Ćî ÝČĂîüõ ŋÂê 1 p← P 2 X = var[p] . P ýŘĆÜÞŻÀĂİ üÜňŘ ÂČçţõ 3 while p 6= null 4 do if Node-Type(p) = poly 5 then Print ’(’ 6 Print-PList (dlink[p]) 7 Print ’) ^ exp[p]’ 8 else 9 . ŚûĆœĄðùćŘć üţĺďć ŋÂê ŚŞ 10 Print ’+coef [p] X^exp[p]’ 11 p ← link[p] & üĺÀì ÀÞ¡õ c ° 1389 öŚŞŊ 1 85 ÂŮĄČşõŚî üĺÀĂúõ ýùÀØÈœŘć % ŚûÝţþďĄÚóŘ üœŚśõ ø ŚûďŚţąŚĺùćŘć ' $ Depth-PList (P ) . ťĺŘ ùÀł ĆţąŚĺ ťĺďć ťÆČó Ćî ÝČĂîüõ ŋÂê 1 p← P 2 depth ← 0 3 while p 6= null 4 do if Node-Type(p) = poly 5 then dp ← Depth-Plist (dlink[p]) + 1 6 depth ← max{depth, dp} 7 p ← link[p] 8 return depth & üĺÀì ÀÞ¡õ c ° 1389 öŚŞŊ 1 86 ÂŮĄČşõŚî üĺÀĂúõ ýùÀØÈœŘć % ŚûÝţþďĄÚóŘ üœŚśõ ø ŚûďŚţąŚĺùćŘć ' $ ÂðùďŚłŘ ø (thread) ¿œ node−type = poly P dlink z link 2 1 exp 3 y 2 y x 4 1 x 3 8 2 1 coef x & üĺÀì ÀÞ¡õ c ° 1389 öŚŞŊ 1 1 10 2 8 87 x 1 4 6 3 ÂŮĄČşõŚî üĺÀĂúõ ýùÀØÈœŘć % ŚûÝţþďĄÚóŘ üœŚśõ ø ŚûďŚţąŚĺùćŘć ' $ Depth-Threaded-PList (P ) 1 p← P 2 depth ← 0 3 maxdepth ← 0 4 while true 5 do if Node-Type[p] = poly 6 then depth ← depth + 1 7 p ← dlink[p] 8 else while link[p] is a thread 9 do p ← link[p] 10 maxdepth = max{maxdepth, depth} 11 if exp[p] 6= null 12 then p ← exp[p] 13 depth ← depth − 1 14 else return maxdepth 15 if link[p] is pointer 16 then p ← link[p] & üĺÀì ÀÞ¡õ c ° 1389 öŚŞŊ 1 88 ÂŮĄČşõŚî üĺÀĂúõ ýùÀØÈœŘć % ŚûÝţþďĄÚóŘ üœŚśõ ø ŚûďŚţąŚĺùćŘć ' $ üţÈð쌪ÂČè ĆŞ üţÈð쌪 ýŚûÝţþďĄÚóŘ ÛþÀśŮ Procedure A begin Procedure B begin Procedure C begin call C call B return return return ťÈð쌪 ø üœŘĄąŘÂê ďć ĆõŚœÂŞ ñÂţĂî ñŚÖţœŘ & üĺÀì ÀÞ¡õ c ° 1389 öŚŞŊ 1 89 ÂŮĄČşõŚî üĺÀĂúõ ýùÀØÈœŘć % ŚûÝţþďĄÚóŘ üœŚśõ ø ŚûďŚţąŚĺùćŘć ' Û§ŘÂõ $ üœŘĄąŘÂê ÛÞä (1 üœŘĄąŘÂê Œþ ěŘ ťÈð쌪 (2 & üĺÀì ÀÞ¡õ c ° 1389 öŚŞŊ 1 90 ÂŮĄČşõŚî üĺÀĂúõ ýùÀØÈœŘć % ŚûÝţþďĄÚóŘ üœŚśõ ø ŚûďŚţąŚĺùćŘć ' $ (Call) üœŘĄąŘÂê Âû ø (ÂþÁŢğÂţ ĺć ýŚûÂČ ç ţ õ ĆČ Üî ü Üî ť óŚ§ ďć) ü Ü¡õ ýŚûÂČ ç ţ õ ýĆČ Üî ýùÂČ ąč (1 .(Push) ÝţÆČĺ ýĆţÈŢ ďć öŚÈþŚûďŘÀÖõ .(Push) 楳 üõ ÛÖţĂõ ĆţÈŢ ĆŞ ťÈð쌪 ğďćŊ (2 ťĺŘ ßØÞõ ŚûÂţõŘďŚŢ .ćÂČðüõ ŰďĄň (Parameter Passing) ŚûÂţõŘďŚŢ ñŚÖţœŘ ÛÞä (3 .ÀĂłŚŞ (Variable) üĺďćŊ Śþ (Val) üłěďŘ áĄœ ěŘ ÀþÀŻ ýĆþøď ýŘÀţŞŘ ĆŞ (Program Counter ,ĆõŚœÂŞ ýùÀœďŚÞł ŰŚśŹ) ĆõŚœÂŞ ñÂţĂî (4 .ÀĂîüõ ùďŚłŘ & üĺÀì ÀÞ¡õ c ° 1389 öŚŞŊ 1 91 ÂŮĄČşõŚî üĺÀĂúõ ýùÀØÈœŘć % ŚûÝţþďĄÚóŘ üœŚśõ ø ŚûďŚţąŚĺùćŘć ' $ (Return) ťÈð쌪 ÛÞä ëĄê ŰŚČÜÞä ÅØä ďŘ ì öŚ łćĄ ą ďć ø Ć ţ łŘćÂ Ş Ć ţ È Ţ ýĎŚ Ş ćďĄ îď ěŘ Řď ü Ü ¡ õ ýŚ ûÂ Č ç ţ õ ýŚ ûďŘÀ Ö õ (1 .ÝČûćüõ .ÝþďøŊüõ ťĺć ĆŞ ĆţÈŢ ýĎŚŞ ěŘ Řď ťÈð쌪 ğďćŊ (2 .(Pop) ÝþďŘćüõÂŞ ĆţÈŢ ěŘ Řď ćďĄîď ßþÂąŊ (3 .ÝČûćüõ ĆõŘćŘ (2 ÀĂŞ) ťÈð쌪 ğďćŊ ěŘ Řď ĆõŚœÂŞ ñÂţĂî (4 & üĺÀì ÀÞ¡õ c ° 1389 öŚŞŊ 1 92 ÂŮĄČşõŚî üĺÀĂúõ ýùÀØÈœŘć % ŚûÝţþďĄÚóŘ üœŚśõ ø ŚûďŚţąŚĺùćŘć ' $ ñŚůõ Honoi (n, f, t, h) . moving n coins from leg f to leg t with the help of leg h 1 if n = 1 2 then Move the coin from leg f to leg t 3 else Honoi(n − 1, f, h, t) 4 A: Move the coin from leg f to leg t 5 Honoi(n − 1, h, t, f ) 6 B: & üĺÀì ÀÞ¡õ c ° 1389 öŚŞŊ 1 93 ÂŮĄČşõŚî üĺÀĂúõ ýùÀØÈœŘć % ŚûÝţþďĄÚóŘ üœŚśõ ø ŚûďŚţąŚĺùćŘć ' $ Final return Hanoi(3,1,3,2) 1→3 3,1,3,2,A Hanoi(2,1,2,3) (a) 3,1,3,2,B Hanoi(2,2,3,1) 1→2 2,1,2,3,A (b) 3,1,3,2,A Hanoi(1,1,3,2) 1→3 (d) 2→3 2,1,2,3,B 2,2,3,1,A (c) (3) 3,1,3,2,A 3,1,3,2,B Hanoi(1,3,2,1) Hanoi(1,2,1,3) 3→2 2→1 2,2,3,1,B (f) 3,1,3,2,B Hanoi(1,1,3,2) 1→3 .Honoi(3,1,3,2) ďć ÝţÆČĺ ýĆţÈŢ ÂþćŚÖõ ø üţÈð쌪 ýŚûüœŘĄąŘÂê ÓÜţ£õ Û§ŘÂõ & üĺÀì ÀÞ¡õ c ° 1389 öŚŞŊ 1 94 ÂŮĄČşõŚî üĺÀĂúõ ýùÀØÈœŘć % ŚûÝţþďĄÚóŘ üœŚśõ ø ŚûďŚţąŚĺùćŘć ' $ NonRecursive-Honoi (n, f, t) 1 Create-Stack(S) . ťĺŘ üÜ¡õ ýŚûÂČçţõ ýĆÞû ÂþćŚÖõ ø ťÈð쌪 ğďćŊ ÛõŚł S ýĆţÈŢ 2 h ← the other peg 3 Rec-Call: . (üţÈð쌪 üœŘĄąŘÂê Œþ ěŚèŊ) if n = 1 4 then Print f −→ t . ßî ÛÖţĂõ t ýĆÜČõ ĆŞ f ýĆÜČõ ěŘ Řď üþĎŚŞ ýĆØĺ 5 goto Return-Label 6 else Push (S, StackRec(n, f, t, h,’A’)) 7 n, f, t, h ← n − 1, f, h, t . ö楪 üłěďŘ ŋÂê ŚŞ ŚûÂţõŘďŚŢ ñŚÖţœŘ 8 goto Rec-Call 9 Return-Label: if not isEmpty(S) 10 then . 楳üõ ýěŚĺĆČśł ťÈð쌪 ÛÞä ďĄţĺć ßþŘ ěŘ 11 n, f, t, h, return-addrs ← Pop(S) 12 switch 13 case return-addrs = ’A’ 14 do Print f −→ t; Push(S, SRec(n, f, t, h, ‘B‘)) 15 n, f, t, h ← n − 1, h, t, f . ŚûÂţõŘďŚŢ ñŚÖţœŘ 16 goto Rec-Call 17 case return-addrs = ’B’ 18 do goto Return-Label & üĺÀì ÀÞ¡õ c ° 1389 öŚŞŊ 1 95 ÂŮĄČşõŚî üĺÀĂúõ ýùÀØÈœŘć % ŚûÝţþďĄÚóŘ üœŚśõ ø ŚûďŚţąŚĺùćŘć ' $ (Tail Recursion) ťÈð쌪 ßþÂąŊ éÁ§ ýŚ ûďŘÀ Ö õ ěŘ Ć î ýďĄ ţ ĺć ü Î þŘ ł ž Č û ďć öŊ ěŘ À ã Ş Ć î ü ţ È ðěŚ Ş ü œŘĄ ąŘ ê ß þ ąŊ .ÝČþĄÚČõ ťÈð쌪 ßþÂąŊ Řď ćĄÈœ ŘÂŻŘ ,ÀĂî ùćŚÔţĺŘ ŚûÂČçţõ & üĺÀì ÀÞ¡õ c ° 1389 öŚŞŊ 1 96 ÂŮĄČşõŚî üĺÀĂúõ ýùÀØÈœŘć % ŚûÝţþďĄÚóŘ üœŚśõ ø ŚûďŚţąŚĺùćŘć ' .ćÂî éÁ§ ĆţÈŢ ěŘ ùćŚÔţĺŘ öøÀŞ öŘĄŮüõ Řď ťÈð쌪 ßþŘ RecursiveProc (. . . ) ... ... A: RecursiveProc(. . . ) x: $ . this is the last line ýŘÂŻŘø ÀĂîüõ ÂČČçŮ öŚÈþŚûďŘÀÖõ üÜ¡õ ýŚûÂČçţõ (A) üœŘĄąŘÂê ßþŘ ěŘ ťÈð쌪 ďć .ťĺŘ ťÈð쌪 Œþ ŚúĂŮ (x) üóø .楳üõ ñŚśœć (x) ýĆÎÖœ ěŘ ĆõŚœÂŞ & üĺÀì ÀÞ¡õ c ° 1389 öŚŞŊ 1 97 ÂŮĄČşõŚî üĺÀĂúõ ýùÀØÈœŘć % ŚûÝţþďĄÚóŘ üœŚśõ ø ŚûďŚţąŚĺùćŘć ' $ ñŚůõ Honoi (n, f, t, h) . moving n coins from leg f to leg t with the help of leg h 1 if n = 1 2 then Move the coin from leg f to leg t 3 else Honoi(n − 1, f, h, t) 4 A: Move the coin from leg f to leg t 5 Honoi(n − 1, f, h, t) 6 B: & üĺÀì ÀÞ¡õ c ° 1389 öŚŞŊ 1 98 ÂŮĄČşõŚî üĺÀĂúõ ýùÀØÈœŘć % ŚûÝţþďĄÚóŘ üœŚśõ ø ŚûďŚţąŚĺùćŘć ' $ öŘĄąŘÂê ßþÂąŊ éÁ§ Tower-of-Honoi2 (n, f, t, h) . eliminating the last recursion 1 if n = 1 2 then Move the coin from leg f to leg t 3 else Tower-of-Honoi(n − 1, f, h, t) 4 Move the coin from leg f to leg t 5 n, f, h ← n − 1, h, f . parameter passing 6 goto 1 & üĺÀì ÀÞ¡õ c ° 1389 öŚŞŊ 1 99 ÂŮĄČşõŚî üĺÀĂúõ ýùÀØÈœŘć % ŚûÝţþďĄÚóŘ üœŚśõ ø ŚûďŚţąŚĺùćŘć ' $ NonRecursive-Honoi2 (n, f, t) 1 h ← the other peg 2 . make recursive call 3 if n = 1 4 then 5 Move the top coin from leg f to leg t 6 goto 10 7 else Push(S, StackRec(n, f, t, h) 8 n, f, t, h ← n − 1, f, h, t . parameter passing 9 goto 3 10 . end recursive call 11 if not isEmpty(S) 12 then n, f, t, h ← Pop(S) 13 Move the top coin from leg f to leg t 14 n, f, t, h ← n − 1, h, t, f . parameter passing 15 goto 3 & üĺÀì ÀÞ¡õ c ° 1389 öŚŞŊ 1 100 ÂŮĄČşõŚî üĺÀĂúõ ýùÀØÈœŘć %
© Copyright 2025 Paperzz