FreeBasic
Главная
Вход
Регистрация
Среда, 16.10.2024, 11:36Приветствую Вас Гость | RSS
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Алгоритм поиска Бойера-Мура-Хорспула
haavДата: Понедельник, 14.10.2024, 08:47 | Сообщение # 1
Генералиссимус
Группа: Администраторы
Сообщений: 1366
Репутация: 49
Статус: Offline
Это алгоритм поиска Бойера-Мура-Хорспула для поиска подстроки в строке. Так же в коде есть небольшая процедура прямого поиска. Код написан мною для последующего его перевода на ASM , что и было потом сделано. Но поскольку код ASM здесь мало кому интересен , то выкладываю только код FB:

Код
Function DirectSearch(_
start As Integer, _
pszBuf As Zstring Ptr,_
pszTemplate As Zstring Ptr,_
iLenBuf As Integer,_
iLenTemplate As Integer) As Integer

    Dim As Integer iTemp
    For i As Integer = start-1 To iLenBuf-1
  If (*pszBuf)[i] = (*pszTemplate)[iTemp] Then
   iTemp+=1
   If iTemp >= iLenTemplate Then
    Return i - iLenTemplate +2
   Endif
  Else
   iTemp = 0
  Endif
    Next
End Function

Function Search (iStart As Integer , pszBuf As Zstring Ptr, pszTemplate As Zstring Ptr , iLenBuf As Integer    , iLenTemplate As Integer) As Integer
    
    Dim As Ubyte bTable(255)    
    Dim As Integer iPointer = iLenTemplate - 1 + (iStart-1)
    Dim As Integer iPointerTemplate = iLenTemplate - 1
    Dim As Integer iBackPointer = iPointer
    Dim As Integer iRet

    For i As Integer = 0 To 255
  
  bTable(i) = iLenTemplate
  
    Next
    
    Dim iDistance As Byte = 1
    
    For i As Integer = iLenTemplate-2 To 0 Step -1
  
  Dim bChar As Ubyte = (*pszTemplate)[i]
  
  If bTable(bChar) = iLenTemplate Then
   
   bTable(bChar) = iDistance
   
  Endif
  
  iDistance +=1
  
    Next
    
    Do
  
  Dim As Ubyte bCharBuf = (*pszBuf)[iPointer]
  
  Dim As Ubyte bCharTemplate = (*pszTemplate)[iPointerTemplate]
  
  If bCharBuf = bCharTemplate Then
   
   iRet = iPointer+1
   
   iPointer-=1
   
   iPointerTemplate-=1
   
   If iPointerTemplate < 0 Then
    
    Exit Do
    
   Endif
   
  Else
   
   Dim As Ubyte bChar = (*pszBuf)[iBackPointer]
   
   Dim As Integer iDistance = bTable(bChar)
   
   iPointerTemplate = iLenTemplate - 1
   
   iPointer = iBackPointer + iDistance
   
   iBackPointer = iPointer
   
   iRet = 0
   
  Endif
  
  If iPointer >= iLenBuf Then
   
   Exit Do
   
  Endif
  
    Loop
    
    Return iRet
    
End Function

Dim As Zstring Ptr psz0 = @"Hello world"
Dim As Zstring Ptr psz1 = @"ld"

? DirectSearch(1, psz0 , psz1 , Len(*psz0) , Len(*psz1))

? Search(1 , psz0 , psz1 , Len(*psz0) , Len(*psz1))


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
DarkDemonДата: Среда, Сегодня, 08:56 | Сообщение # 2
Полковник
Группа: Друзья
Сообщений: 195
Репутация: -2
Статус: Offline
Стас, расскажи насколько он быстрый? И тот что в теме рядом(поиск по z которая).
Ты же стопудово сравнивал.
 
  • Страница 1 из 1
  • 1
Поиск: