From: | "Mihai Patrascu" <mihai_p@pcnet.ro> | Block Address | Add to Address Book |
To: | "probleme" <probleme@ldc.ro> |
Subject: | Re: re:intervale |
Date: | Mon, 9 Apr 2001 19:30:34 +0300 |
|
|
> > PS: Se da o multime de intervale inchise, pe care poti s-o
prelucrezi.
> > Dup-aia ti se tot dau intervale si trebuie sa gasesti daca
> > exista vre-un
> > interval din cele initiale care sa il includa (sau sa fie
> > egale). Eu am o
> > solutie O(lgN), dar foloseste memorie O(NlgN). Stie cineva
>
> In faza de prelucrare sortezi intervalele dupa primul numar si
elimini
> intervalele care sunt incluse de alte intervale.
> In faza de cautare ai intervalul [a,b].Cauti a in vectorul sortat si
gasesti
> k,cel > numar <=a.
> Daca exista un interval care sa includa pe [a,b] atunci el o sa aiba
drept
> capat din stanga pe k.
> O(lgN) timp si O(N) memorie
Asta nu-i O(lgN) cum nu-s eu calugarita budista. Gasesti pe k in
O(lgN), dar
mai departe orice interval cu capatul din stanga <= k e eligibil.
Numarul de
astfel de intervale pe cazul cel mai defavorabil este Teta(N).
Gandeste-te
la urmatoarele date de intrare:
1 1001
2 1002
3 1003
...
999 19999
E clar, nu? Solutia mea mi-a venit in minte inspirata de la arbori
rosu-negru persistenti, pentru cine stie ceva teorie. Ideea e sa ai
intervalele sortate dupa capatul din stanga intr-un vector A(0:n).
Pentru
fiecare k tii intervalele din (x*(2**k):2**k) sortate separat dupa
capatul
din dreapta, pentru orice x intreg. Deci Teta(NlgN) memorie. [Notatia
A(x:y)
o folosesc pentru elementele A(x)..A(x+y-1), iar 2**k inseamna "2 la
k"; nu
cred ca era nevoie se explic, toti stiti FORTRAN, nu? :-)]. Cautarea e
cam
incalcita... dar e O(lgN).
mihai_p
Privacy Policy-
Terms of Service
-
Guidelines
Copyright © 1994-2001
Yahoo! Inc. All rights reserved.