Prikaz jedne poruke
Stara 9.11.2015, 13:37   #5
OgnjenM
Član
 
Član od: 16.1.2010.
Lokacija: https://www.ognjenmarceta.com/
Poruke: 271
Zahvalnice: 77
Zahvaljeno 51 puta na 32 poruka
Određen forumom Re: Slagalica Kviz

Probao sam da prebacim trenutni kod C# na server (PHP). Ovakav isti kod (C#) na uredjajima radi uncinkovito i veoma brzo. Dok PHP je dosta sporiji otprilike mu treba 15-20 sekundi da pronadje najduzu rijec. Ucitavanje rijecnika je 2 sekunde ostalo je utroseno na pronalazenje. Da li neko mozda ima ideju kako bih mogao ubrzati taj proces?


parse_dictionary.php

Kod:
<?php

$ouput = array();
$mysqli = new mysqli('localhost','root','','multiquiz_db');
$mysqli->set_charset('utf8'); 
if ($result = $mysqli->query("SELECT word FROM words_live")) {
    while($row = $result->fetch_array(MYSQL_ASSOC)) {
        //echo(mb_convert_encoding($row['word'], 'HTML-ENTITIES', 'utf-8'));
        array_push($ouput, $row['word']);
    }

    //echo utf8_decode(json_encode($ouput));
}

$result->close();
$mysqli->close();

?>

Trie.php
Kod:
  <?php

class Trie
{
    public $children = array();
    public $value = null;
    public $word = null;

    public function __construct($value = null)
    {
        $this->value = $value;
    }

    public function adda($array)
    {
        $this->addb($array, 0);
    }

    public function addb($array, $offset)
    {
        foreach ($this->children as $child)
        {
            if($child->value == $array[$offset])
            {
                $child->addb($array, $offset + 1);
                return;
            }
        }

        $trieNode = new Trie($array[$offset]);
        array_push($this->children, $trieNode);

        if($offset < count($array) - 1)
        {
            $trieNode->addb($array, $offset+1);
        }
        else
        {
            $trieNode->word = implode(" ", $array);
        }
    }
}
?>
Index.php
Kod:
<?php
include 'Trie.php';
include 'parse_dictionary.php';
ini_set('memory_limit', '1024M'); // or you could use 1G
header('Content-Type: text/html; charset=utf-8');
mb_internal_encoding("UTF-8"); 
class LongestWord
{
    public $root = null;

    public function __construct($ouput)
    {
        $this->root = new Trie();
        foreach ($ouput as $word)
        {
            //echo($word);
            //echo(str_split_unicode($word)[0]);
            $this->root->adda(str_split_unicode($word));
        }
    }

public function search($cs)
{
    return $this->visit($this->root, $cs);
}

function visit($n, $allowedCharacters)
{
    $bestMatch = null;
    if(count($n->children) == 0)
    {
        $bestMatch = $n->word;
    }

    foreach($n->children as $child)
    {
        if($this->contains($allowedCharacters, $child->value))
        {
            $result = $this->visit($child, $this->remove($allowedCharacters, $child->value));

            if($bestMatch == null || $result != null && strlen($bestMatch) < strlen($result))
            {
                $bestMatch = $result;
            }
        }
    }
    return $bestMatch;
}

function remove($allowedCharacters, $value)
{
    $newDict = $allowedCharacters;
    if(($key = array_search($value, $newDict)))
    {
        unset($newDict[$key]);
    }

    return $newDict;
}

function contains($allowedCharacters, $value)
{
    foreach($allowedCharacters as $x)
    {
        if($value == $x)
        {
                //  echo $value . "=====". $x. "|||||||";
            return true;
        }
        else
        {
            //echo $value . "!!===". $x. "|||||||";
        }
    }
    return false;
}
}

function str_split_unicode($str, $l = 0) {
    if ($l > 0) {
        $ret = array();
        $len = mb_strlen($str, "UTF-8");
        for ($i = 0; $i < $len; $i += $l) {
            $ret[] = mb_substr($str, $i, $l, "UTF-8");
        }
        return $ret;
    }
    return preg_split("//u", $str, -1, PREG_SPLIT_NO_EMPTY);
}


$chars = 'IIOIOFNČGDĆJ';
$testCharacters = str_split_unicode($chars);
$lw = new LongestWord($ouput);
echo($lw->search($testCharacters));

?>
OgnjenM je offline   Odgovor sa citatom ove poruke
Sledećih 2 korisnika se zahvaljuje korisniku OgnjenM na korisnoj poruci:
borisbex (12.2.2024), mario slagalicar (12.11.2018)