BME Villamosmérnöki és Informatikai Kar
Műszaki informatika szak |
Nappali tagozat
2006/2007. tanév, tavaszi félév
|
ts = [t0, t1, ...,
tz-1]
szólista és egy k
egész, ahol a
z
≥ 0
a szólista hossza, a k ≥
1
egész pedig a szólistában lévő szavak maximális átfedésének
mértéke. A szólistában nincsenek ismétlődő szavak.
Jelöljük az m ≥ 0
hosszú u
szót
alkotó karaktersorozatot a következőképpen: u0
u1
... um-1
.
Az u
és v
szavakat, amelyek hossza rendre
m
és n
, h-átfedőnek nevezzük, ha h
≥ 1
, és a következő feltételek mind teljesülnek:
um-h = v0
, um-h+1 =
v1
, ..., um-1 =
vh-1
. Ilyenkor azt is mondjuk, hogy az u
a
v
-vel h-átfedésben van.
Legfeljebb k helyen átfedőnek vagy röviden max-k-átfedőnek
nevezzük azokat a ts
-beli ti
és
tj
szavakat, amelyekhez van olyan h
egész 1 ≤ h ≤ k
mellett, hogy ti
utolsó h
karaktere megegyezik tj
első
h
karakterével, azaz ti
tj
-vel h-átfedésben van.
Szóláncnak nevezzük a ts
-beli szavak olyan sorozatát, amely
ts
első szavával kezdődik, és amelyben a szomszédos szavak
max-k-átfedők. A szóláncban a ts
bármely szava legfeljebb egyszer
fordulhat elő. A szólánc akkor ér véget, ha nem folytatható max-k-átfedő
szóval. Ha t
egy szólánc, akkor szavainak jelölése:
t0
, t1
, ...,
ti
, ... .
Egy szólánc összevont alakjának hívjuk azt a betűsorozatot, amelyet úgy
kapunk, hogy a szavakat egymás mellé írjuk úgy, hogy az átfedő részeket csak
egyszer írjuk le. Például a ["saska", "kacsa", "csapat"]
szólánc
összevont alakja "saskacsapat"
. Egy t
szólánc
ti
szavának eltolási mértéke nem más mint az
összevont alakban őt megelőző karakterek száma. A fenti példában
"saska"
eltolási mértéke 0, a "kacsa"
illetve a
"csapat"
szavak esetén ez a szám 3 illetve 5.
A szóláncok között rendezést definiálunk. Egy s
szólánc
megelőzi a t
szóláncot, ha
i ≥ 0
, hogy a két
szólánc 0, 1, ..., i
indexű szava megegyezik, de az
i+1
indexű szavuk
különbözik, továbbá vagy
si
és
si+1
kevesebb helyen fedik át egymást, mint
ti
és ti+1
, vagy
si+1
az ábécé szerint megelőzi a
ti+1
szót.
Szóláncfának nevezzük a ts
-beli szavakból előállítható,
egymástól különböző összes szóláncot tartalmazó fát. A szóláncfa minden
csúcsa egy számot és egy ts
-beli szót tartalmaz. Minden csúcsnak
nulla vagy több gyermeke van (a nulla gyermeket tartalmazó csúcsok a fa
levelei). Egy csúcs gyermekeiben levő szavak páronként különböznek.
Ha a szóláncfa gyökerétől egy leveléig
terjedő úton a csúcsok szavait sorozatba rendezzük, szóláncot kell
kapnunk.
Ha ezt az összes levélre elvégezzük, a ts
-beli
szavakból álló összes szóláncot meg kell kapnunk.
Egy csúcsban levő szám az ott megadott szó
eltolási mértéke.
A fentiek értelmében a szóláncfa gyökerében 0, valamint a
ts
első szava van.
Rendezettnek nevezzük a szóláncfát, ha a leveleit balról jobbra bejárva az oda vezető szóláncok a fent definiált rendezés szerint növekvő sorrendben követik egymást.
Írjon programot szolancfa
néven, amely egy nem üres ts
szólistából rendezett szóláncfát állít elő k
maximális
átfedéshossz mellett.
A ["saska", "kacsa", "csapat", "patko", "kovalyog"]
szólistából k=3
mellett az alábbi, egyetlen szóláncot
tartalmazó szóláncfa állítható elő:
saska(0) kacsa(3) csapat(5) patko(8) kovalyog(11)
Ebben a példában minden csúcsnak (a levelet kivéve) egy gyermeke van; a
gyermeket beljebb kezdéssel jeleztük. A zárójelbe tett szám az eltolás
mértéke: azt adja meg, hogy hány karakter előzi meg az adott szót a
szóláncban. Például a patko
szót a 8 karakter hosszú
saskacsa
füzér előzi meg.
A ["saska", "kacsa", "csapat", "patko", "kovalyog",
"atletika", "kacat"]
szólistából k=3
mellett az alábbi, hat
szóláncot tartalmazó szóláncfa állítható elő:
saska(0) atletika(4) kacat(10) kacsa(10) csapat(12) patko(15) kovalyog(18) kacat(3) atletika(6) kacsa(12) csapat(14) patko(17) kovalyog(20) kacsa(3) atletika(7) kacat(13) csapat(5) atletika(9) kacat(15) patko(8) kovalyog(11)
Itt a saska
szónak három, az első két szóláncban az
atletika
, a negyedik és ötödik szóláncban a
kacsa
, az utolsó két szóláncban pedig a csapat
szónak két-két gyermeke van. Az atletika
szó például azért
előzi meg a kacat
és kacsa
szavakat, mert
rövidebb az átfedése a saska
szóval, mint az utóbbi két szóé
(és nem azért, mert előbb van az ábécében). A kacat
és
kacsa
szavaknak egyforma az átfedése a saska
,
illetve az atletika
szavakkal, ezért a felsorolás sorrendje az
ábécét követi.
Írjon SML-függvényt szolancfa
néven, amely egy nem üres
ts
szólistából a k
maximális átfedéshossz mellett
rendezett szóláncfát állít elő.
szolancfa
adattípus definíciója a következő:
datatype szolancfa = csucs of int * string * szolancfa list
.
(* szolancfa : int -> string list -> szolancfa * szolancfa k ts = a ts szólista szavaiból a k maximális átfedés mellett felépíthető * rendezett szóláncfa (a rendezett szóláncfa definícióját lásd a feladatkiírásban) * PRE: a ts szólista nem üres *)
Az ábécé szerinti sorrend megegyezik a String.compare
által
meghatározott sorrenddel. Egy fs
füzérlista rendezhető a
Listsort.sort String.compare fs
függvényalkalmazással.
- val t1 = szolancfa 2 ["ab","bc","cd"]; > val t1 = csucs(0, "ab", [csucs(1, "bc", [csucs(2, "cd", [])])]) : szolancfa - val t2 = szolancfa 1 ["ab","bc","cd","abc"]; > val t2 = csucs(0, "ab", [csucs(1, "bc", [csucs(2, "cd", [])])]) : szolancfa - val t3 = szolancfa 2 ["ab","bc","cd","abc"]; > val t3 = csucs(0, "ab", [csucs(1, "bc", [csucs(2, "cd", [])]), csucs(0, "abc", [csucs(2, "cd", []), csucs(1, "bc", [csucs(2, "cd", [])])])]) : szolancfa - val t4 = szolancfa 999999 ["apu","asztalos","alma","utas","anyu","satu","malom"]; > val t4 = csucs(0, "apu", [csucs(2, "utas", [csucs(5, "satu", []), csucs(4, "asztalos", [csucs(11, "satu", [])])])]) : szolancfa - val t5 = szolancfa 2 ["aaa","aab","baa","aaaa"]; > val t5 = csucs(0, "aaa", [csucs(2, "aaaa", [csucs(5, "aab", [csucs(7, "baa", [])]), csucs(4, "aab", [csucs(6, "baa", [])])]), csucs(2, "aab", [csucs(4, "baa", [csucs(6, "aaaa", []), csucs(5, "aaaa", [])])]), csucs(1, "aaaa", [csucs(4, "aab", [csucs(6, "baa", [])]), csucs(3, "aab", [csucs(5, "baa", [])])]), csucs(1, "aab", [csucs(3, "baa", [csucs(5, "aaaa", []), csucs(4, "aaaa", [])])])]) : szolancfa - val t6 = szolancfa 3 ["omlik","alma","ikra","atom","ragad"]; > val t6 = csucs(0, "omlik", [csucs(3, "ikra", [csucs(6, "alma", [csucs(9, "atom", [])]), csucs(6, "atom", []), csucs(5, "ragad", [])])]) : szolancfa
Írjon Prolog-eljárást szolancfa/3
néven, amely egy nem üres
L1
szólistából a K
maximális átfedéshossz mellett
rendezett szóláncfát állít elő.
% :- type szo == atom. % :- type eltolas == int. % :- type atfedeshossz == int. % :- type szolista == list(szo). % :- type szolancfa ---> csucs(eltolas,szo,list(szolancfa)). % :- pred szolancfa(szolista::in, atfedeshossz::in, szolancfa::out). % szolancfa(K,L1,F), ahol az F az L1 szólista szavaiból a K maximális átfedés mellett felépíthető % rendezett szóláncfa (a rendezett szóláncfa definícióját lásd a feladatkiírásban) % PRE: az L1 szólista nem üres
Az ábécé szerinti sorrend megegyezik a '@<'/2
eljárás
által megállapított sorrenddel. Egy L1
lista rendezhető a
sort(L1,L1S)
hívással. (Ez ugyan összevonja az azonos
elemeket, de ez nem baj, ha az L1
-ben nincsenek azonos
elemek.)
| ?- szolancfa(2,[ab,bc,cd],F). F = csucs(0,ab,[csucs(1,bc,[csucs(2,cd,[])])]) ? ; no | ?- szolancfa(1,[ab,bc,cd,abc],F). F = csucs(0,ab,[csucs(1,bc,[csucs(2,cd,[])])]) ? ; no | ?- szolancfa(2,[ab,bc,cd,abc],F). F = csucs(0,ab, [csucs(1,bc,[csucs(2,cd,[])]), csucs(0,abc, [csucs(2,cd,[]),csucs(1,bc,[csucs(2,cd,[])])])]) ? ; no | ?- szolancfa(999999, [apu,asztalos,alma,utas,anyu,satu,malom], F). F = csucs(0,apu, [csucs(2,utas, [csucs(5,satu,[]), csucs(4,asztalos,[csucs(11,satu,[])])])]) ? ; no | ?- szolancfa(2, [aaa,aab,baa,aaaa], F). F = csucs(0,aaa, [csucs(2,aaaa, [csucs(5,aab,[csucs(7,baa,[])]), csucs(4,aab,[csucs(6,baa,[])])]), csucs(2,aab, [csucs(4,baa, [csucs(6,aaaa,[]),csucs(5,aaaa,[])])]), csucs(1,aaaa, [csucs(4,aab,[csucs(6,baa,[])]), csucs(3,aab,[csucs(5,baa,[])])]), csucs(1,aab, [csucs(3,baa, [csucs(5,aaaa,[]),csucs(4,aaaa,[])])])]) ? ; no | ?- szolancfa(3,[omlik,alma,ikra,atom,ragad],F). F = csucs(0,omlik, [csucs(3,ikra, [csucs(6,alma,[csucs(9,atom,[])]), csucs(6,atom,[]),csucs(5,ragad,[])])]) ? ; no
max_k_atfedok
függvény, ill. eljárás.
szolancfa.sml
, illetve szolancfa.pl
néven.
A beadási határidő
2007. május 14., hétfő 24:00.
A vizsgaosztályzat megállapításakor a határidőre beadott, helyesen megoldott kis házi feladatokért plusz 1-1 pont jár.