-
1. Data: 2014-09-29 13:47:12
Temat: Zrandomizowane wyszukiwanie binarne
Od: Wojciech Muła <w...@g...com>
Witajcie, w normalnym wyszukiwaniu binarnym element "środkowy" (c)
jest średnią arytmetyczną indeksów pierwszego (a) i ostatniego (b)
z przetwarzanego przedziału.
A teraz weźmy c := liczba losowa z przedziału [a, b] (np. z rozkładem
normalnym). Czy znacie jakieś artykuły, które by takie wyszukiwanie
analizowały? Jeśli dobrze pamiętam w Cormenie było porównanie
wyszukiwania liniowego z losowym.
w.
-
2. Data: 2014-09-30 00:22:33
Temat: Re: Zrandomizowane wyszukiwanie binarne
Od: bartekltg <b...@g...com>
On 29.09.2014 13:47, Wojciech Muła wrote:
> Witajcie, w normalnym wyszukiwaniu binarnym element "środkowy" (c)
> jest średnią arytmetyczną indeksów pierwszego (a) i ostatniego (b)
> z przetwarzanego przedziału.
>
> A teraz weźmy c := liczba losowa z przedziału [a, b] (np. z rozkładem
> normalnym).
Na pewno normalnym? To z jaką wariancją. Jak radzić sobie z wyjściem
poza [a,b] (rozkłąd normlany o dowolnej średniej i std jest -inf..inf),
co najwyżej odpowiednio doże liczby są w praktyce niemożliwe do
wylosowania.
Może miałeś na myśli rozkład jednostajny?
> Czy znacie jakieś artykuły, które by takie wyszukiwanie
> analizowały? Jeśli dobrze pamiętam w Cormenie było porównanie
> wyszukiwania liniowego z losowym.
W cormenie na pewno przy wyszukiwaniu binarnym było wyszukiwanie
interpolacyjne, natomiast losowy wybór elementu dzielącego
był w wersji qsort.
Czy gdzieś (np w ćwiczeniach) była wersja wyszukiwania z losowaniem,
nie wiem, możesz podać dokładniejsze namiary?
Zwykły binsearch ma czas (liczba porównań w zależności
od dlugości tablicy)
T[L] = 0 dla L<=1
T[L] = 1+T(L/2) L>1. [ok, z grubsza;)]
Stąd T[L] = log_2 (L)
W przypadku losowania z rozkładu jednostajnego będzie to coś w rodzaju
T[L] = 1+sum(i=1,L-1) ro(i,L)(T[i] (i)*L + T[L-i]*(L-i)/L) [1]
{zakładam, że w wyniku podziału nie moze powstać pusta tablica}
{ średnia po wynikach losowania, wynikiem losowania jest
i, na i/L szukany obiekt jest w tablicy dlugosci i, na 1 - i/L w
pozostałej części. ro(i,L) to gęstość rozkładu}
Dla ro(i,L) z rozkładu jednostajnego mamy = 1/(L-1)
Szybki wykres:
[matlab]
N=2000;
Tb=zeros(N,1);
for L=2:N,
j=floor(L/2);
Tb(L) = 1+ j/L *Tb(j) + (L-j)/L* Tb(L-j);
% Tb(L) = 1+ mean( ((j).* Tb(j) +(L-j).* Tb(L-j))/(L) ); %
rownoważnie
end
T=zeros(N,1);
for L=2:N,
%j=floor(L/2);
j=(1:L-1)'; %podziały
T(L) = 1+ mean( ((j).* T(j) +(L-j).* T(L-j))/(L) );
end
plot(1:N,Tb,'o',1:N,T,'*',1:N,log2(1:N))
Wersja randomizowana jest też logarytmiczna, ale ciut wolniejsza
(jeśli chodzi o liczbę porównań, to tego dojdzie generowani liczb
losowych)
https://www.dropbox.com/s/e58tjr9ke5t1izl/randbinsea
rch.png?dl=0
Niebieski to zwyczajny bsearch. Czerwona cienka linia to log2.
Po policzeniu nie ma w tym nc zaskakującego;) Wzór [1] na T[L]
to jakaśtam średnia z fukcji
x T(x) + (L-x) T(L-x). [2]
Ma ona symetrie względem L/s, czyli tam jest ekstermum.
Spodziewamy się [pd T(x) funkcji wyglądającej jak logarytm).
x log(x) + (L-x)log(L-x) ma w L/2 minimum.
Lepiej więc wziąć po prostu L/2, niż średnią (a to, dla wartości
oczekiwanej, robimy randomizując punkt podziału).
A, do rzeczy. Skoro algorytm jest wyraźnie gorszy, wątpię, by
ktoś o nim coś więcej i dokładniej pisał. Ale mogę czegoś nie
zauważać.
pzdr
bartekltg
-
3. Data: 2014-09-30 02:01:40
Temat: Re: Zrandomizowane wyszukiwanie binarne
Od: A.L. <a...@a...com>
On Mon, 29 Sep 2014 04:47:12 -0700 (PDT), Wojciech Muła
<w...@g...com> wrote:
>Witajcie, w normalnym wyszukiwaniu binarnym element "środkowy" (c)
>jest średnią arytmetyczną indeksów pierwszego (a) i ostatniego (b)
>z przetwarzanego przedziału.
>
>A teraz weźmy c := liczba losowa z przedziału [a, b] (np. z rozkładem
>normalnym).
Ze jak?
A.L.
-
4. Data: 2014-09-30 07:20:23
Temat: Re: Zrandomizowane wyszukiwanie binarne
Od: Wojciech Muła <w...@g...com>
On Tuesday, September 30, 2014 12:22:33 AM UTC+2, bartekltg wrote:
> Na pewno normalnym? To z jaką wariancją. Jak radzić sobie z wyjściem
> poza [a,b] (rozkłąd normlany o dowolnej średniej i std jest -inf..inf),
> co najwyżej odpowiednio doże liczby są w praktyce niemożliwe do
> wylosowania.
>
> Może miałeś na myśli rozkład jednostajny?
Tak, jednostajny. Pomyłka (i to nie imię mojej żony :) ).
> W cormenie na pewno przy wyszukiwaniu binarnym było wyszukiwanie
> interpolacyjne, natomiast losowy wybór elementu dzielącego
> był w wersji qsort.
>
> Czy gdzieś (np w ćwiczeniach) była wersja wyszukiwania z losowaniem,
> nie wiem, możesz podać dokładniejsze namiary?
Moja kopia Cormena leży 450 km stąd, dlatego zapytałem.
> [...]
Wielkie dzięki.
> Wersja randomizowana jest też logarytmiczna, ale ciut wolniejsza
> (jeśli chodzi o liczbę porównań, to tego dojdzie generowani liczb
> losowych)
> [...]
> A, do rzeczy. Skoro algorytm jest wyraźnie gorszy, wątpię, by
> ktoś o nim coś więcej i dokładniej pisał. Ale mogę czegoś nie
> zauważać.
Właśnie miałem nadzieję, że ktoś zauważył - np., że dla jakiegoś szczególnego
rozkładu danych wejściowych wersja randomizowana sprawdza się lepiej.
w.
-
5. Data: 2014-09-30 11:27:55
Temat: Re: Zrandomizowane wyszukiwanie binarne
Od: bartekltg <b...@g...com>
On 30.09.2014 07:20, Wojciech Muła wrote:
> On Tuesday, September 30, 2014 12:22:33 AM UTC+2, bartekltg wrote:
>> Na pewno normalnym? To z jaką wariancją. Jak radzić sobie z wyjściem
>> poza [a,b] (rozkłąd normlany o dowolnej średniej i std jest -inf..inf),
>> co najwyżej odpowiednio doże liczby są w praktyce niemożliwe do
>> wylosowania.
>>
>> Może miałeś na myśli rozkład jednostajny?
>
> Tak, jednostajny. Pomyłka (i to nie imię mojej żony :) ).
>
>> W cormenie na pewno przy wyszukiwaniu binarnym było wyszukiwanie
>> interpolacyjne, natomiast losowy wybór elementu dzielącego
>> był w wersji qsort.
>>
>> Czy gdzieś (np w ćwiczeniach) była wersja wyszukiwania z losowaniem,
>> nie wiem, możesz podać dokładniejsze namiary?
>
> Moja kopia Cormena leży 450 km stąd, dlatego zapytałem.
>
>> [...]
>
> Wielkie dzięki.
>
>> Wersja randomizowana jest też logarytmiczna, ale ciut wolniejsza
>> (jeśli chodzi o liczbę porównań, to tego dojdzie generowani liczb
>> losowych)
>> [...]
>> A, do rzeczy. Skoro algorytm jest wyraźnie gorszy, wątpię, by
>> ktoś o nim coś więcej i dokładniej pisał. Ale mogę czegoś nie
>> zauważać.
>
> Właśnie miałem nadzieję, że ktoś zauważył - np., że dla jakiegoś szczególnego
> rozkładu danych wejściowych wersja randomizowana sprawdza się lepiej.
To najpewniej załatwia ta uwaga:
>> Po policzeniu nie ma w tym nc zaskakującego;) Wzór [1] na T[L]
>> to jakaśtam średnia z fukcji
>> x T(x) + (L-x) T(L-x). [2]
>
>> Ma ona symetrie względem L/s, czyli tam jest ekstermum.
>> Spodziewamy się [pd T(x) funkcji wyglądającej jak logarytm).
>> x log(x) + (L-x)log(L-x) ma w L/2 minimum.
>> Lepiej więc wziąć po prostu L/2, niż średnią (a to, dla wartości
>> oczekiwanej, robimy randomizując punkt podziału).
Może trochę niewyraźnie napisane. I na pewno nieformalne.
Z pierwszym problemem sobie poradzimy;)
Jeszcze raz, wartość oczekiwana czasu obsłużenia tablicy długości
L zadana jest rekurencyjnym wzorem:
T[L] = 1+sum(i=1,L-1) ro(i,L) [T[i] (i)/L + T[L-i]*(L-i)/L]
1 dla porównania jednego elementu,
sum(i=1,L-1) ro(i,L) [...] to średnia z jakiegoś wyrażenia po
rozkładzie o gęstości ro.
a zawartość nawiasu kwadratowego to właśnie nasze wyrażenie,
które się uśrednia. [T[i] (i)/L + T[L-i]*(L-i)/L]
Można pokazać (mniejsza o ścisłość, dla logarytmu działa, chyba
działa dla każdej monotonicznej, wraz z pochodnymi, funkcji), że
przy pewnych założeniach co do T[x], T[x] *x jest wypukła.
Więc [T[x] *(x)/L + T[L-x]*(L-x)/L] też.
Jak poprzednio wspomniałem, jest symetryczna przy x-> L/2 - x
więc ma w L/2 minimum.
Wróćmy do głównego równania. Mamy jakiś rozkład, który uśrednia
funkcję [...]. Ale najmniejszą wartość uzyskamy, jeśli weźmiemy
tylko minimum. Biorąc cokolwiek innego, nawet z małym
prawdopodobieństwem, dostajemy gorszy wynik niż biorąc minimum.
Najmniejsze T wychodzi przy rozkładzie skupionym na środku.
Z drugiej strony, ktoś o tym pisze:
http://www.cise.ufl.edu/~yx1/publications/bin_search
.pdf
ale nie wczytałem się na tyle, by wiedzieć, po co.
pzdr
bartekltg
-
6. Data: 2014-09-30 18:58:00
Temat: Re: Zrandomizowane wyszukiwanie binarne
Od: bartekltg <b...@g...com>
On 30.09.2014 11:27, bartekltg wrote:
>
> T[L] = 1+sum(i=1,L-1) ro(i,L) [T[i] (i)/L + T[L-i]*(L-i)/L]
Zupełnie już na boku, asymptotycznie to zawsze będzie logarytm.
Przynajmniej jeśli rozkład, z którego
losujemy nie zmienia się, a jedynie go skalujemy.
Wszystkie równania na oczekiwany czas sprowadzają się do postaci
T[L] = \sum_{j=1}^{L-1} w_L[j] T[j] /(L-1)
gdzie wagi (dla każdego L oczywiście inny zestaw)
sumują się do 1. I to jest najistotniejsze tu założenie.
Tak jest w obu przypadkach z poprzednich postów.
W przypadku asymptotycznym sumę zastępujemy całką i mamy
T[L] = 1/L int_0^L w(x/L) T[x] dx
w to waga, zdefiniowana na [0,1]
x=L*y
T[L] = int_0^L w(y) T[y*L] dy
podstawiając za rozwiązanie T[.]=log[.]+C1
int_0^L w(y) (log[y*L] + C1) dy =
int_0^L w(y) log[L] dy + int_0^L w(y) log[y] dy + C2 =
log[L] + C1+C2
No to w domu, bo stałą możemy tak dobrać, by C0 == C1[C0] + C2
pzdr
bartekltg
-
7. Data: 2014-09-30 23:17:38
Temat: Re: Zrandomizowane wyszukiwanie binarne
Od: "M.M." <m...@g...com>
On Tuesday, September 30, 2014 7:20:23 AM UTC+2, Wojciech Muła wrote:
> Właśnie miałem nadzieję, że ktoś zauważył - np., że dla jakiegoś szczególnego
> rozkładu danych wejściowych wersja randomizowana sprawdza się lepiej.
Co znaczy lepiej?
Generalnie musimy znalezc pozycje elementu w tablicy.
Kazda metoda wyszukiwania charakteryzuje sie prawdopodobienstwem p(i) ze
zakonczy dzialanie w i-tej iteracji, albo p(t), ze zakonczy dzialnie w
czasie t. Mamy funkcję kosztu k(t), ktora to funkcja opisuje koszt wyszukania w
czasie t. Mozemy minimalizowac esperancje: suma od 0 do inf p(t)*k(t).
Jesli znasz k(t) i jesli wiesz cos o danych, to mozesz analizowac i/albo
testowac rozne metody wyszukiwania. Np. ksiazki telefonicznej nie trzeba
otwierac w sordku.
Pozdrawiam