1
- /*
1
+ /*
2
2
Contribuidores
3
3
- Dromedario de Chapéu
4
-
4
+
5
5
O que é busca Binaria -
6
- "A busca binária é um eficiente algoritmo para encontrar um item em uma lista
7
- ordenada de itens. Ela funciona dividindo repetidamente pela metade a porção da
8
- lista que deve conter o item, até reduzir as localizações possíveis a apenas uma.
6
+ "A busca binária é um eficiente algoritmo para encontrar um item em uma lista
7
+ ordenada de itens. Ela funciona dividindo repetidamente pela metade a porção da
8
+ lista que deve conter o item, até reduzir as localizações possíveis a apenas uma.
9
9
Nós usamos a busca binária em um jogo de adivinhação no tutorial introdutório."
10
10
- Khan Academy : https://pt.khanacademy.org/computing/computer-science/algorithms/binary-search/a/binary-search
11
11
*/
12
12
13
13
// O <T> em Rust indica que não se espera tipo especifico e sim qualquer tipo
14
14
// no caso o T é usado para indicar o tipo dos valores da lista e o valor a ser
15
15
// procurado.
16
- fn busca_binaria < T > ( lista : & [ T ] , valor : T ) -> ( bool , usize )
16
+ fn busca_binaria < T > ( lista : & [ T ] , valor : T ) -> ( bool , usize )
17
17
where
18
18
// É preciso especificar que T implementa as Traits PartialEq e PartialOrd para
19
19
// indicar que T pode ser comparado T e que possui uma ordem de maior e menor
20
- T : PartialEq ,
20
+ T : PartialEq ,
21
21
T : PartialOrd ,
22
22
{
23
23
// Centro indica o centro a lista ou sublista
24
- let mut centro = lista. len ( ) / 2 ;
25
-
24
+ let mut centro = lista. len ( ) / 2 ;
25
+
26
26
// Limite_r representa o maior indice possível, referente ao extremo direito
27
- // da lista atual, serve para dividir a lista original sem precisar ficar
27
+ // da lista atual, serve para dividir a lista original sem precisar ficar
28
28
// clonando ou literalmente dividindo. Seria o [-1] da sublista
29
- let mut limite_r = lista. len ( ) - 1 ;
30
-
31
- // Limite_l representa o mesmo que Limite_r porem para o extremo esquerdo,
32
- // ou sejá , o [0] da sub lista.
29
+ let mut limite_r = lista. len ( ) - 1 ;
30
+
31
+ // Limite_l representa o mesmo que Limite_r porem para o extremo esquerdo,
32
+ // ou seja , o [0] da sub lista.
33
33
let mut limite_l = 0 ;
34
34
35
35
loop {
36
- // O valor esta sendo passado por referencia e depois acessado pelo seu
37
- // ponteiro pelo sistema de owenrship o Rust, isso pode feito com atribuição
36
+ // O valor esta sendo passado por referencia e depois acessado pelo seu
37
+ // ponteiro pelo sistema de ownership o Rust, isso pode feito com atribuição
38
38
// simples como `valor_p = lista[centro]` em um Python por exemplo
39
- let valor_p = & lista[ centro] ;
39
+ let valor_p = & lista[ centro] ;
40
40
41
41
// O primeiro bloco de if se responsabiliza em verificar se o valor que estamos
42
42
// buscado foi encontrado, caso não ele verifica da ultima operação para esta
43
- // o centro não mudou de posição, ou sejá , não ha mais valores para verificar
43
+ // o centro não mudou de posição, ou seja , não ha mais valores para verificar
44
44
// e o item não existe
45
45
if * valor_p == valor {
46
46
return ( true , centro)
@@ -52,19 +52,19 @@ where
52
52
// e o atual valor_p, caso seja valor_p seja maior, significa que o valor procurado
53
53
// esta mais para trás, e o centro é movido para o centro da sub lista anterior.
54
54
// Porem caso valor seja maior que o valor_p, significa que precisamos mover o centro
55
- // para o centro da sub lista superiors
55
+ // para o centro da sub lista superiors
56
56
if * valor_p > valor {
57
- limite_r = centro;
57
+ limite_r = centro;
58
58
centro = centro / 2 ;
59
59
} else if * valor_p < valor {
60
60
limite_l = centro;
61
61
// O If esta verificando se o espaço entre limite_r e limite_l é igual a 1
62
- // pois a operação de padrão usada daria o resultado de 0 nesse caso, pois
62
+ // pois a operação de padrão usada daria o resultado de 0 nesse caso, pois
63
63
// Rust arredonda os valores para baixo, logo 0.5 é jogado para 0
64
- // Poderia ser feito em uma linha utilizado conversão de tipos e arredondamento
64
+ // Poderia ser feito em uma linha utilizado conversão de tipos e arredondamento
65
65
// porem eu pessoalmente acredito que a performance ganha não vale compensa
66
-
67
- centro = if ( limite_r - limite_l) == 1 { centro + 1 }
66
+
67
+ centro = if ( limite_r - limite_l) == 1 { centro + 1 }
68
68
else { centro + ( limite_r - limite_l) / 2 } ;
69
69
// Forma em uma linha -
70
70
// centro = centro + (((limite_r - limite_l) as f32 / 2.0).ceil() as usize);
@@ -82,13 +82,13 @@ fn main() {
82
82
mod test {
83
83
use super :: * ;
84
84
85
- #[ test]
85
+ #[ test]
86
86
fn busca ( ) {
87
- let lista = vec ! [ -3 , -2 , -1 , 0 , 1 , 2 , 3 ] ;
87
+ let lista = vec ! [ -3 , -2 , -1 , 0 , 1 , 2 , 3 ] ;
88
88
assert_eq ! ( busca_binaria( & lista, -7 ) , ( false , 0 ) ) ;
89
89
assert_eq ! ( busca_binaria( & lista, -2 ) , ( true , 1 ) ) ;
90
90
assert_eq ! ( busca_binaria( & lista, 0 ) , ( true , 3 ) ) ;
91
91
assert_eq ! ( busca_binaria( & lista, 2 ) , ( true , 5 ) ) ;
92
92
assert_eq ! ( busca_binaria( & lista, 7 ) , ( false , 0 ) ) ;
93
93
}
94
- }
94
+ }
0 commit comments