Wskazówka:
Zauważmy, że funkcja F(p, k, e) znajduje pierwszą pozycję w posortowanej tablicy T[p..k], na której wartość jest większa od danej liczby e. Wynikiem wywołania F(1, n, b) będzie pierwsza pozycja w tablicy T, dla której wartość jest większa od liczby b. Zatem będzie to liczba elementów tablicy mniejszych bądź równych b. Analogicznie wywołanie funkcji F(1, n, a) zwróci najmniejszy indeks i w tablicy T, taki że T[i] > a. Zatem wartość różnicy F(1, n, b) – F(1, n, a) jest równa liczbie elementów tablicy, które należą do przedziału [a+1, b]. Trzeba więc jeszcze osobno zliczyć elementy, które są równe a, co prowadzi do złożoności liniowej algorytmu:

prawy ← F(1, n, b)
lewy ← F(1, n, a)
ilewy – 1
dopóki (> 0 oraz T[i] = T[lewy])
ii – 1
lewyi+1
wprawylewy

Zauważmy jednak, że osobne obliczanie elementów równych a jest zbędne. Wywołanie funkcji F(1, n, a – 1) zwraca najmniejszy indeks i, taki że T[i] > a – 1. Prowadzi to do rozwiązania o złożoności logarytmicznej:

prawy ← F(1, n, b)
lewy ← F(1, n, a – 1)
wprawylewy
Powrót do pytań