Eğlenceli dışında hiçbir nedenle ben bir Trie bugün uygulanmaktadır. Şu anda o () ekleyin ve arama (), (remove) da uygulanması gerektiğini destekler ama ileri oldukça düz olduğunu düşünüyorum.
Bu tamamen işlevseldir, ancak verilerle traya doldurmak benim tadı için biraz fazla sürer. Ben veri kaynağı olarak bu listeyi kullanarak ediyorum: http://www.isc.ro/lists/twl06.zip (SO üzerinde başka bir yerde bulundu). Bu yük ~ 11'leri alır. Benim ilk uygulama ben zaten bunu bir güzel performans destek verdi, ama ben yine de :) memnun değilim ~ 15 saniye sürdü
Benim soru: başka ne bana bir (önemli) performans destek verebilir? Ben bu tasarım ile bağlı değilim, tam bir revizyon kabul edilebilir.
class Trie
{
private $trie;
public function __construct(TrieNode $trie = null)
{
if($trie !== null) $this->trie = $trie;
else $this->trie = new TrieNode();
$this->counter = 0;
}
public function add($value, $val = null)
{
$str = '';
$trie_ref = $this->trie;
foreach(str_split($value) as $char)
{
$str .= $char;
$trie_ref = $trie_ref->addNode($str);
}
$trie_ref->value = $val;
return true;
}
public function search($value, $only_words = false)
{
if($value === '') return $this->trie;
$trie_ref = $this->trie;
$str = '';
foreach(str_split($value) as $char)
{
$str .= $char;
if($trie_ref = $trie_ref->getNode($str))
{
if($str === $value) return ($only_words ? $this->extractWords($trie_ref) : new self($trie_ref));
continue;
}
return false;
}
return false;
}
public function extractWords(TrieNode $trie)
{
$res = array();
foreach($trie->getChildren() as $child)
{
if($child->value !== null) $res[] = $child->value;
if($child->hasChildren()) $res = array_merge($res, $this->extractWords($child));
}
return $res;
}
}
class TrieNode
{
public $value;
protected $children = array();
public function addNode($index)
{
if(isset($this->children[$index])) return $this->children[$index];
return $this->children[$index] = new self();
}
public function getNode($index)
{
return (isset($this->children[$index]) ? $this->children[$index] : false);
}
public function getChildren()
{
return $this->children;
}
public function hasChildren()
{
return count($this->children)>0;
}
}