2024. május 25., szombat

Halmazok megvalósítása

Halmazok

Probléma:

Halmaz megadható-e tömbbel?
Elmélet:
Mind a tömb, mind a halmza elemekből áll.

A tömbben minden elem többször szerepelhet és a sorrend számít.
Halmaz esetén minden elem csak egyszer szerepelhet és a sorrend nem számít.

A sorrendbeliség nem lényegi szempont, viszont az elemek előfordulásának száma fontos dolog.
Megoldás:
    let A = [1,2,3]; 
Megjegyzés:
Ha minden elem, csak egyszer szerepel egy tömbben, akkor az halmaznak tekinthető.

Jelölés:
A halmazokat az abc nagy betűibel szokás jelölni, a tömbök nevei viszont kis betűvel kezdődnek.

Probléma:

Hogyan lehet sorbarendezni az elemeket?
Elmélet:
1. Ha csak egyjegyű számok szerepelnek: sort() használható.
2. Ha egy és többjegyű számok is szerepelnek: a-b visszatérési értékű függvényparaméter használata.
3. Ha ékezetes betűk is szerepelnek: a.localeCompare(b) visszatérési értékű függvényparaméter használata.
    let A = [3,2,1,4].sort();
    let B = [3,2,1,4].sort(function (a, b){return a-b});
    let B = [3,2,1,4].sort(function (a, b){return a.localeCompare(b)});

Probléma:

Eleme-e egy adott dolog egy halmaznak?
Megoldás:
    tomb.includes(elem);
Megjegyzés:
Eredmény true vagy false logikai érték lesz.

Probléma:

Két halmaz egyenlő-e?
Elmélet:
Két halmaz egyenlő, ha a két halmaz ugyanannyi elemből áll és az egyik halmaz elemei mind megtalálhatók a másik halmazban.
Megoldás:
let A = [1,2,3];
let B = [1,2];
let C = [3,2,1];

function egyenloE(a,b){
    let res = true;
    if(a.length == b.length){
        for(let e of a){
            if(!b.includes(e)){res = false; break;}
        }
    } else{
        res = false;
    }
    return res;
}
Megjegyzések:
- Az eredmény itt is true vagy false logikai érték lesz.
- Ha sorbarendezett a tömb:
function egyenloE(a,b){
    let res = true;
    if(a.length == b.length){
        for(let i in a){
            if(a[i] != b[i]){res = false; break;}
        }
    } else {
        res = false;
    }
    return res;
}

Probléma:

Az egyik halmaz tartalmazza-e a másikat?
Megoldás:
function tartalmazzaE(a,b){
    let res = true;
    for(let e of b){
        if(!a.includes(e)){res = false; break;}
    }
    return res;
}
Megjegyzések:
- A paraméterek sorrendje fontos, nem mindegy ugyanis, hogy A tartalmazza B-t, vagy B tratalmazza A-t.
- Ha A tartalmazza B-t és B is tartalamazza A-t, akkor a két halmaz egyenlő.
function egyenloE(a,b){
    return tartalmazzaE(a,b) && tartalmazzaE(b,a);
}

Probléma:

Melyek egy halmaz komplementere (külső elemei) egy másik (bővebb) halmazra vonatkozóan?
Elmélet:
A komplementerének az elemei olyan B halmazbeli elemek, amelyek nem elemei A halmaznak.
Megoldás:
function komplementere(a,b){
    let res = [];
    for(let e of b){
        if(!a.includes(e)){res.push(e);}
    }
    return res;
}

Probléma:

Milyen közös elemei vannak két halmaznak (vagyis mi lesz két halmaz metszete)?
Elmélet:
A és B metszete olyan A halmazbeli elemekből áll, amelyek B halmaznak is elemei.
Megoldás:
function metszete(a,b){
    let res = [];
    for(let e of a){
        if(b.includes(e)){res.push(e);}
    }
    return res;
}
Megjegyzés:
Ha két halmaz metszete üres, akkor diszjunkt halmazokról beszélünk.

Probléma:

Mi lesz két halmaz különbsége?
Elmélet:
Az A \ B halmaznak az elemei az A halmaznak azon elemei, amelyek B halmaznak nem elemei.
Megoldás:
function kulonbsege(a,b){
    let res = [];
    for(let e of a){
        if(!b.includes(e)){res.push(e);}
    }
    return res;
}
Megjegyzés:
A különbségénél számít a sorrend.

Probléma:

Mi lesz két halmaz uniója?
Elmélet:
Két halmaz uniója A halmaz összes eleméhez hozzávesszük B azon elemeit, amelyeket A nem tartalmaz!
Megoldás:
function unioja(a,b){
    let res = a.slice();
    for(let e of b){
        if(!a.includes(e)){res.push(e);}
    }
    return res;
}

Probléma:

Hogyan lehet halmazzá alakítani egy ismétlődéseket tartalmazó tömböt?
Elmélet: Az adott tömbből többféleképpen szűrhetjük ki az ismétlődéseket:
1. A tömb elemeit páronként összehasonlítjuk, és ami már szerepelt azt kidobjuk.
2. Az üres tömböt bővítjük a tömb olyan elemeivel, amik még nem szerepeltek.

1. megoldás:
function halmaz(t){
    let len = t.length;
    for(let i = 0; i < len; i++) {
        for(let j = i + 1; j < len; j++) {
            if(t[j] == t[i]){t.splice(j,1);j--;len--;}
        }
    }    
    return t;
}

2. megoldás:
function halmaz(t){
    let h = [];
    let ind = 0;
    while(ind < t.length){
        if (!h.includes(t[ind])){h.push(t[ind]);}
        ind++;
    };
    return h;
}
Megjegyzés:
1. A második megoldást felhasználhatjuk az unióképzéshez.
function unioja(a,b){
    let ab = a.concat(b);
    res = halmaz(ab);
    return res;
}
2. A második megoldást felhasználhatjuk a szavakból képzett betűhalmazok képzéséhez.
function wordCharSet(a){
    return halmaz(a.split(''));
}

Probléma:

Hogyan lehet véletlen számokból álló halmazt létrehozni?
Elmélet:
Szükség van egy véletlenszám generáló függvényre.
Induljunk ki egy üres halmazból és egészítsük ki olyan elemekkel, amelyek még nem szerepeltek.
Csináljuk mindezt addig, amíg nem az elemszám egyenlő nem lesz az adott értékkel.
Ha túl szűk tartományt adunk meg akkor baj van, amit kezelnünk kell.
function rndNumSet(min, max, len){
    let res = [];
    if(max-min+1 >= len){
        let ind = 0;
        let ai;
        while(ind < len){
            ai = rnd(min,max);
            if(!res.includes(ai)){
                res.push(ai); ind++;
            }
        }
    }
    return res;
}
function rnd(min,max){
    return (Math.floor(Math.random()*(max-min+1)) + min);
}
Megjegyzés:
Ez felhasználható véletlen, betűkből álló halmazok képzésére.
function rndCharSet(len){
    let res = [];
    let abc_t = ["a","b","c","d","e","f","g","h","e","f",
        "g","h","i","j","k","l","m","n","o","p","q","r",
        "s","t","u","v","w","x","y","z"];
    let abc_t_len = abc_t.length;
    let ind_t = rndNumSet(0,abc_t_len-1,len);
    for(let e of ind_t){
        res.push(abc_t[e]);
    }
    return res;
}