Programa Java para implementar el algoritmo Bitap para la coincidencia de strings

El algoritmo Bitap es un algoritmo aproximado de coincidencia de strings. El algoritmo dice si un texto dado contiene una substring que es «aproximadamente igual» a un patrón dado. Aquí aproximadamente igual establece que si la substring y el patrón están dentro de una distancia dada k entre sí. El algoritmo comienza precomputando un conjunto de máscaras de bits que contienen un bit para cada elemento del patrón. Esto hace la mayoría de las operaciones bit a bit, que son rápidas.

El algoritmo Bitap también se conoce como shift-or, shift-and o algoritmo Baeza Yates Gonnet. 

Ejemplo:

Input:
Text: geeksforgeeks
Pattern: geeks
Output:
Pattern found at index: 0

Input:
Text: Youareawesome
Pattern: Youareamazing
Output:
No Match.

Acercarse:

  • Introduzca el patrón de texto como una string.
  • Convertiremos este String en un Char Array simple
  • Si la longitud es 0 o superior a 63, devolvemos » No Match».
  • Ahora, tomando la array R que complementa a 0.
  • Tomando una array «pattern_mask» que complementa 0, a 1
  • Tomando el patrón como un índice de «patrón_máscara», luego, usando el operador y , lo combinamos con el resultado del complemento de 1L (entero largo) desplazándolo hacia el lado izquierdo i veces.
  • Ahora ejecutando el bucle hasta la longitud del texto.
  • Ahora lo usamos con R y máscara de patrón.
  • Ahora, desplazando a la izquierda el 1L por la longitud del patrón y luego el resultado es un y con R
  • Si es igual a cero lo imprimimos por I-len+1 de lo contrario devuelve -1
  • La salida es el índice del texto, donde coincide el patrón.

Código:

Java

// Java Program to implement Bitap Algorithm.
 
import java.io.*;
import java.io.IOException;
 
public class GFG {
    public static void main(String[] args)
        throws IOException
    {
 
        System.out.println("Bitap Algorithm!");
 
        String text = "geeksforgeeks";
 
        String pattern = "geeks";
 
        // This is an object created of the class for
        // extension of functions.
        GFG g = new GFG();
 
        // Now here we go to findPattern functions , we two
        // arguments.
        g.findPattern(text, pattern);
    }
 
    public void findPattern(String t, String p)
    {
 
        // we convert the String text to Character Array for
        // easy indexing
        char[] text = t.toCharArray();
 
        // we convert the String pattern to Character Array
        // to access each letter in the String easily.
        char[] pattern = p.toCharArray();
 
        // Index shows the function bitap search if they are
        // equal at a particular index or not
        int index = bitap_search(text, pattern);
 
        // If the pattern is not equal to the text of the
        // string approximately Then we tend to return -1 If
        // index is -1 Then we print there is No match
        if (index == -1) {
            System.out.println("\nNo Match\n");
        }
 
        else {
 
            // Else if there is a match
            // Then we print the position of the index at
            // where the pattern and the text matches.
            System.out.println(
                "\nPattern found at index: \n" + index);
        }
    }
 
    private int bitap_search(char[] text, char[] pattern)
    {
 
        // Here the len variable is taken
        // This variable accepts the pattern length as its
        // value
        int len = pattern.length;
 
        // This is an array of pattern_mask of all
        // character values in it.
 
        long pattern_mask[]
            = new long[Character.MAX_VALUE + 1];
 
        // Here the variable of being long type is
        // complemented with 1;
 
        long R = ~1;
 
        // Now if the length of the pattern is 0
        // we would return -1
        if (len == 0) {
            return -1;
        }
 
        // Or if the length of the pattern exceeds the
        // length of the character array Then we would
        // declare that the pattern is too long. We would
        // return -1
       
        if (len > 63) {
 
            System.out.println("Pattern too long!");
            return -1;
        }
 
        // Now filling the values in the pattern mask
        // We would run th eloop until the max value of
        // character Initially all the values of Character
        // are put up inside the pattern mask array And
        // initially they are complemented with zero
       
        for (int i = 0; i <= Character.MAX_VALUE; ++i)
 
            pattern_mask[i] = ~0;
 
        // Now len being the variable of pattern length ,
        // the loop is set  till there Now the pattern being
        // the index of the pattern_mask 1L means the long
        // integer is shifted to left by i times The result
        // of that is now being complemented the result of
        // the above is now being used as an and operator We
        // and the pattern_mask and the result of it
       
        for (int i = 0; i < len; ++i)
            pattern_mask[pattern[i]] &= ~(1L << i);
 
       
        // Now the loop is made to run until the text length
        // Now what we do this the R array is used
        // as an Or function with pattern_mask at index of
        // text of i
 
        for (int i = 0; i < text.length; ++i) {
 
            R |= pattern_mask];
 
            // Now  result of the r after the above
            // operation
            // we shift it to left side by 1 time
 
            R <<= 1;
 
            // If the 1L long integer if shifted left of the
            // len And the result is used to and the result
            // and R array
            // If that result is equal to 0
            // We return the index value
            // Index=i-len+1
           
            if ((R & (1L << len)) == 0)
 
                return i - len + 1;
        }
 
        // if the index is not matched
        // then we return it as -1
        // stating no match found.
       
        return -1;
    }
}
Producción

Bitap Algorithm!

Pattern found at index: 
0

Publicación traducida automáticamente

Artículo escrito por saransh9342 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *