Responsabili:
Data publicării : 13 mai, ora: 23:55
Deadline: 3 iunie, ora 23:55
În urma realizării acestei teme:
Scopul acestei teme este implementarea unei structuri de date arborescente numită Rope. Aceasta permite efectuarea eficientă de operații (inserare, concatenare, ștergere etc.) pe un șir de caractere foarte lung (problemă caracteristică editoarelor de text de orice tip).
Un Rope este un arbore binar cu 2 proprietăți:
1. Frunzele conțin stringuri de lungime >= 1
2. Fiecare nod are o greutate asociată:
- pentru frunze, acest număr este lungimea stringului pe care îl conține fiecare
- pentru restul nodurilor, acest număr este suma greutăților frunzelor din subarborele stâng
Prin punerea cap la cap a stringurilor din frunze, de la stânga la dreapta, obținem stringul pe care îl reprezintă Rope-ul.
Va trebui să implementați următoarele operații:
RopeTree* concat(RopeTree* rt1, RopeTree* rt2);
Concat(R1, R2) - concatenarea a 2 rope-uri
ex: Concat(Rope(“ab”), Rope(“cde”)) → Rope(“abcde”)
char indexRope(RopeTree* rt, int idx);
Index(R1, i) - obținerea caracterului de pe poziția i dintr-un rope
ex: Index(Rope(“abcde”), 1) → 'b'
char* search(RopeTree* rt, int start, int end);
Search(R1, start, end) - obținerea stringului din intervalul [start,end)
ex: Search(Rope(“abcde”), 1, 3) → “bc”
SplitPair split(RopeTree* rt, int idx);
Split(R1, i) - împărțirea unui rope în 2 rope-uri separate
ex: Split(Rope(“abcde”), 2) → (Rope(“ab”), Rope(“cde”))
Exemplu 1:
Exemplu 2:
Exemplu 3:
RopeTree* insert(RopeTree* rt, int idx, const char* string);
Insert(R1, i, str) - inserarea unui string pe o poziție a unui Rope
ex: Insert(Rope(“abcde”), 1), “123”) → Rope(“a123bcde”)
RopeTree* delete(RopeTree* rt, int start, int len);
Delete(R1, start, len) - ștergerea substringului din intervalul [start, start+len)
ex: Delete(Rope(“abcde”), 1, 2) → Rope(“ade”)
Următorele sunt exemple de operații care, deși returnează Rope-uri care respectă definiția, nu vor fi punctate:
Temele vor fi trimise pe vmchecker. Atenție! Temele trebuie trimise în secțiunea Structuri de Date (CA).
Arhiva trebuie să conțină:
De aceea, vă sfătuim să nu vă lăsați rezolvări ale temelor pe calculatoare partajate (la laborator etc), pe mail/liste de discuții/grupuri etc.
Q: Pot modifica structurile din schelet?
A: Nu.
Q: Îmi pot implementa alte funcții helper, pe lângă cele cerute?
A: Desigur, chiar vă încurajăm să o faceți.
Q: Deci pentru Insert si Delete pot să dau copy-paste la codul din funcțiile Split si Concat?
A: Nu dați copy-paste, vă vom scădea din punctaj pentru cod duplicat. Pur și simplu chemați funcțiile deja implementate cu parametri corespunzători
Q: Rope-urile trebuie echilibrate de către noi?
A: Nu.
Q: Nu mă prind cum aș putea folosi funcția getTotalWeight
din schelet. De ce ați inclus-o?
A: Sincer, am folosit-o în implementarea soluției și am uitat să o ștergem. Dacă nu vi se pare evident cum v-ați putea folosi de ea și mai mult vă încurcă, puteți să o ștergeți :)
Q: Am căutat informații despre Rope pe internet și am citit că greutatea unei frunze ar trebui să fie egală cu lungimea stringului pe care îl conține. Respectăm enunțul și o lăsăm 0? A: Vom considera ambele variante drept corecte.
Q: Aș vrea să folosesc un string auxiliar în care să îmi extrag tot șirul din Rope și să mă folosesc de el mai departe. E în regulă? A: Nu este permisă extragerea stringului din rope urmată de prelucrarea acestui string.