Muuttujilla X1, ...,Xn on joukko yhtäsuuruusehtoja muotoa " Xi = Xj " ja erisuuruusehtoja muotoa
" Xi erisuuri Xj ".
Kysymys: Onko kaikki ehdot mahdollista saada voimaan samanaikaisesti?
Esitä tehtävälle tehokas ratkaisualgoritmi.
(PS erisuuruusmerkkiä ei saanut kopioiduksi)
ratkaisualgoritmi halutaan
opeta minua
4511
0Äänestä
Muut lukivat myös
Odottaa vastausta
Näihin keskusteluihin ei ole vielä vastattu. Ole ensimmäinen.
Vastaukset 4
Vanhimmat
Haluan kyllä lisätietoja muuttujien määrästä ja ehtojen joukkojen koosta...
Tehtävä oli siinä.
Tee nxn matriisi A, täytä luvuilla 0. Käy läpi säännöt. Jos sääntö on "Xi=/=Xj" niin tarkista onko Aij=0 tai -1, jos on niin aseta Aij=-1 ja Aji=-1 Muutoin ilmoita "Ratkaisu mahdoton" Jos sääntö on "Xi=Xj" tarkista onko Aij=-1 jos on niin ilmoita ratkaisu mahdoton. Muutoin aseta Aij=1, Aji=1 ja käy läpi sarake j ja jos Akj=1, niin aseta Aik=1 ja Aki=1 mikäli ne ovat 0 tai 1 muutoin ilmoita "Ei ratkaisua" Käy läpi rivi i ja jos Aik=1 niin aseta Ajk=1, Akj=1 mikäli ne ovat 0 tai 1 muutoin "Ei ratkaisua" Eli sinulla on koko ajan symmetrinen matriisi. Jossa arvoja 0, 1 tai -1. O ei tietoa, 1 =, -1 erisuuruus alkioiden välillä.
Muuten hyvä, mutta ottaakohan tuo tarpeeksi huomioon yhtäsuuruuden transitiivisuutta eli että jos A=B, B=C, C=D, niin A=D? Ensimmäisen kertaluvun transitiivisuus eli A=B, B=C => A=C tuossa taidetaan huomioida. Varmemmin menisi ehkä algoritmilla: 1. Käy läpi yhtäsuuruussäännöt Xi=Xj ja aseta aina Aij = Aji = 1. 2. Laske transiivinen sulkeuma vaikkapa Warshallin algoritmilla (ks. google). 3. Käy läpi säännöt Xi=/=Xj ja varmista, että kaikki vastaavat Aij ovat nollia. Tämä on kyllä aika tehoton algoritmi, koska Warshall on O(n^3), jossa n on erilaisten Xi-alkoiden määrä. Riippuen vähän ehtojen ja alkioiden määrien suhteesta tehokkaampi tapa voi olla laskea ekvivalenssiluokat yhtäsuurusrelaatiolle ja tarkistaa että erisuuruudet kuuluvat eri luokkiin: 1. Merkitse kaikki yhtäsuuruusparit Xi=Xj union-find-rakenteessa (ks. google) ekvivalenteiksi. 2. Käy läpi kaikki parit Xi=/=Xj ja tarkista, että ne kuuluvat eri ekvivalenssiluokkiin. Tämä on aika paljon tehokkaampi algoritmi, en kyllä muista kompleksisuutta ulkoa.