Halmaz, multihalmaz
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/51
Halmaz típus Értékhalmaz: Az alaphalmaz (amely az Elemtípus által van meghatározva) iteráltja ( mely elemek lehetnek benne a halmazban ). Az Elemtípus általában valamely véges diszkrét típus lehet, legtöbbször még az elemszámát is korlátozzák (<256). Ha nyelvi elemként nem létezik, akkor a megvalósításunkban lehet nagyobb elemszámú is. Nyelvi megvalósítás: STL Standard Template Library Zsakó László: Halmazok 2018. 03. 05. 14:25 3/51
Halmaz típus Műveletek metszet ( ) unió ( ) különbség ( ) komplemens eleme (egy elem benne van-e a halmazban) ( ) része (egyik halmaz részhalmaza-e a másiknak) ( ) Zsakó László: Halmazok 2018. 03. 05. 14:25 4/51
Halmaz típus Műveletek Halmazba (elem hozzá vétele egy halmazhoz): H:=H e} Halmazból (elem elhagyása egy halmazból): H:=H e} Beolvasás (halmaz beolvasása) Kiírás (halmaz kiírása), Üres (üres halmaz létrehozás eljárás), vagy Üres'Halmaztípus előre definiált konstans Üres? (logikai értékű függvény). Zsakó László: Halmazok 2018. 03. 05. 14:25 5/51
Halmaz típus ábrázolása Elemek felsorolása Halmaz(Elemtípus)=Rekord(db: Egész, elem: Tömb(1..MaxDb:Elemtípus)) A halmaz elemeinek felsorolásával adjuk meg a halmazt, annyi elemű tömbben, ahány elemű éppen a halmaz (pontosabban az első db darab elemében). Zsakó László: Halmazok 2018. 03. 05. 14:25 6/51
Halmaz típus ábrázolása Beolvasás(Változó a: Halmaz(Elemtípus)): Be: a.db [a halmaz elemszáma] Ciklus i=1-től a.db-ig Be: a.elem[i] Eljárás vége. Feltesszük, hogy a bemenetben minden elem egyszer van. A ciklus a halmaz elemeinek számaszor fut le, azaz a futási idő a halmaz elemszámával arányos. Zsakó László: Halmazok 2018. 03. 05. 14:25 7/51
Halmaz típus ábrázolása Kiírás(Konstans a: Halmaz(Elemtípus)): Ki: a.db [a halmaz elemszáma] Ciklus i=1-től a.db-ig Ki: a.elem[i] Eljárás vége. A ciklus a halmaz elemeinek számaszor fut le, azaz a futási idő a halmaz elemszámával arányos. Zsakó László: Halmazok 2018. 03. 05. 14:25 8/51
Halmaz típus ábrázolása Üres(Változó a: Halmaz(Elemtípus)): a.db:=0 Eljárás vége. Nem függ a halmaz elemszámától. Üres?(Konstans a: Halmaz(Elemtípus)): Üres?:=(a.db=0) Függvény vége. Nem függ a halmaz elemszámától. Zsakó László: Halmazok 2018. 03. 05. 14:25 9/51
Halmaz típus ábrázolása Halmazba(Változó a: Halmaz(Elemtípus), Konstans e: Elemtípus): i:=1 Ciklus amíg i a.db és a.elem[i] e i:=i+1 Ha i>a.db akkor a.db:=a.db+1; a.elem[a.db]:=e Eljárás vége. A ciklus a halmaz elemeinek számaszor fut le, azaz a futási idő a halmaz elemszámával arányos. Zsakó László: Halmazok 2018. 03. 05. 14:25 10/51
Halmaz típus ábrázolása Halmazból(Változó a: Halmaz(Elemtípus), Konstans e: Elemtípus): i:=1 Ciklus amíg i a.db és a.elem[i] e i:=i+1 Ha i a.db akkor a.elem[i]:=a.elem[a.db] a.db:=a.db-1 Eljárás vége. A ciklus a halmaz elemeinek számaszor fut le, azaz a futási idő a halmaz elemszámával arányos. Zsakó László: Halmazok 2018. 03. 05. 14:25 11/51
Halmaz típus ábrázolása eleme(konstans e:elemtípus,a:halmaz(elemtípus)): i:=1 Ciklus amíg i a.db és e a.elem[i] i:=i+1 eleme:=i a.db Függvény vége. A ciklus a halmaz elemeinek számaszor fut le, azaz a futási idő a halmaz elemszámával arányos. Zsakó László: Halmazok 2018. 03. 05. 14:25 12/51
Halmaz típus ábrázolása része(konstans a,b: Halmaz(Elemtípus)): i:=1 Ciklus amíg i a.db és eleme(a.elem[i],b) i:=i+1 része:=i>a.db Függvény vége. A ciklus az A halmaz elemszámaszor fut le, az eleme függvény pedig a B halmaz elemszámaszor, azaz a futási idő a két halmaz elemszámának szorzatával arányos. Zsakó László: Halmazok 2018. 03. 05. 14:25 13/51
Halmaz típus ábrázolása unió(konstans a,b: Halmaz(Elemtípus)): c:=a Ciklus i=1-től b.db-ig Ha nem eleme(b.elem[i],a) akkor Halmazba(c,b.elem[i]) unió:=c Operátor vége. A külső ciklus a B halmaz elemszámaszor fut le, az eleme függvény pedig az A halmaz elemszámaszor, azaz a futási idő a két halmaz elemszámának szorzatával arányos. Zsakó László: Halmazok 2018. 03. 05. 14:25 14/51
Halmaz típus ábrázolása metszet(konstans a,b: Halmaz(Elemtípus)): c.db:=0 Ciklus i=1-től a.db-ig Ha eleme(a.elem[i],b) akkor Halmazba(c,a.elem[i]) metszet:=c Operátor vége. A ciklus az A halmaz elemszámaszor fut le, az eleme pedig legrosszabb esetben a B halmaz elemszámaszor, azaz a futási idő a két halmaz elemszámának szorzatával arányos. Zsakó László: Halmazok 2018. 03. 05. 14:25 15/51
Halmaz típus ábrázolása Megjegyzések: A megoldás alapvető problémája, hogy sehol sem ellenőrizhető, hogy a halmazban valóban csak a benne előfordulható elemek vannak. Az így ábrázolt halmazok elemtípusára semmilyen megkötést nem kell tennünk, hiszen egy tömbben bármilyen elem elhelyezhető. Arra sincs korlátozás, hogy mekkora lehet az alaphalmaz elemszáma, amiből a halmaz elemei származnak. Csak annyi a megkötésünk, hogy a konkrét halmazok elemszámát korlátozzuk. Zsakó László: Halmazok 2018. 03. 05. 14:25 16/51
Halmaz típus ábrázolása Bittérkép logikai vektor Halmaz(Elemtípus)=Tömb(Min'Elemtípus.. Max'Elemtípus:Logikai) A halmazt {igaz,hamis} elemekből álló vektorként értelmezzük, ahol indexként használjuk az elem típusú értéket. Az ilyen halmaz mindig rendezett halmaz. Zsakó László: Halmazok 2018. 03. 05. 14:25 17/51
Halmaz típus ábrázolása Beolvasás(Változó a: Halmaz(Elemtípus)): Be: N [a halmaz elemszáma] Üres(a) Ciklus i=1-től N-ig Be: e; a[e]:=igaz Eljárás vége. A ciklus a halmaz elemeinek számaszor fut le, azaz a futási idő a halmaz elemszámával arányos. Zsakó László: Halmazok 2018. 03. 05. 14:25 18/51
Halmaz típus ábrázolása Kiírás(Konstans a: Halmaz(Elemtípus)): Ciklus i=min'elemtípus-tól Max'Elemtípus-ig Ha a[i] akkor Ki: i Eljárás vége. A ciklus a halmaz lehetséges elemeinek számaszor fut le, azaz a futási idő a halmaz elemtípusának számosságával arányos. Mi lenne, ha tárolnánk a halmaz legkisebb és legnagyobb elemét is? Zsakó László: Halmazok 2018. 03. 05. 14:25 19/51
Halmaz típus ábrázolása Üres(Változó a: Halmaz(Elemtípus)): Ciklus i=min'elemtípus-tól Max'Elemtípus-ig a[i]:=hamis Eljárás vége. A ciklus a halmaz lehetséges elemeinek számaszor fut le, azaz a futási idő a halmaz elemtípusának számosságával arányos. Zsakó László: Halmazok 2018. 03. 05. 14:25 20/51
Halmaz típus ábrázolása Üres?(Konstans a: Halmaz(Elemtípus)): i:=min'elemtípus Ciklus amíg i Max'Elemtípus és nem a[i] i:=i+1 Üres?:=(i>Max'Elemtípus) Függvény vége. A ciklus a halmaz lehetséges elemeinek számaszor fut le, azaz a futási idő a halmaz elemtípusának számosságával arányos. Zsakó László: Halmazok 2018. 03. 05. 14:25 21/51
Halmaz típus ábrázolása Halmazba(Változó a: Halmaz(Elemtípus), Konstans e: Elemtípus): a[e]:=igaz Eljárás vége. Nem függ a halmaz elemszámától. Zsakó László: Halmazok 2018. 03. 05. 14:25 22/51
Halmaz típus ábrázolása Halmazból(Változó a: Halmaz(Elemtípus), Konstans e: Elemtípus): a[e]:=hamis Eljárás vége. Nem függ a halmaz elemszámától. Zsakó László: Halmazok 2018. 03. 05. 14:25 23/51
Halmaz típus ábrázolása eleme(konstans e:elemtípus,a:halmaz(elemtípus)): eleme:=a[e] Függvény vége. Nem függ a halmaz elemszámától. Zsakó László: Halmazok 2018. 03. 05. 14:25 24/51
Halmaz típus ábrázolása része(konstans a,b: Halmaz(Elemtípus)): i:=min'elemtípus Ciklus amíg i Max'Elemtípus és nem (a[i] és nem b[i]) i:=i+1 része:=i>max'elemtípus Függvény vége. A ciklus a halmaz lehetséges elemeinek számaszor fut le, azaz a futási idő a halmaz elemtípusának számosságával arányos. Zsakó László: Halmazok 2018. 03. 05. 14:25 25/51
Halmaz típus ábrázolása unió(konstans a,b: Halmaz(Elemtípus)): Ciklus i=min'elemtípus-tól Max'Elemtípus-ig c[i]:=a[i] vagy b[i] unió:=c Operátor vége. A ciklus a halmaz lehetséges elemeinek számaszor fut le, azaz a futási idő a halmaz elemtípusának számosságával arányos. Zsakó László: Halmazok 2018. 03. 05. 14:25 26/51
Halmaz típus ábrázolása metszet(konstans a,b: Halmaz(Elemtípus)): Ciklus i=min'elemtípus-tól Max'Elemtípus-ig c[i]:=a[i] és b[i] metszet:=c Operátor vége. A ciklus a halmaz lehetséges elemeinek számaszor fut le, azaz a futási idő a halmaz elemtípusának számosságával arányos. Zsakó László: Halmazok 2018. 03. 05. 14:25 27/51
Halmaz típus ábrázolása Megjegyzések: Ennél az ábrázolásnál szigorú megkötés az, hogy a halmaz lehetséges elemei indexként használhatók legyenek! Emiatt így például nem definiálható síkbeli pontok halmaza, szavak halmaza, Ha azonban a halmaz egy véges sokaságból veszi fel az elemeit, akkor ezek egy tömbbe elhelyezhetők és a továbbiakban ezen tömb indexeivel ábrázolhatjuk a halmazt! Zsakó László: Halmazok 2018. 03. 05. 14:25 28/51
Halmaz típus ábrázolása STL set halmazosztály: Műveletei: üres? üres eleme Halmazba Halmazból elemszám min Zsakó László: Halmazok 2018. 03. 05. 14:25 29/51
Multihalmaz típus Értékhalmaz: Az alaphalmaz (amely az Elemtípus és egy darabszám által van meghatározva) iteráltja ( mely elem hányszoros multiplicitással van benne a multihalmazban ). Példa: Állatok: {(macska,4),(rigó,2),(galamb,3)} Zsakó László: Halmazok 2018. 03. 05. 14:25 30/51
Multihalmaz típus Műveletek metszet ( ) (értékek metszete, multiplicitások minimuma) unió ( ) (értékek uniója, multiplicitások összege) max (értékek uniója, multiplicitások maximuma), különbség ( ) (értékek különbsége, multiplicitások különbsége; nincs benne egy elem, ha a multiplicitások különbsége 1-nél kisebb) Zsakó László: Halmazok 2018. 03. 05. 14:25 31/51
Multihalmaz típus Műveletek eleme (egy elem benne van-e a multihalmazban) ( ) benne (egy elem legalább adott multiplicitással benne van-e a multihalmazban) multiplicitás (egy elem hányszoros multiplicitással van benne a multihalmazban) része (egyik multihalmaz részhalmaza-e a másiknak) ( ) mindközös? (a két multihalmaz az elemek multiplicitásától eltekintve azonos-e) Zsakó László: Halmazok 2018. 03. 05. 14:25 32/51
Multihalmaz típus Műveletek Multihalmazba (elem hozzávétele egy multihalmazhoz): H:=H e,1} Multihalmazból (elem elhagyása egy multihalmazból): H:=H e,1} Beolvasás (multihalmaz beolvasása) Kiírás (multihalmaz kiírása), Üres (üres multihalmaz létrehozás eljárás), vagy üres? (logikai értékű függvény). Zsakó László: Halmazok 2018. 03. 05. 14:25 33/51
Multihalmaz típus ábrázolása Elemek felsorolása Típus Halmazelem=Rekord(érték: Elemtípus, multi: Egész) Multihalmaz(Elemtípus)=Rekord(db: Egész, elem: Tömb(1..MaxDb:Halmazelem)) Egy felsorolásként adjuk meg a multihalmazt, annyi elemű tömbben, ahány elemű éppen a multihalmaz (pontosabban az első db darab elemében). Zsakó László: Halmazok 2018. 03. 05. 14:25 34/51
Multihalmaz típus Példa Típus Fajta=Rekord(érték: Szöveg, multi: Egész) Állomány=Multihalmaz(Fajta) Változó A: Állomány A:=Állomány(("nyúl",3),("kecske",5)) Zsakó László: Halmazok 2018. 03. 05. 14:25 35/51
Multihalmaz típus ábrázolása Beolvasás(Változó a: Multihalmaz(Elemtípus)): Be: a.db [a multihalmaz elemszáma] Ciklus i=1-től a.db-ig Be: a.elem[i].érték,a.elem[i].multi Eljárás vége. A ciklus a multihalmaz elemértékeinek számaszor fut le, azaz a futási idő a multihalmaz elemszámával arányos. Zsakó László: Halmazok 2018. 03. 05. 14:25 36/51
Multihalmaz típus ábrázolása Kiírás(Konstans a: Multihalmaz(Elemtípus)): Ki: a.db [a multihalmaz elemszáma] Ciklus i=1-től a.db-ig Ki: a.elem[i].érték,a.elem[i].multi Eljárás vége. A ciklus a multihalmaz elemértékeinek számaszor fut le, azaz a futási idő a multihalmaz elemszámával arányos. Zsakó László: Halmazok 2018. 03. 05. 14:25 37/51
Multihalmaz típus ábrázolása Üres(Változó a: Multihalmaz(Elemtípus)): a.db:=0 Eljárás vége. Nem függ a multihalmaz elemszámától. üres?(konstans a: Multihalmaz(Elemtípus)): Üres?:=(a.db=0) Eljárás vége. Nem függ a multihalmaz elemszámától. Zsakó László: Halmazok 2018. 03. 05. 14:25 38/51
Multihalmaz típus ábrázolása Multihalmazba(Változó a: Multihalmaz(Elemtípus), Konstans e: Elemtípus): i:=1 Ciklus amíg i a.db és a.elem[i].érték e i:=i+1 Ha i a.db akkor a.elem[i].multi:=a.elem[i].multi+1 különben a.db:=a.db+1; a.elem[a.db].érték:=e a.elem[a.db].multi:=1 Eljárás vége. Arányos a multihalmaz elemszámával. Zsakó László: Halmazok 2018. 03. 05. 14:25 39/51
Multihalmaz típus ábrázolása Multihalmazból(Változó a: Multihalmaz(Elemtípus), Konstans e: Elemtípus): i:=1 Ciklus amíg i a.db és a.elem[i].érték e i:=i+1 Ha i a.db akkor Ha a.elem[i].multi=1 akkor a.elem[i]:=a.elem[a.db]; a.db:=a.db-1 különben a.elem[i].multi:=a.elem[i].multi-1 Eljárás vége. Arányos a multihalmaz elemszámával. Zsakó László: Halmazok 2018. 03. 05. 14:25 40/51
Multihalmaz típus ábrázolása eleme(konstans e: Elemtípus, a: Multihalmaz(Elemtípus)): i:=1 Ciklus amíg i a.db és e a.elem[i].érték i:=i+1 eleme:=i a.db Függvény vége. Arányos a multihalmaz elemszámával. Zsakó László: Halmazok 2018. 03. 05. 14:25 41/51
Multihalmaz típus ábrázolása multiplicitás(konstans e: Elemtípus, a: Multihalmaz(Elemtípus)): i:=1 Ciklus amíg i a.db és e a.elem[i].érték i:=i+1 Ha i a.db akkor multiplicitás:=a.elem[i].multi különben multiplicitás:=0 Függvény vége. Arányos a multihalmaz elemszámával. Zsakó László: Halmazok 2018. 03. 05. 14:25 42/51
Multihalmaz típus ábrázolása benne(konstans e: Halmazelem, a: Multihalmaz(Elemtípus)): i:=1 Ciklus amíg i a.db és e.érték a.elem[i].érték i:=i+1 benne:=i a.db és e.multi a.elem[i].multi Függvény vége. Arányos a multihalmaz elemszámával. Zsakó László: Halmazok 2018. 03. 05. 14:25 43/51
Multihalmaz típus ábrázolása része(konstans a,b: Multihalmaz(Elemtípus)) i:=1 Ciklus amíg i a.db és benne(a.elem[i],b) i:=i+1 része:=i>a.db Függvény vége. A külső ciklus az A, a benne műveletben levő belső ciklus a B multihalmaz elemszámaszor fut le, azaz a futási idő a két multihalmaz elemszáma szorzatával arányos. Zsakó László: Halmazok 2018. 03. 05. 14:25 44/51
Multihalmaz típus ábrázolása unió(konstans a,b: Multihalmaz(Elemtípus)): c:=a Ciklus i=1-től b.db-ig j:=1 Ciklus amíg j a.db és b.elem[i].érték a.elem[j].érték j:=j+1... Zsakó László: Halmazok 2018. 03. 05. 14:25 45/51
Multihalmaz típus ábrázolása... Ha j>a.db akkor c.db:=c.db+1 c.elem[c.db]:=b.elem[i] különben c.elem[j].multi:=c.elem[j].multi+ b.elem[i].multi unió:=c Operátor vége. A külső ciklus az A, a belső ciklus a B multihalmaz elemszámaszor fut le, azaz a futási idő a két multihalmaz elemszáma szorzatával arányos. Zsakó László: Halmazok 2018. 03. 05. 14:25 46/51
Multihalmaz típus ábrázolása max(konstans a,b: Multihalmaz(Elemtípus)): c:=a Ciklus i=1-től b.db-ig j:=1 Ciklus amíg j a.db és b.elem[i].érték a.elem[j].érték j:=j+1... Zsakó László: Halmazok 2018. 03. 05. 14:25 47/51
Multihalmaz típus ábrázolása... Ha j>a.db akkor c.db:=c.db+1 c.elem[c.db]:=b.elem[i] különben ha b.elem[i].multi>c.elem[j].multi akkor c.elem[j].multi:=b.elem[i].multi max:=c Operátor vége. A külső ciklus az A, a belső ciklus a B multihalmaz elemszámaszor fut le, azaz a futási idő a két multihalmaz elemszáma szorzatával arányos. Zsakó László: Halmazok 2018. 03. 05. 14:25 48/51
Multihalmaz típus ábrázolása metszet(konstans a,b: Multihalmaz(Elemtípus)): c.db:=0 Ciklus i=1-tõl a.db-ig j:=1 Ciklus amíg j b.db és b.elem[j].érték a.elem[i].érték j:=j+1... Zsakó László: Halmazok 2018. 03. 05. 14:25 49/51
Multihalmaz típus ábrázolása... Ha j b.db akkor c.db:=c.db+1; c.elem[c.db]:=a.elem[i] Ha b.elem[j].multi<a.elem[i].multi akkor c.elem[c.db].multi:=b.elem[j].multi metszet:=c Operátor vége. A külső ciklus az A, a belső ciklus a B multihalmaz elemszámaszor fut le, azaz a futási idő a két multihalmaz elemszáma szorzatával arányos. Zsakó László: Halmazok 2018. 03. 05. 14:25 50/51
Halmaz, multihalmaz