Állásinterjú feladat : egymástól függő elemek rendezése
3 Comments Published by feri február 10th, 2008 in Nincs kategorizálvaSziasztok,
Egy enyhén sznob magyar cégnél voltam állásinterjún, és a következő feladatot adták, melyre pár napom van. Azt szeretném kérdezni, hogy valaki hozzá tudna -e egy algoritmust, esetleg egy konkrét implementációt adni az egymástól függő elemek rendezésére?
Köszönöm,
Mericles
Függőség
Adott elemek egy halmaza. Az elemek között értelmezve van egy függőségi reláció (tranzitív, nem reflexív, nem szimmetrikus). Minden elemhez hozzárendelhető egy halmaz, mely az adott elem közvetlen függőségeit tartalmazza. Egy adott A elem közvetve függ a B elemtől, ha létezik egy olyan C elem, melytől az A elem közvetlenül függ, továbbá a
B elem közvetve vagy közvetlenül függ a C elemtől. Minden elem rendelkezik egy egyedi névvel, mely név a programozási nyelvekben szokásos azonosító fogalomnak megfelelő feltételeknek tesz eleget (az angol abc betűit és számokat tartalmazhat és betűvel kezdődik, továbbá különbség van a kis és nagy betűk között).
Előállítandó az elemek olyan rendezése, melyre teljesül hogy egyik elem sem előzi meg egyik közvetett vagy közvetlen függőségét sem !
Elvárások:
- Az elkészítendő program egy futtatható .jar file, mely a teszt adatokat a standard input periférián várja, az eredményeket a standard output perifériára, az esetleges hibajelzéseket pedig a standard error perifériára írja.
- Input formátum
- white space karakterek bárhol előfordulhatnak (kivéve név belsejében), nincs szerepük az inputban, egyszerűen figyelmen kívül hagyandóak
- egy elem formátuma: (itemName, {dependency1Name, dependency2Name, … })
- amennyiben az adott elemnek nincs függősége, úgy a függőség halmaz egy üres halmaz:
(itemName, { })
- az input itemek sorozata (közöttük opcionálisan white space karakterekkel):
(item1, {})(item9, {item4, item5}) (item5, {item3}) …
- Output formátum: az elemek nevei a feladat kiírásnak megfelelő sorrendben, egymástól szóközzel elválasztva:
item1 item3 item5 item4 item9
- A feladat megoldásának tartalmaznia kell az alábbi két interface implementálását. Az Items implementációja
lehetőleg különböző Item implementációkkal is képes legyen együttműködni.
public interface Item
{
String getName();
String setName(String value);
Set getDirectDependencies();
}
public interface Items extends Map
{
Iterator dependencyIterator();
void load(Reader input) throws IOException, ParseException;
void save(Writer output) throws IOException;
}
- A megoldást .zip formátumban kell elküldeni, mely minimálisan tartalmaz egy src (.java források) egy dist(futtatható .jar file) és egy test (junit tesztek) könyvtárat, valamint egy build.xml filet (ant build file).
Nem sznobok.
Szerintem aranyos feladat. Nem olvastam végig a bejegyzéseidet, nem tudom, milyen szinten vagy. Építs egy gráfot (mondom egyszerűen, nem vedd sértésnek).
Legyen a függőségi rendszer:
1-
9-4 5
5-3
3-6 2
2-1
7-1 4
Írj egy pöttyöt, mellé egyest. Újabb pötty, mellette kilences, belőle két nyíl négyeshez, ötöshöz (újabb két pont), stb., legvégül ismételten újabb pont, a hetes, ebből nyíl az egyeshez és négyeshez.
Közben (folyamatosan) tartsd nyílván a ,,gyökér elemeket”, azaz azokat a pontokat, amikbe nem megy nyíl (ez most 7,9).
Ezután menj végig a gyökér elemeken (mindegy, hogyan alakult a sorrendjük eddig), írd le a számot, satírozd le a pontot és a nyilat, és ha a gyerek gyökérré vált, vedd fel a gyökérlista végére.
7 9 4 5 3 6 2 1
Végül fordítsd meg a listát. Ennyi. Persze, ha fordítva csinálod a nyilakat (Javasan referenciákat), nem kell fordítgatni.
Ha helyesen voltak megadva az adatok, minden pont ki lesz írva, hiszen vagy gyökér, vagy elérhető egy gyökérből kiindulva. Egyetlen kivétel: ha rosszak voltak az adatok, azaz a gráfodban van kör (1->3->6->1), akkor a végén kapsz pontokat, hogy egyik sem gyökér, így “A függőségi rendszer nem körmentes, nem sorbarendezhető” hibaüzenettel elszállhatsz.
Ugyanaz a másik irányban: Végigmész a listán, minden elemhez létrehozol egy struktúrát:
név -> [ kiírva (boolean), függőségek(list) ]
1) Ha a függőségek listája üres, kiírod az elemet, és beállítod az attribútumot
2) Ha függ. lista nem üres, végigmész a listán, és ha találsz olyan elemet, ami (létezik, és) ki van már írva, kitörlöd a listából.
Ezt a kettőt ismételgeted minden elemre.
Amire figyelni kell:
- Ha kör van a függőségi gráfban: visszaérsz az első elemhez, de nem történt semmi változás (célszerű nyílvántartani egy változóban)
- Ha olyan elemre hivatkozik, ami nincs is: hamar kiderül…
Na, ennyi. Ne felejtsd el leírni, hogy sikerült-e megoldani a feladatot, vagy feleslegesen törtem magam.
By, fmate14.
Klasszikus…
http://en.wikipedia.org/wiki/Topological_sorting
Úgy tűnik, nem vetted komolyan a kérdésfeltevést.