Hi Ich schreibe eine PHP-Klasse, Rabin-Karp-Algorithmus zu implementieren. Ich habe Probleme mit dem Re-Hashing-Teil. Dieser Code enthält keinen übereinstimmenden Teil der Zeichen. Ich musste aufhören, da es aufgrund des Problems mit dem Hashing nie zu Hash-Codes passte. Jemand bitte hilf mir es herauszufinden.Implementierung von Rabin-Karp-Algorithmus mit PHP
<?php
class RabinKarp
{
/**
* @var String
*/
private $pattern ;
private $patternHash ;
private $text ;
private $previousHash ;
/**
* @var Integer
*/
private $radix ;
private $prime ;
private $position ;
/**
* Constructor
*
* @param String $pattern - The pattern
*
*/
public function __construct($pattern)
{
$this->pattern = $pattern;
$this->radix = 256;
$this->prime = 100007;
$this->previousHash = "";
$this->position = 0;
$this->patternHash = $this->generateHash($pattern);
}
private function generateHash($key)
{
$charArray = str_split($key);
$hash = 0;
foreach($charArray as $char)
{
$hash = ($this->radix * $hash + ord($char)) % $this->prime;
}
return $hash;
}
public function search($character)
{
$this->text .= $character;
if(strlen($this->text) < strlen($this->pattern))
{
return false;
}
else
{
$txtHash = 0;
echo $this->previousHash . "<br/>";
if(empty($this->previousHash))
{
$txtHash = $this->generateHash($this->text);
$this->previousHash = $txtHash;
$this->position = 0;
}
else
{
// The issue is here
$charArray = str_split($this->text);
$txtHash = (($txtHash + $this->prime) - $this->radix * strlen($this->pattern) * ord($charArray[$this->position]) % $this->prime) % $this->prime;
$txtHash = ($txtHash * $this->radix + ord($character)) % $this->prime;
$this->previousHash = $txtHash;
}
if($txtHash == $this->patternHash)
{
echo "Hash Match found";
}
}
}
}
$x = new RabinKarp("ABC");
$x->search("Z");
$x->search("A");
$x->search("B");
$x->search("C");
?>
Vielen Dank.
Funktioniert dieser Algorithmus mit Multi-Byte-String-Werten? In diesem Fall sollten Sie 'mb_' Funktionen zum Aufteilen und Berechnen der Länge verwenden. –
Dieser Algorithmus wurde für die serielle Übertragung geschrieben. Nehmen wir an, Sie erhalten nacheinander jeweils ein Zeichen. Sobald ich den Charakter erhalten habe, beginne ich mit der Suche. Der obige Code funktioniert gut für mich. Das einzige Problem ist das Re-Hashing. Tatsächlich ist der Hash-Wert falsch. –
@PrasadRajapaksha Hallo Herr Prasad .. Könnten Sie die festen Codes bitte posten. Ich bin auf der Suche nach der Implementierung von Rabin-Karp-Algorithmus für mehrere Muster mit PHP. Bitte ... Vielen Dank im Voraus – Ayuktia