HÀNG ĐỢI

Embed Size (px)

Citation preview

HNG I Cng nh ngn xp, hng i l CTDL tuyn tnh. Hng i l mt danh sch cc i tng, mt u ca danh sch c xem l u hng i, cn u kia ca danh sch c xem l ui hng i. Vi hng i, chng ta ch c th xen mt i tng mi vo ui hng v loi i tng u hng ra khi hng. Trong chng ny chng ta s nghin cu cc phng php ci t hng i v trnh by mt s ng dng ca hng i. 7.1 KIU D LIU TRU TNG HNG I

Trong mc ny chng ta s c t KDLTT hng i. Chng ta c th xem mt hng ngi ng xp hng ch c phc v (chng hn, xp hng ch mua v tu, xp hng ch giao dch ngn hng, ) l mt hng i, bi v ngi ra khi hng v c phc v l ngi ng u hng, cn ngi mi n s ng vo ui hng. Hng i l mt danh sch cc i tng d liu, mt trong hai u danh sch c xem l u hng, cn u kia l ui hng. Chng hn, hng i c th l danh sch cc k t (a, b, c, d), trong a ng u hng, cn d ng ui hng. Chng ta c th thc hin cc php ton sau y trn hng i, trong cc php ton Q l mt hng i, cn x l mt i tng cng kiu vi cc i tng trong hng Q. 1. Empty(Q). Hm tr v true nu hng Q rng v false nu khng. 2. Enqueue(x, Q). Thm i tng x vo ui hng Q. 3. Dequeue(Q). Loi i tng ng u hng Q. 4. GetHead(Q). Hm tr v i tng ng u hng Q, cn hng Q th khng thay i. V d. Nu Q = (a, b, c, d) v a u hng, d ui hng, th khi thc hin php ton Enqueue(e, Q) ta nhn c Q = (a, b, c, d, e), vi e ng ui hng, nu sau thc hin php ton Dequeue(Q), ta s c Q = (b, c, d, e) v b tr thnh phn t ng u hng. Vi cc php ton Enqueue v Dequeue xc nh nh trn th i tng vo hng trc s ra khi hng trc. V l do m hng i c gi l cu trc d liu FIFO (vit tt ca cm t First- In First- Out). iu ny i lp vi ngn xp, trong ngn xp i tng ra khi ngn xp l i tng sau cng c t vo ngn xp. Hng i s c s dng trong bt k hon cnh no m chng ta cn x l cc i tng theo trnh t FIFO. Cui chng ny chng ta s trnh by mt ng dng ca hng i trong m phng mt h phc v. Nhng trc ht chng ta cn nghin cu cc phng php ci t hng i. Cng nh ngn xp, chng ta c th ci t hng i bi mng hoc bi DSLK. 7.2 CI T HNG I BI MNG hng i bi mng. Song ci xp. Nh li rng, khi ci cc phn t ca danh sch ca mng, cn on sau ca

Cng nh ngn xp, chng ta c th ci t t hng i bi mng s phc tp hn ngn t danh sch (hoc ngn xp) bi mng th (hoc ngn xp) s c lu trong on u

mng l khng gian cha s dng n. Chng ta c th lm nh th vi hng i c khng? Cu tr li l c, nhng khng hiu qu. Gi s chng ta s dng mng element lu cc phn t ca hng i, cc phn t ca hng i c lu trong cc thnh phn mng element[0], element[1], , element[k] nh trong hnh 7.1a. Vi cch ny, phn t u hng lun lun c lu trong thnh phn mng element[0], cn phn t ui hng c lu trong element[k], v do ngoi mng element ta ch cn mt bin tail ghi li ch s k. thm phn t mi vo ui hng, ta ch cn tng ch s tail ln 1 v t phn t mi vo thnh phn mng element[tail] . Song nu mun loi phn t u hng, chng ta cn chuyn ln trn mt v tr tt c cc phn t c lu trong element[1],, element[tail] v gim ch s tail i 1, v nh vy tiu tn nhiu thi gian. element 0 SIZE 1 tail (a) element 0 SIZE 1 head tail (b) 1 2 3 4 5 6 1 2 3 4

5 8 4 3 2

6 0

7

9

0 head

1 SIZE 1 tail (c) Hnh 7.1. Cc phng php ci t hng i bi mng

khc phc nhc im ca phng php trn, chng ta lu cc phn t ca hng i trong mt on con ca mng t ch s u head ti ch s ui tail,tc l cc phn t ca hng i c lu trong cc thnh phn mng element[head], element[head + 1], , element[tail], nh trong hnh 7.1b. Vi cch ci t ny, ngoi mng element, chng ta cn s dng hai bin: bin ch s u head v bin ch s ui tail. loi phn t u hng chng ta ch cn tng ch s head ln 1. Chng ta c nhn xt rng, khi thm phn t mi vo ui hng th ch s tail tng, khi loi phn t u hng th ch s head tng, ti mt thi im no hng i s chim on cui ca mng, tc l bin tail nhn gi tr SIZE 1 ( SIZE l c ca mng). Lc ta khng th thm phn t mi vo ui hng, mc du khng gian cha s dng trong mng, on u ca mng t ch s 0 ti head 1, c th cn rt ln! gii quyt vn ny, chng ta cun mng thnh vng trn, nh c minh ho trong hnh 7.1c. Trong mng vng trn, chng ta xem thnh phn tip theo thnh phn element[SIZE - 1] l thnh phn element[0]. Vi mng vng trn, khi thm phn t mi vo ui hng, nu ch s tail c gi tr l SIZE 1, ta t tail = 0 v lu phn t mi trong thnh phn mng element[0]. Tng t khi phn t u hng c lu trong element[SIZE - 1], th loi n, ta ch cn t head = 0. Do , nu ci t hng i bi mng vng trn, th php ton thm phn t mi vo ui hng khng thc hin c ch khi mng thc s y, tc l khi trong mng khng cn thnh phn no cha s dng. Sau y chng ta s nghin cu s ci t hng i bi mng vng trn. KDLTT hng i s c ci t bi lp Queue, y l lp khun ph thuc tham bin kiu Item, trong Item l kiu ca cc phn t trong hng i. Lp Queue cha cc bin thnh phn no? Cc phn t ca hng i c lu trong mng vng trn c cp pht ng, do cn c bin con tr element tr ti thnh phn u tin ca mng , bin size lu c ca mng, bin ch s u head v bin ch s ui tail. Ngoi cc bin trn, chng ta thm vo mt bin length lu di ca hng i

(tc l s phn t trong hng i). Lp Queue c nh ngha nh trong hnh 7.2. template class Queue { public : Queue (int m = 1); // Hm kin to hng i rng vi dung lng l m, // m nguyn dng (tc l c mng ng l m). Queue (const Queue & Q) ; // Hm kin to copy. ~ Queue( ) // Hm hu. { delete [ ] element ; } Queue & operator = (const Queue & Q); // Ton t gn. // Cc hm thc hin cc php ton hng i : bool Empty( ) const ; // Kim tra hng c rng khng. // Postcondition: hm tr v true nu hng rng v false nu khng rng { return length = = 0 ; } void Enqueue (const Item & x) // Thm phn t mi x vo ui hng. // Postcondition: x l phn t ui hng. Item & Dequeue( ); // Loi phn t u hng. // Precondition: hng khng rng. // Postcondition: phn t u hng b loi khi hng v hm tr v // phn t . Item & GetHead( ) const ; // Precondition: hng khng rng. // Postcondition: hm tr v phn t u hng, nhng hng vn // gi nguyn. private: Item * element ; int size ; int head ; int tail ; int length ; } ; Hnh 7.2. Lp hng i c ci t bi mng. By gi chng ta nghin cu s ci t cc hm thnh phn ca lp Queue. Hm kin to hng rng vi sc cha l m. Chng ta cn cp pht mt mng ng element c c l m. V hng rng, nn gi tr ca bin length l 0. Cc ch s u head v ch s ui tail cn c gi tr no? Nh li rng khi cn thm phn t x vo ui hng, ta tng bin tail ln 1 v t element[tail] = x.

cho thao tc ny lm vic trong mi hon cnh, k c trng hp hng rng, chng ta t head = 0 v tail = -1 khi kin to hng rng. Do , hm kin to c ci t nh sau: template Queue :: Queue (int m) { element = new Item[m] ; size = m ; head = 0 ; tail = -1 ; length = 0 ; } Hm mi mt cc Hm kin to copy. Hm ny thc l bn sao ca mt hng i mng ng mi c c bng c d liu t i tng Q sang kin to copy c vit nh hin nhim v kin to ra mt hng i c Q. Do chng ta cn cp pht ca mng trong Q v tin hnh sao chp i tng mi. sau:

template Queue :: Queue (const Queue & Q) { element = new Item[Q.size] ; size = Q.size ; head = Q.head ; tail = Q.tail ; length = Q.length ; for (int i = 0 ; i < length ; i + + ) element [(head + i) % size] = Q.element [(head + i) % size] ; } Trong hm trn, vng lp for thc hin sao chp mng trong Q sang mng mi k t ch s head ti ch s tail, tc l sao chp length thnh phn mng k t ch s head. Nhng cn lu rng, trong mng vng trn, thnh phn tip theo thnh phn vi ch s k, trong cc trng hp k size 1, l thnh phn vi ch s k + 1. Song nu k = size 1 th thnh phn tip theo c ch s l 0. V vy, trong mi trng hp thnh phn tip theo thnh phn vi ch s k l thnh phn vi ch s (k + 1) % size. Ton t gn c ci t tng t nh hm kin to copy: template Queue & Queue :: operator = (const Queue & Q) { if ( this != Q ) { delete [ ] element ; element = new Item[Q.size] ; size = Q.size ; head = Q.head ;

tail = Q.tail ; length = Q.length ; for (int i = 0 ; i < length ; i + + ) element [(head + i) % size] = Q.element[(head + i) % size] ; } return * this ; } Hm xen phn t mi vo ui hng c ci t bng cch t phn t mi vo mng vng trn ti thnh phn ng ngay sau thnh phn element[tail], nu mng cha y. Nu mng y th chng ta cp pht mt mng mi vi c ln hn (chng hn, vi c gp i c mng c), v sao chp d liu t mng c sang mng mi, ri hu mng c, sau t phn t mi vo mng mi. template void Queue :: Enqueue (const Item & x) { if (length 0) ; // Kim tra hng khng rng. Item data = element[head] ; if (length = = 1) // Hng c mt phn t. { head = 0 ; tail = -1 ; } else head = (head + 1) % size ; length - - ; return data ;

} template Item & Queue :: GetHead( ) { assert (length > 0) ; return element[head] ; } D dng thy rng, khi ci t hng i bi mng vng trn th cc php ton hng i: xen phn t mi vo ui hng, loi phn t u hng v truy cp phn t u hng ch i hi thi gian O(1). Ch tr trng hp mng y, nu mng y th xen phn t mi vo ui hng chng ta mt thi gian sao chp d liu t mng c sang mng mi vi c ln hn, do thi gian thc hin php ton thm vo ui hng trong trng hp ny l O(n), n l s phn t trong hng. Tuy nhin trong cc ng dng, nu ta nh gi c s ti a cc phn t trong hng v la chn s lm dung lng m ca hng i khi khi to hng i, th c th m bo rng tt c cc php ton hng i ch cn thi gian O(1). 7.3 CI T HNG I BI DSLK

Cng nh ngn xp, chng ta c th ci t hng i bi DSLK. Vi ngn xp, chng ta ch cn truy cp ti phn t nh ngn xp, nn ch cn mt con tr ngoi top tr ti u DSLK (xem hnh 6.3). Nhng vi hng i, chng ta cn phi truy cp ti c phn t u hng v phn t ui hng, v vy chng ta cn s dng hai con tr ngoi: con tr head tr ti thnh phn u DSLK, ti lu phn t u hng, v con tr tail tr ti thnh phn cui cng ca DSLK, ti lu phn t ui hng, nh trong hnh 7.3a. Mt cch tip cn khc, chng ta c th ci t hng i bi DSLK vng trn vi mt con tr ngoi tail nh trong hnh 7.3b. head tail

.. (a)

tail

...

(b) Hnh 7.3. (a) Ci t hng i bi DSLK vi hai con tr ngoi. (b) Ci t hng i bi DSLK vng trn. Trong mc 5.4, chng ta nghin cu cch ci t danh sch bi DSLK, KDLTT danh sch c ci t bi lp LList. Cc php ton hng i ch l cc trng hp ring ca cc php ton danh sch: xen phn t mi vo ui hng c ngha l xen n vo ui danh sch, cn loi phn t u hng l loi phn t v tr u tin trong danh sch. Do chng ta c th s dng lp LList (xem hnh 5.12) ci t lp hng i Queue. Chng ta c th xy dng lp Queue bng cch s dng lp LList lm lp c s vi dng tha k private, hoc cng c th xy dng lp Queue l lp ch cha mt thnh phn d liu l i tng ca lp LList. c gi nn ci t lp Queue theo cc phng n trn, xem nh bi tp. Cc php ton hng i l rt n gin, nn chng ta s ci t lp Queue trc tip, khng thng qua lp LList. Sau y chng ta s ci t hng i bi DSLK vng trn vi con tr ngoi tail (hnh 7.3b). KDLTT hng i c ci t bi lp khun ph thuc tham bin kiu Item (Item l kiu ca cc phn t trong hng i). Lp Queue ny c nh ngha trong hnh 7.4. Lp ny cha cc hm thnh phn c khai bo hon ton ging nh lp trong hnh 7.2, ch tr hm kin to mc nh lm nhim v khi to hng rng. Lp ch cha mt thnh phn d liu l con tr tail. template class Queue { public : Queue( ) // Hm kin to hng i rng. { tail = NULL ; } Queue (const Queue & Q) ; ~ Queue( ) ; Queue & operator = (const Queue & Q) ; bool Empty( ) const {return tail = = NULL ; } void Enqueue (const Item & x) ; Item & Dequeue( ) Item & GetHead( ) const ; private : struct Node {

Item data ; Node * next ; Node (const Item & x) {data = x; next = NULL ; } } Node * tail ; void MakeEmpty( ) ; // Hm hu DSLK vng trn tail. } ; Hnh 7.4. Lp hng i c ci t bi DSLK vng trn. By gi chng ta ci t cc hm thnh phn ca lp Queue trong hnh 7.4. Chng ta a vo lp Queue hm MakeEmpty, nhim v ca n l thu hi vng nh cp pht cho cc thnh phn ca DSLK tail lm cho DSLK ny tr thnh rng. Hm MakeEmpty l hm thnh phn private, n c s dng ci t hm hu v ton t gn. Hm MakeEmpty c ci t nh sau: template void Queue :: MakeEmpty( ) { while (tail ! = NULL) { Node* next ;Ptr = tail if (Ptr = = tail) // DSLK ch c mt thnh phn. tail = NULL ; else next ; next = Ptr tail delete Ptr ; } } Hm hu c ci t bng cch gi hm MakeEmpty: template Queue :: ~ Queue( ) { MakeEmpty( ) ; } Hm kin to copy. template Queue :: Queue (const Queue & Q) { tail = NULL ; * this = Q ; } Ton t gn.

template Queue & Queue:: operator =(const Queue & Q) { if (this ! = & Q) { MakeEmpty( ) ; if (Q.Empty( )) return *this ; next ;Node * Ptr = Q.tail do { data) ;Enqueue (Ptr next ;Ptr = Ptr } next) ;while (Ptr ! = Q.tail } return *this ; } Hm thm phn t mi vo ui hng: template void Queue :: Enqueue (const Item & x) { if (Empty( )) { tail = new Node(x) ; next = tail ;tail } else { Node * next ;Ptr = tail next = new Node(x) ;tail = tail next = Ptr ;tail } } Hm loi phn t u hng: template Item & Queue :: Dequeue( ) { Item headElement = GetHead( ) ; Node * next ;Ptr = tail if (Ptr ! = tail) next ; next = Ptr tail else tail = NULL ; delete Ptr ; return headElement ; }

Hm tm phn t u hng: template Item & Queue :: GetHead( ) { assert (tail ! = NULL) ; return data ; next tail } 7.4 M PHNG H SP HNG

M phng (simulation) l mt trong cc lnh vc p dng quan trng ca my tnh. Mc ch ca mt chng trnh m phng l m hnh ho s hot ng ca mt h hin thc (h tn ti trong t nhin hoc h do con ngi sng to ra) nhm phn tch nh gi hiu nng ca h hoc a ra cc tin on c th ci tin (i vi cc h do con ngi lm ra) hoc c th a ra cc bin php phng nga, ch ng (i vi cc h tn ti trong t nhin). Chng ta c th quan nim mt h hin thc bao gm cc thc th (cc thnh phn) ph thuc ln nhau, chng hot ng v tng tc vi nhau thc hin mt nhim v no . V vy, lp chng trnh nh hng i tng l cch tip cn thch hp nht xy dng cc chng trnh m phng. Chng ta c th biu din mi thnh phn trong h bi mt lp i tng cha cc bin m t trng thi ca thc th, s tng tc gia cc thnh phn ca h c m phng bi s truyn thng bo gia cc i tng. Di y chng ta s xt mt v d: xy dng chng trnh m phng mt h sp hng (h phc v), tc l h vi cc hng i c phc v theo nguyn tc ai n trc ngi c phc v trc, chng hn, h cc quy giao dch ngn hng, h cc ca bn v tu nh ga. Trng hp n gin nht, h sp hng ch c mt ngi phc v v mt hng i, nh c ch ra trong hnh 7.5a. Tng qut hn, mt h sp hng c th gm k hng i v s ngi phc v, nh trong 7.5b.

hng i (a)

ngi phc v (PV)

hng 1

hng 2

. .

hng k (b) Hnh 7.5 (a) H sp hng n gin (b) H sp hng vi k hng i, s ngi phc v. Sau y chng ta xt trng hp n gin nht: h ch c mt hng i cc khch hng v mt ngi phc v. Chng ta s m phng s hot ng ca h ny trong khong thi gian T (tnh bng pht, chng hn), k t thi im ban u t = 0. Trong khong thi gian 1 pht c th c khch hng n hoc khng, chng ta khng th bit trc c. Song gi thit rng, chng ta c cho bit xc sut p: xc sut trong khong thi gian 1 pht c khch hng n. Trong trng hp tng qut, thi gian phc v dnh cho mi khch hng chng ta cng khng bit trc c, v thi gian phc v cc khch hng khc nhau cng khc nhau, chng hn thi gian phc v cc khch hng ngn hng. cho n gin, chng ta gi thit rng thi gian phc v mi khch hng l nh nhau v l s (pht) (chng hn nh mt trm ra xe t ng, n ra sch mi xe ht 5 pht). Nh vy, chng ta bit cc thng tin sau y: 1. Xc sut trong thi gian 1 pht c khch n l p (0 p 1), (chng ta gi thit rng trong 1 pht ch c nhiu nht mt khch hng n) 2. Thi gian phc v mi khch hng l s pht. Chng trnh m phng cn thc hin cc nhim v sau: nh gi s khch hng c phc v. nh gi thi gian trung bnh m mi khch hng phi ch i. xy dng c chng trnh m phng h sp hng c mt hng i v mt ngi phc v vi cc gi thit nu trn, chng ta cn to ra hai lp: lp cc khch hng, v lp ngi phc v. Lp cc khch hng ng nhin l lp hng i Queue m chng ta ci t (lp trong hnh 7.2, hoc 7.4). Vn m chng ta cn gii quyt y l biu din cc khch hng nh th no? Chng ta khng cn quan tm ti cc thng tin v khch hng nh tn, tui, gii tnh, ; vi cc nhim v ca chng trnh m phng nu trn, chng ta ch cn quan tm ti thi im m khch hng n v vo hng i. V vy, chng ta s biu din mi khch hng bi thi im t m khch hng vo hng i, t l s nguyn dng. V do , trong chng trnh, chng ta ch cn khai bo: Queue customer ;

By gi chng ta thit k lp ngi phc v ServerClass. Ti mi thi im, ngi phc v c th ang bn phc v mt khch hng, hoc khng. V vy ch trng thi (bn hay khng bn) ca ngi phc v,

chng ta a vo lp mt bin time-left, bin ny ghi li thi gian cn li m ngi phc v cn lm vic vi khch hng ang c phc v. Khi bt u phc v mt khch hng bin time-left c gn gi tr l thi gian phc v. Ngi phc v bn c ngha l time-left > 0. Ti mi thi im t khi ngi phc v tip tc lm vic vi mt khch hng, bin time-left s gim i 1. Khi m time-left nhn gi tr 0 c ngha l ngi phc v ri, c th phc v khch hng tip theo. Lp ngi phc v c khai bo nh sau: class ServerClass { public: ServerClass (int s) // Khi to ngi phc v ri vi thi gian // phc v mi khch hng l s. { server-time = s; time-left = 0 ; } bool Busy( ) const // Ngi phc v c bn khng? { return time-left > 0 ; } void Start( ) // Bt u phc v mt khch hng. { time-left = server-time ; } void Continue( ) // Tip tc lm vic vi khch hang. { if (Busy( )) time-left - - ; } private : int server-time ; // Thi gian phc v mi khch hng. int time-left ; } Ti y chng ta c th thit k chng trnh m phng. Hm m phng cha cc bin u vo sau: Thi gian phc v mi khch hng: s Xc sut khch hng n: p Thi gian m phng: T Cc bin u ra: S khch hng c phc v: count Thi gian ch i trung bnh ca khch hng: wait-time. Hm m phng s m t s hot ng ca h sp hng bi mt vng lp: ti mi thi im t ( t = 1, 2, , T), nu c khch hng n th a n vo hng i, nu ngi phc v bn th cho h tip tc lm vic; ri sau kim tra xem, nu hng i khng rng v ngi phc v ri th cho khch hng u hng ra khi hng v ngi phc v bt u phc v khch hng . Hm m phng c ni dung nh sau: void Queueing_System_Simulation (int s, double p, int T, int & count, int & wait-time) { Queue customer ; // Hng i cc khch hng. ServerClass server(s) ; // Ngi phc v. void QueueEntry( int t) ; // Hm lm nhim v a khch hng n (nu c) ti thi im t // vo hng i. int t ; // Bin ch thi im, t = 1, 2, , T int sum = 0 ; // Tng thi gian ch i ca khch hng. count = 0 ;

for (t = 1; t < = T ; t + +) { QueueEntry(t) ; // a khch hng (nu c) vo hng i. if (server.Busy( )) server.Continue( ) ; else if ( ! customer.Empty( )) { int t1 = customer.Dequeue( ); server.Start( ) ; sum + = t t1 ; count + + ; } } wait-time = sum / count ; } By gi chng ta cn ci t hm QueueEntry. Hm ny c nhim v a ra quyt nh ti thi im t c khch hng n hay khng v nu c th a khch hng vo ui hng i. Chng ta bit trc xc sut trong khong thi gian 1 pht c khch hng n l p. V vy chng ta s dng hm rand( ) sinh ra s nguyn ngu nhin trong khong t 0 ti RAND- MAX. (Hm rand( ) v hng s RAND-MAX c trong th vin chun stdlib.h.). Ti mi thi im t (t = 1, 2, ), chng ta gi hm rand( ) sinh ra mt s nguyn ngu nhin, nu s nguyn ny nh hn p * RAND-MAX th chng ta cho rng ti thi im c khch hng n. void QueueEntry(int t) { if (rand( ) < p * RAND-MAX) customers.Enqueue(t) ; }