Bináris mátrix megvalósítása

A mátrixok egy speciális fajtája az, ahol a mátrixelemek csak 0 vagy 1 értéket vehetnek fel. Az ilyen mátrixoknak több elnevezése ismert: bináris mátrix, logikai mátrix, relációs mátrix, vagy (0,1) mátrix.

A bináris mátrixoknak számos alkalmazási területe van, többek között például: gráfok szomszédsági mátrixa, relációk jellemzése, kétszínű képek (pl. xbm típusú képfájlok) leírása, valamint olyan játékoknál, ahol a játékmező táblázatos, és az érdemi információt az jelenti, hogy egy adott cellában van-e valami vagy nincs (pl.: aknakereső, torpedó játék).

Mivel a bináris mátrix elemei csak két értéket vehetnek fel, ezért a mátrixot le lehet írni egy listával is, ha a sor- és oszlopindexeket megfeleltetjük a listaindexeknek. Ez azért jó, mert a listát és összes elemét nem kell tárolni, hiszen elegendő a csak a listaindexeket. Mivel a listaindexek egyediek, ezért azok tárolására egy halmaz megfelelő. Ha a bináris mátrix ritka mátrix, vagyis jóval több a 0, mint az 1 értékű elem, akkor ezzel a módszerrel a mátrix a memóriaigény szempontjából hatékony tárolható. Mindezt szemléletesen mutatja a következő ábra:

A bináris mátrix e reprezentációját alkalmazva a megvalósító osztály definíciója alább látható. Az egyes metódusok logikája nem túl bonyolult, a megértést a kommentek segítik.

Alkalmazási példaként használjuk e BinaryMatrix osztályt egyszerű, súlyozatlan, irányított vagy írányítatlan gráfok szomszédsági mátrixának előállítására. Ehhez definiálunk egy AdjacencyMatrix nevű osztályt, amely a BinaryMatrix osztályt örökli. A szomszédsági mátrix ugyanis bináris mátrix, de négyzetes mátrix, vagyis a AdjacencyMatrix konstruktora csak egyetlen mátrixdimenziót fogad.

A szomszédsági mátrix ismeretében elő lehet állítani a szomszédsági listát, pontosabban annak szótárral való megvalósítását. Ezt külön függvényben is meg lehet tenni, vagy az AdjacencyMatrix egy metódusaként is, ahogy azt az előbb osztálydefinícióban tettük, hiszen ekkor a szomszédsági mátrix példány mint első argumentum (self) eleve rendelkezésre áll.

Mivel a szomszédsági mátrix és a szomszédsági szótár között egyértelmű a megfeleltetés, azaz egyikből a másik származtatható, valósítsuk meg a fordított konverziót is. Ehhez az adjacency_dict_to_matrix() nevű függvényt definiáltuk, ami tehát egy szomszédsági szótár alapján előállítja a szomszédsági mátrixot.

Teszteljük le az eddigi alkotásainkat! A teszteredmények helyes működést igazolnak vissza:

A teszteseteket vizuálisan a következő ábra mutatja:

E feladatban nyelvi szempontból az osztályok létrehozása, öröklése és a speciális metódusok (mágikus metódusok) alkalmazása volt a fókuszban. Ezekkel részletesen a Python tudásépítés lépésről lépésre című e-könyv „Osztály vigyázz! – típuslétrehozás osztályokkal”, „Öröklődés”, és „Mágikus metódusok egyedi igényre szabott osztályokban” fejezetei foglalkoznak.

Érdekel a Python tudásépítés lépésről lépésre az alapoktól az első asztali alkalmazásig című e-könyv.