Vamos utilzar que $$2 lg \space (n!) \geq (n/2) lg \space n$$ e lebrem que $$ 2 lg \space (n!) = lg \space (n!^2) = lg \space(\prod_{i=0}^{n-1} (n-i) \cdot (i+1)) $$ $$ (n-i) \cdot (i+1) = ni+n-i^2-i$$
Se realizarmos primeira derivada dessa função em $i$ e igualarmos a 0, vamos obter que $n-2i-1 = 0$. Resolvendo essa equaçao e sabendo que a parábola da equação de segundo grau é voltada para baixo, descobrimos que o ponto máximo dessa equação é em $i = \frac{n-1}{2}$. Veja que $i \in [0, n-1]$, calculando o valor da equação nos tremos chegamos a $n$ em ambos o caso. Portanto como o máximo está entre os extremos e nelas o valor é $n$, podemos concluir que,
$$ (n-i) \cdot (i+1) \geq n $$
Usando isso,
$$ 2 \cdot lg \space (n!) \geq 2 \cdot lg \space (\prod_{i=0}^{n-1} n) = 2 \cdot lg \space (n^n) = 2 \cdot n \cdot lg \space (n)$$
$$ lg \space (n!) \geq n \cdot lg \space (n)$$
Se dividirmos a parte da direita dessa inequação por 4 ela continua sendo válida e chegamos onde queríamos.
Tenho $n!/2$ folhas na nossa árvore de decisão (note que é uma árvore binária), portanto não pode ter mais que $2^h$ folhas ($h$ é a altura da árvore e é ainda desconhecido). Portanto $$\frac{n!}{2} \leq 2^h$$ Aplicando o $lg$ em anbos os lados, $$h \geq lg \space (n!) - 1$$ E sabendo que $$ lg \space (n!) \geq n \cdot lg \space (n)$$ (pelo exercíco anterior), $$h \geq lg \space (n!) - 1 \geq n \cdot lg \space (n) - 1$$ Ou seja, o número mínimo de comparações será $h$ e como $h$ é limitado inferiormente por $n \cdot lg \space (n) - 1$, temos que o algorítimo irá realizar no mínimo $\Omega(n \cdot lg \space (n))$ comparações.
Vamos proceder da mesma forma para $\frac{n!}{n}$ comparações. $$\frac{n!}{n} \leq 2^h$$ $$h \geq lg \space (n!) - lg \space n$$ $$h \geq lg \space (n!) - lg \space n \geq n \cdot lg \space (n) - lg \space n = \Omega(n \cdot lg \space (n))$$
E o mesmo para $\frac{n!}{2^n}$, $$\frac{n!}{2^n} \leq 2^h$$ $$h \geq lg \space (n!) - n$$ $$h \geq lg \space (n!) - n \geq n \cdot lg \space (n) - n = \Omega(n \cdot lg \space (n))$$
$A$ é o vetor com os $n$ elementos.
Processa(A, n k)
B[1..k] <- 0
para i igual a 1 até n
B[A[n]] <- B[A[n]] + 1
para i igual a 2 até k
B[i] <- B[i] + B[i-1]
A linha 2 e 3 consome tempo proporcional a n e a 4 e 5 proporcional a k, portanto o tempo de execução será $O(kn)$.
Descobre(a, b, B)
return B[b]-B[a]
B[1..10] = [[], [], [], [], [], [], [], [], [], []]
Para cada elemento de A vamos fazer \$\lceil\$ nA \$\rceil\$, vamos, na simulação guardar um A'
A'[1..0] = [7.9, 1.3, 1.6, 6.4, 3.9, 2.0, 8.9, 5.3, 7.1, 4.2]
A'[1..0] = [8.0, 2.0, 2.0, 7.0, 4.0, 2.0, 9.0, 6.0, 8.0, 5.0]
Inserimos A[i] em B[A'[i]]
B[1..10] = [[], [0.13, 0.16, 0.20], [], [0.39], [0.42], [0.53], [0.64], [0.79, 0.71], [0.89], []]
Ordenamos cada lista de B.
B[1..10] = [[], [0.13, 0.16, 0.20], [], [0.39], [0.42], [0.53], [0.64], [0.71, 0.79], [0.89], []]
Concatenamos as listas
B[1..10] = [0.13, 0.16, 0.20, 0.39, 0.42, 0.53, 0.64, 0.71, 0.79, 0.89]
O pior caso no BUCKETSORT é quando todos os elementos da lista cairem na mesma sub-lista do vetor B. Nesse caso o nosso algorítimo vai levar tempo proporcional ao método de ordenação que utilizamos para ordenar essas sub-listas. No livro, ele escolhe o InsertionSort que posui pior caso $nˆ2$, se trocarmos por qualquer algorítmo de tempo máximo $O(n lg \space n)$, teremos o pior caso como $O(n lg \space n)$. Vamos averiguar se preserva o caso médio, $n_i$ será o número de elementos médio no sub vetor
$$E[T(n)] = E[\Theta (n) + \sum_{i = 1}^{n} O(n_i lg \space n_i)]$$ $$E[T(n)] = \Theta (n) + \sum_{i = 1}^{n} O(E[n_i lg \space n_i]) = \Theta (n) + O(n lg \space n)$$
Vamos supor que quermos multilicar $A_{kn*n}$ por $B_{n*Kn}$, note que vamos obter uma matriz $C$ de dimenções $kn*kn$. Vamos dividir $A$ em $k$ matrizes de dimenões $n*n$, sendo assim teremos $A=\begin{bmatrix} A_1 \\ A_2 \\ ... \\ A_n \end{bmatrix}$. O mesmo Vale para $B=\begin{bmatrix} B_1 & B_2 & ... & B_n \end{bmatrix}$ Veja que $C = \begin{bmatrix} A_1 \cdot B_1 & A_1 \cdot B_2 & ... & A_1 \cdot B_n \\ A_2 \cdot B_1 & A_2 \cdot B_2 & ... & A_2 \cdot B_n \\ ... & & & ... \\ A_n \cdot B_1 & A_n \cdot B_2 & ... & A_n \cdot B_n \end{bmatrix} $. Fazendo dessa maneiro o tempo esperado da multiplicação será $\Theta(k^2 \cdot n^{lg \space 7})$, pois termos $k^2$ multiplicações de matrizes de dimensões $n*n$ e o algoritmo de Strassen leva tempo proporcionar a $\Theta(n^{lg \space 7})$.
Invertendo a ordem e fazendo $B \cdot A$, vamos obter um $C$ de dimensões $n*n$. Veja que para esse caso $D = \begin{bmatrix} A_1 \cdot B_1 \\ A_2 \cdot B_2 \\ ... \\ A_n \cdot B_n \end{bmatrix} = \begin{bmatrix} D_1 \\ D_2 \\ ... \\ D_n \end{bmatrix}$ e $C = D_1 +D_2 + ... +D_n$, portanto para esse caso o tempo será $\Theta(k \cdot n^{lg \space 7})$.
Veja que nessa imagem há no máximo $\lceil \frac{n}{7} \rceil$ pontos em cada linha. Há $\lceil \frac{1}{2} \lceil \frac{n}{7} \rceil \rceil$ colunas a direita da mediana, incluindo ela, note que há duas dessas colunas em que o número de pontos é menor. Portanto há $5(\lceil \frac{1}{2} \lceil \frac{n}{7} \rceil \rceil-2)$ pontos menores que a mediana. Note que:
$5(\lceil \frac{1}{2} \lceil \frac{n}{7} \rceil \rceil-2) \geq \frac{5n}{14} - 10$
Ou seja na prónima interação vamos calcular um número maior que $\frac{5n}{14} - 10$ no melhor caso e um número menor que $n-\frac{5n}{14} - 10$ no pior caso. Vamos assumir que vamos sempre pegar o pior caso para poder calcular o pior caso. Note também que en todos os casos vou ter que calcular a medina das medianas, que vai consumir tempo $T(\lceil \frac{n}{7} \rceil)$. Dessa maneira o tempo total será:
$$T(n) = T(\lceil \frac{n}{7} \rceil) + T(\frac{9n}{14} + 10) + O(n)$$
Queremos provar que o algorítmo continua linear, ou seja, $T(n) \leq cn$, utilizando essa hipótese:
$$T(n) \leq c\lceil \frac{n}{7} \rceil + c\frac{9n}{14} + 10c + an$$ $$T(n) \leq c\lceil \frac{n}{7} \rceil + c\frac{9n}{14} + 10c + an$$ $$T(n) \leq c\frac{n}{7} + c + c\frac{9n}{14} + 10c + an$$ $$T(n) \leq \frac{11n}{14}c + 11c + an$$
Veja que:
$$\frac{11n}{14}c + 11c + an = cn + (\frac{-3nc}{14} + 11c + an) $$
Basta provar que:
$$\frac{-3nc}{14} + 11c + an \leq 0$$ $$-3nc + 154c \leq -14an $$ $$3nc - 154c \leq 14an $$ $$c \leq \frac{14an}{3n-154} $$
Note que a partir de n = 100 a fração será sempre menor do que 9, portanto existe o $c \geq 9a$ vai satisfazer a equação anterior e vai permitir que a nossa hipótese seja verdadeira.
Para facilitar a visualização desse exercício vamos escrever o código Select-BFPRT novamente:
Select-BFPRT(A, p, r, i)
se p = r
devolve p
q <- Particione-D(A, p, r)
k <- q-p+1
se k = i
devolve k
senão se k > i
devolve Select-BFPRT(A, p, q-1, i)
senão
devolve Select-BFPRT(A, q+1, r, i-k)
Particione-D(A, p, r)
para j <- p, p+5, p+10 ... p+5*(n+1)/5-1
ordena_5_elementos
para j <- 1 até (n+1)/5-1 #numero de elementos medianos
A[p - 1 + j] <--> A[p + 5*j -3] #colocar as medianas no inicio
[p - 1 + ceil(n/5)] <--> A[ floor((p + 5 * floor(n/5) + r)/2) ] // meio do último intervalo...
k <-- Particione-D(A, p, p+ceil(n/5), floor( (ceil(n/5) + 1)/2 ))
A[k] <--> A[r] # manda a mediana para o final
devolve particiona(A, p, r)
A primeira parte é verificar o consumo de tempo do Particione-D. Note que $r-p+1 = n$.
$$ T(n) \leq O(n) + T(n/5)$$
Vamos analizar essa recursão, note que colocamos $\leq$ , pois as linhas 3 e 5 do Particione-D podem consumir tempo menor do que as linhas 2 e 4. Então vamos supor que:
$$T(n) = O(n) + T(n/5) = an + T(n/5) = an + an \frac{1}{5} T(n (\frac{1}{5})^2) $$
$$= an \sum_{j=1}{i} (\frac{1}{5})^{j-1} + T(n (\frac{1}{5})^i) = an \cdot \frac{(\frac{1}{5})^i-1}{\frac{1}{5}-1} + T(n (\frac{1}{5})^i)$$
Suponha que $n= 5^i$. Utilizamos esse recurso para descobrir o comportamento da função. Descoberto o comportamento dela vamos provar que esse comportamento está certo (ou errado). Assumindo isso:
$$T(n) = a \cdot \frac{1-n}{\frac{1}{5}-1} + 1 = a \cdot \frac{5-5n}{1-5}+1 = \frac{-5a+5na+4}{4}$$
Veja que belo, uma função $\Theta(n)$. Agora vamos verificar se a recurção original é realmente $\Theta(n)$, para isso vamos usar indução. Veja que o caso BASE é trivial. Lembre que estamos assumindo (nossa hipótese) $T(n) = \frac{-5a+5na+4}{4}$.
$$ T(n) = a n + T(n/5)$$
Pela hipótese:
$$ T(n) = a n + T(n/5) = an + \frac{-5a+n+4}{4} = \frac{4an-5a+n+4}{4} = \frac{4an-5a+na+4}{4}= \frac{-5a+5na+4}{4}$$
Que é o que queríamos provar. Agora que sabemos que o Particione-D é $\Theta(n)$, temos que provar o mesmo para o Select-BFPRT. Note que o tempo consumido por essa função será:
$$T(n) \leq O(n) + T(max(k, n−k)) \leq O(n) + T(9n/10)$$
Podemos proceder da mesma maneira que na parte anterior, mas vamos fazer diferente. Sabemos que queremos provar que $T(n)$ é $O(n)$, ou seja $T(n) < cn$ (isso será nossa hipótese de indução).
...
A) Olha os dois vetores e pega o maior em cada um deles, se o outro vetor tiver acabado compara com 0.