Busca binária em arrays

Aqui você poderá oferecer suas Contribuições, Dicas e Tutoriais (Texto ou Vídeo) que sejam de interesse de todos.

Moderador: Moderadores

alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Busca binária em arrays

Mensagem por alxsts »

Olá!

A busca binária é um eficiente algoritmo para encontrar um item em uma lista ordenada de itens. Ela funciona dividindo repetidamente pela metade a porção da lista que deve conter o item, até reduzir as localizações possíveis a apenas uma.

Segue exemplo:

Código: Selecionar todos

#include "inkey.ch"

PROCEDURE Teste()

   LOCAL a := { "\u0026", ;  //  1
                "\u0027", ;  //  2
                "\u00c0", ;  //  3
                "\u00c1", ;  //  4
                "\u00c2", ;  //  5
                "\u00c3", ;  //  6
                "\u00c4", ;  //  7
                "\u00c7", ;  //  8
                "\u00c8", ;  //  9
                "\u00c9", ;  // 10
                "\u00ca", ;  // 11
                "\u00cb", ;  // 12
                "\u00cc", ;  // 13
                "\u00cd", ;  // 14
                "\u00ce", ;  // 15
                "\u00cf", ;  // 16
                "\u00d1", ;  // 17
                "\u00d2", ;  // 18
                "\u00d3", ;  // 19
                "\u00d4", ;  // 20
                "\u00d5", ;  // 21
                "\u00d6", ;  // 22
                "\u00d9", ;  // 23
                "\u00da", ;  // 24
                "\u00db", ;  // 25
                "\u00e0", ;  // 26
                "\u00e1", ;  // 27
                "\u00e2", ;  // 28
                "\u00e3", ;  // 29
                "\u00e4", ;  // 30
                "\u00e7", ;  // 31
                "\u00e8", ;  // 32
                "\u00e9", ;  // 33
                "\u00ea", ;  // 34
                "\u00ea", ;  // 35
                "\u00ec", ;  // 36
                "\u00ed", ;  // 37
                "\u00ee", ;  // 38
                "\u00ef", ;  // 39
                "\u00f1", ;  // 40
                "\u00f2", ;  // 41
                "\u00f3", ;  // 42
                "\u00f4", ;  // 43
                "\u00f5", ;  // 44
                "\u00f6", ;  // 45
                "\u00f9", ;  // 46
                "\u00fa", ;  // 47
                "\u00fb", ;  // 48
                "\u00fc" ;   // 49
              }, nSelect

   SetColor( "N/BG,W+/B,,,W/BG" )

   While LastKey() != K_ESC
      nSelect := Achoice( 2, 2, MaxRow()-5, 30, a )

      If nSelect > 0
         nSelect := ASeek( a[ nSelect ], a )
      Else
         Exit
      Endif

      Alert( If( nSelect > 0, "Posicao " + LTrim( Str( nSelect ) ) + ": " + a[ nSelect ], "Nao Encontrado" ) )
   Enddo

RETURN
//----------------------------------------------------

FUNCTION ASeek( xArg, aArray )

   LOCAL nLower, nMid, nUpper, nRet := -1

   // aArray tem que estar obrigatoriamente ordenado de forma ascendente
   If hb_IsArray( aArray ) .And. ! Empty( aArray ) .And. ! hb_IsNil( xArg )
      
      nLower := 1
      nUpper := Len( aArray )
   
      while ( nLower <= nUpper )
         nMid := Int( ( nLower + nUpper ) / 2 )
         If ( xArg == aArray[ nMid ] )
              nRet := nMid
              Exit
         Elseif ( xArg < aArray[ nMid ] )
            nUpper := nMid - 1
         Else
            nLower := nMid + 1
         Endif
      Enddo
   Endif

RETURN nRet
//----------------------------------------------------
[]´s
Alexandre Santos (AlxSts)
SOSSOFT
Usuário Nível 3
Usuário Nível 3
Mensagens: 118
Registrado em: 23 Out 2024 10:04

Busca binária em arrays

Mensagem por SOSSOFT »

Interessante, se não me engano é assim que o Clipper já fazia nos NTX, alguém tem mais informação?
E qual seria um exemplo de aplicação prática inspiradora para esta função?
Responder