From: | "Radu Stefan" <radu124@deltanet.ro> | Block Address | Add to Address Book |
To: | probleme@ldc.ro |
Date: | Thu, 15 Mar 2001 11:59:05 +0200 |
Subject: | patrascu - Algoritmi aplicati in practica - move-to-front |
|
|
>
> Presupun ca multi ati auzit de algoritmul move-to-front (pe la
> compresii). Chestia e cam asa: tii o lista cu caracterele (0..255) si
> la fiecare caracter din fisierul de intrare scrii la iesire pozitia
> lui in lista, dupa care il muti primul in lista. Challenge-ul este
cum
> implementezi asta astfel incat pentru fiecare caracter sa fie
O(logK),
> unde K e pozitia caracterului in lista inainte de a-l muta primul.
O idee ar fi sa tii un fel de arbore echilibrat cu 256 de noduri, in
care in fiecare nod sa tii o valoare egala cu numarul de varfuri din
subarborele a carui radacina e varful respectiv.
Parcurgerea in preordine a arborelui sa dea chiar lista de
elemente.
o mutare "to front" ar insemna aducerea elementului respectiv in
radacina arborelui si "coborarea" (daca vezi arborele cu frunzele in
jos) fostei radacini in subarborele stang.
N-as incerca sa implementez asa ceva, dar in mare ideea pare sa
mearga.
Nu stiu daca nu s-ar putea mai usor cu heap-uri, in care o mutare
in lista sa fie tradusa in mai multe mutari "up" "down" in heap.
Eventual sa tii un heap in care elementele sa fie pozitionate dupa
index-ul ultimei aparitii (in fisierul de intrare).
Mai e si problema cum faci transformarea inversa.
Dat fiind ca mi-e lene sa-mi dezvolt ideile sau sa verific daca sunt
corecte, imi spuneti si voi daca vreuna vi se pare buna.
Radu
Privacy Policy-
Terms of Service
-
Guidelines
Copyright © 1994-2001
Yahoo! Inc. All rights reserved.