Multihalmaz, intervallumhalmaz
Halmaz féleségek 1. Halmaz Gyümölcsök: {alma,körte,szilva,barack} 2. Multihalmaz Állatok: {(macska,4),(rigó,2),(galamb,3)} 3. Intervallumhalmaz diszjunkt Óráim: {[8-10],[13-14],[16-20)} 4. Intervallumhalmaz Események: {[9-11],[16-22],[17-18],[20-25]} Zsakó László: Halmazok 2018. 03. 05. 14:25 2/32
Multihalmaz típus ábrázolása Darabszám vektor Multihalmaz(Elemtípus)=Tömb(Min'Elemtípus.. Max'Elemtípus:Egész) Vegyünk fel egy annyi elemből álló sorozatot, amennyi a multihalmaz lehetséges elem fajtáinak száma! Legyen az i. elem x értékű, ha az i. lehetséges elem x-szer van benne van a multihalmazban, illetve 0, ha nincs benne! Zsakó László: Halmazok 2018. 03. 05. 14:25 3/32
Multihalmaz típus ábrázolása Beolvasás(Változó a: Multihalmaz(Elemtípus)): Be: db [a multihalmaz elemszáma] Ciklus i=1-től db-ig Be: érték,multi; a[érték]:=multi Eljárás vége. Műveletigény számítása: A ciklus a multihalmaz elemértékeinek számaszor fut le, azaz a futási idő a multihalmaz elemszámával arányos. A többi elemet azonban 0-ra kell állítani, ha a nyelv nem tudja. Zsakó László: Halmazok 2018. 03. 05. 14:25 4/32
Multihalmaz típus ábrázolása Kiírás(Konstans a: Multihalmaz(Elemtípus)): Ciklus i=min'elemtípus-tól Max'Elemtípus-ig Ha a[i]>0 akkor Ki: i,a[i] Eljárás vége. Műveletigény számítása: A ciklus a multihalmaz elemtípusának számosságaszor fut le, azaz a futási idő a multihalmaz elemeinek maximális számával arányos. Zsakó László: Halmazok 2018. 03. 05. 14:25 5/32
Multihalmaz típus ábrázolása Üres(Változó a: Multihalmaz(Elemtípus)): Ciklus i=min'elemtípus-tól Max'Elemtípus-ig a[i]:=0 Eljárás vége. Műveletigény számítása: A ciklus a multihalmaz elemtípusának számosságaszor fut le, azaz a futási idő a multihalmaz elemeinek maximális számával arányos. Zsakó László: Halmazok 2018. 03. 05. 14:25 6/32
Multihalmaz típus ábrázolása Üres?(konstans a: Multihalmaz(Elemtípus)): i:=min'elemtípus Ciklus amíg i Max'Elemtípus és a[i]=0 i:=i+1 Üres?:=(i>Max'Elemtípus) Eljárás vége. Műveletigény számítása: A ciklus a multihalmaz elemtípusának számosságaszor fut le, azaz a futási idő a multihalmaz elemeinek maximális számával arányos. Zsakó László: Halmazok 2018. 03. 05. 14:25 7/32
Multihalmaz típus ábrázolása Multihalmazba(Változó a: Multihalmaz(Elemtípus), Konstans e: Elemtípus): a[e]:=a[e]+1 Eljárás vége. Műveletigény számítása: Nem függ a multihalmaz elemszámától. Zsakó László: Halmazok 2018. 03. 05. 14:25 8/32
Multihalmaz típus ábrázolása Multihalmazból(Változó a: Multihalmaz(Elemtípus), Konstans e: Elemtípus): Ha a[e]>0 akkor a[e]:=a[e]-1 Eljárás vége. Műveletigény számítása: Nem függ a multihalmaz elemszámától. Zsakó László: Halmazok 2018. 03. 05. 14:25 9/32
Multihalmaz típus ábrázolása eleme(konstans e: Elemtípus, a: Multihalmaz(Elemtípus)): eleme:=a[e]>0 Függvény vége. Műveletigény számítása: Nem függ a multihalmaz elemszámától. Zsakó László: Halmazok 2018. 03. 05. 14:25 10/32
Multihalmaz típus ábrázolása multiplicitás(konstans e: Elemtípus, a: Multihalmaz(Elemtípus)): multiplicitás:=a[e] Függvény vége. Műveletigény számítása: Nem függ a multihalmaz elemszámától. Zsakó László: Halmazok 2018. 03. 05. 14:25 11/32
Multihalmaz típus ábrázolása része(konstans a,b: Multihalmaz(Elemtípus)) i:=min Elemtípus Ciklus amíg i Max Elemtípus és a[i] b[i] i:=i+1 része:=i>max Elemtípus Függvény vége. Műveletigény számítása: A futási idő a multihalmaz elemtípusa számosságával arányos. Zsakó László: Halmazok 2018. 03. 05. 14:25 12/32
Multihalmaz típus ábrázolása unió(konstans a,b: Multihalmaz(Elemtípus)): Ciklus i=min Elemtípus-től Max Elemtípus-ig c[i]:=a[i]+b[i] unió:=c Operátor vége. Műveletigény számítása: A futási idő a multihalmaz elemtípusa számosságával arányos. Zsakó László: Halmazok 2018. 03. 05. 14:25 13/32
Multihalmaz típus ábrázolása max(konstans a,b: Multihalmaz(Elemtípus)): Ciklus i=min Elemtípus-től Max Elemtípus-ig Ha a[i] b[i] akkor c[i]:=a[i] különben c[i]:=b[i] max:=c Operátor vége. Műveletigény számítása: A futási idő a multihalmaz elemtípusa számosságával arányos. Zsakó László: Halmazok 2018. 03. 05. 14:25 14/32
Multihalmaz típus ábrázolása metszet(konstans a,b: Multihalmaz(Elemtípus)): Ciklus i=min Elemtípus-től Max Elemtípus-ig Ha a[i] b[i] akkor c[i]:=b[i] különben c[i]:=a[i] metszet:=c Operátor vége. Műveletigény számítása: A futási idő a multihalmaz elemtípusa számosságával arányos. Zsakó László: Halmazok 2018. 03. 05. 14:25 15/32
Intervallumhalmaz nem diszjunkt intervallumokkal Sok esetben az intervallumhalmaz célja annak megadása, hogy mely elemek nem tartoznak egyetlen intervallumba sem, mely elemek vannak a lehető legtöbb intervallumban,... Ábrázolás Megadhatjuk az intervallumai számát, valamint az egyes intervallumai kezdő- és végpontjait. Vehetünk egy tömböt, amit az intervallumhalmaz lehetséges elemeinek intervallumával indexelünk. A tömb minden elemében azt tároljuk, hogy az adott elem hány intervallumnak eleme. Zsakó László: Halmazok 2018. 03. 05. 14:25 16/32
Intervallumhalmaz nem diszjunkt intervallumokkal Típus IntHalmaz=Rekord( db: Egész, kezd,vég: Tömb(1..Maxdb,egész)) A halmaz beolvasása egyszerű: Be: IH.db Ciklus i=1-től IH.db-ig Be: IH.kezd[i],IH.vég[i] Ha azonban ezek után arra lennénk kíváncsiak, hogy egy [a,b] intervallum mely elemei nem tartoznak egy intervallumba sem, Zsakó László: Halmazok 2018. 03. 05. 14:25 17/32
Intervallumhalmaz nem diszjunkt intervallumokkal akkor pl. az alábbi megoldást választhatnánk: db:=0 Ciklus i=a-tól b-ig j:=1 Ciklus amíg j IH.db és (IH.kezd[j]>i vagy IH.vég[j]<i) j:=j+1 Ha j>ih.db akkor db:=db+1 A futási idő (b-a+1)* az intervallumok száma. Zsakó László: Halmazok 2018. 03. 05. 14:25 18/32
Ábrázolás Intervallumhalmaz nem diszjunkt intervallumokkal Vehetünk egy tömböt, amit az intervallumhalmaz lehetséges elemeinek intervallumával indexelünk. A tömb minden elemében azt tároljuk, hogy az adott elem hány intervallumnak eleme. Zsakó László: Halmazok 2018. 03. 05. 14:25 19/32
Intervallumhalmaz nem diszjunkt intervallumokkal Típus IntHalmaz=Tömb(Min Elem..Max Elem,egész) A halmaz beolvasása sokkal lassúbb: Be: db; IH:=(0,...,0) Ciklus i=1-től db-ig Be: kezd,vég Ciklus j=kezd-től vég-ig IH[j]:=IH[j]+1 Zsakó László: Halmazok 2018. 03. 05. 14:25 20/32
Intervallumhalmaz nem diszjunkt intervallumokkal Ha azonban ezek után arra lennénk kíváncsiak, hogy egy [a,b] intervallum mely elemei nem tartoznak a halmaz egy intervallumába sem, akkor pl. az alábbi megoldást választhatnánk: db:=0 Ciklus i=a-tól b-ig Ha IH[i]=0 akkor db:=db+1; x[db]:=i A futási idő (b-a+1). Zsakó László: Halmazok 2018. 03. 05. 14:25 21/32
Intervallumhalmaz nem diszjunkt intervallumokkal Sok további feladat megoldható ezzel az ábrázolással, pl: a leghosszabb intervallum, amely nem fedi át a halmaz egy intervallumát sem, egy adott elem maximum hány intervallumban lehet benne, azon intervallumok száma, amelyek maximális számú elemet tartalmaznak, azon intervallumok, amelyek elemei a halmaz pontosan egy intervallumának elemei. Zsakó László: Halmazok 2018. 03. 05. 14:25 22/32
Ábrázolás Intervallumhalmaz nem diszjunkt intervallumokkal Vehetünk egy tömböt, amit az intervallumhalmaz lehetséges elemeinek intervallumával indexelünk. A tömb minden elemében azt tároljuk, hogy az adott elem hánnyal több intervallumnak eleme, mint az előző elem. Zsakó László: Halmazok 2018. 03. 05. 14:25 23/32
Intervallumhalmaz nem diszjunkt intervallumokkal Típus IntHalmaz=Tömb(Min Elem..Max Elem,egész) A halmaz beolvasása úja gyors: Be: db; IH:=(0,...,0) Ciklus i=1-től db-ig Be: kezd,vég IH[kezd]:=IH[kezd]+1 IH[vég+1]:=IH[vég+1]-1 Zsakó László: Halmazok 2018. 03. 05. 14:25 24/32
Intervallumhalmaz nem diszjunkt intervallumokkal Ha azonban ezek után arra lennénk kíváncsiak, hogy egy [a,b] intervallum mely elemei nem tartoznak a halmaz egy intervallumába sem, akkor pl. az alábbi megoldást választhatnánk: db:=0; S:=0; Ciklus i=a-tól b-ig S:=S+IH[i] Ha S=0 akkor db:=db+1 Ha S<0 akkor db:=0 A futási idő (b-a+1). Zsakó László: Halmazok 2018. 03. 05. 14:25 25/32
Intervallumhalmaz Intervallumhalmaz típus ábrázolása Elemei: diszjunkt intervallumok, növekvő sorrendben. Műveletei: beolvasás, kiírás, üresre állítás, üres-e?, eleme, unió, metszet, különbség. Típus IntHalmaz=Rekord( db: Egész, kezd,vég: Tömb(1..maxdb,Egész)) Beolvasása a kezd és vég tömbök beolvasása, kiírása pedig ezen tömbök kiírása. Zsakó László: Halmazok 2018. 03. 05. 14:25 26/32
Intervallumhalmaz típus ábrázolása Eleme(a,IH): e:=1; u:=ih.db; k:=(e+u)/2 Ciklus amíg e u és (a<ih.kezd[k] vagy b>ih.vég[k]) Ha a<ih.kezd[k] akkor u:=k-1 különben e:=k+1 k:=(e+u)/2 Eleme:=e u Függvény vége. Logaritmikus keresés elve. Zsakó László: Halmazok 2018. 03. 05. 14:25 27/32
Intervallumhalmaz típus ábrázolása Metszet(IH,JH): i:=1; j:=1; k:=0 Ciklus amíg i IH.db és j JH.db Elágazás IH.vég[i]<JH.kezd[j] esetén i:=i+1 JH.vég[j]<IH.kezd[i] esetén j:=j+1 egyéb esetben k:=k+1 KH.kezd[k]:=max(IH.kezd[i],JH.kezd[j]) KH.vég[k]:=min(IH.vég[i],JH.vég[j])... Zsakó László: Halmazok 2018. 03. 05. 14:25 28/32
Intervallumhalmaz típus ábrázolása... Elágazás IH.vég[i]<JH.vég[j] esetén i:=i+1 IH.vég[i]>JH.vég[j] esetén j:=j+1 egyéb esetben i:=i+1; j:=j+1 Elágazás vége KH.db:=k metszet:=kh Függvény vége. Összefutattás elve. Zsakó László: Halmazok 2018. 03. 05. 14:25 29/32
Intervallumhalmaz típus ábrázolása Unió(IH,JH): i:=1; j:=1; k:=1; Végükre őrző elem KH.kezd[k]:=min(IH.kezd[i],JH.kezd[j]) Ciklus amíg i IH.db+1 és j JH.db+1 Elágazás IH.vég[i]<JH.kezd[j] esetén KH.vég[k]:=IH.vég[i]; i:=i+1; k:=k+1 KH.kezd[k]:=min(IH.kezd[i],JH.kezd[j]) JH.vég[j]<IH.kezd[i] esetén KH.vég[k]:=JH.vég[j]; j:=j+1; k:=k+1 KH.kezd[k]:=min(IH.kezd[i],JH.kezd[j])... Zsakó László: Halmazok 2018. 03. 05. 14:25 30/32
Intervallumhalmaz típus ábrázolása... IH.vég[i]<JH.vég[j] esetén i:=i+1 IH.vég[i]>JH.vég[j] esetén j:=j+1 egyéb esetben KH.vég[k]:=JH.vég[j]; j:=j+1; i:=i+1; k:=k+1 KH.kezd[k]:=min(IH.kezd[i],JH.kezd[j]) Elágazás vége KH.db:=k-1 Unió:=KH Függvény vége. Összefutattás elve. Zsakó László: Halmazok 2018. 03. 05. 14:25 31/32
Multihalmaz, intervallumhalmaz