Qual é o algoritmo utilizado para este efeito?

estou fazendo projeto de pesquisa para um jogo de Texto twist,o texto irá procurar automaticamente o word a partir de um dicionário e suba em seguida, e também o processo de palavras para ser encontrado automaticamente, usando o mesmo conceito com este site http://grecni.com/texttwist.php , eu também precisará fornecer um algoritmo que vou usar para o meu projeto,e eu estou planejando para incluir esta palavra unscrambler neste web site http://grecni.com/texttwist.php mas eu não sei o que algoritmo é, possivelmente, use para fazer as ações feitas no site que eu postei. será que alguém sabe que tipo, ou o que você chama de algoritmo usado, ou pode ser usado que dará os mesmos resultados, um exemplo do algoritmo será muito apreciado.

Author: wicked14, 2012-06-22

3 answers

A estrutura de dados que queres é chamada de um Gráfico de palavras acíclicas dirigidas (dawg)

Há perguntas já respondidas sobre isto:

Algoritmo para obter uma lista de todas as palavras que são anagramas de todas as substratos (scrabble)?

A gravar um algoritmo para o scrabble

Você também poderia implementar o algoritmo de levenshtein {[5] } que iria conseguir praticamente o mesmo resultado: MySQL - qual Hash Algo devo usar por isto?

Actualização:

Depois de me ter dado um desafio para criar um exemplo para demonstrar que o algoritmo surgiu com isto, como é a partir de um plugin construído para o meu cms é embrulhado em uma classe, mas você tem a idéia de que há uma demo @ http://cherone.co.uk/scrabble_suggest

Primeiro criei uma tabela com id, palavra, ordenada ( palavra = palavra actual, ordenada = a palavra alfabeticamente ordenada como por exemplo: Aardvark ordenada seria aaadkrrv) acabei de encontrar um Inglês lista de palavras nos internets.

O formulário coloca o texto e, em seguida, o texto é ordenado alfabeticamente para corresponder 1:1 a coluna ordenada, em seguida, o texto é dividido em cada caráter e, em seguida, questionado sequencialmente até o último caráter. As funções do interesse são str_sort,permute,swap talvez seu de algum interesse..

<?php 
/**
 * Scrabble solver Plugin this file is "inline" included within the frontController class
 */
Class plugin{

    function __construct($core) {
        $this->core = $core;
        $this->plugin_path = SITE_ROOT.'/core/plugins/'.$this->core->router->action.'/';
        $this->request = explode('/',$this->core->router->request);
        //Assign Page meta tags ect
        $this->core->template->meta_keywords    = 'Text,Twist,Text Twist,word,letter,scrabble,unscrambler,unscramble,word finder,puzzle,anagram,scrabble,cheat,cheater,help,helper,solve,solver,free,php';
        $this->core->template->meta_description = 'Scrabble and Anagram like word solver tool to help unscramble letters and words and cheat at your favorite word puzzle';
        $this->core->template->page_title       = $this->core->template->site_name." - Scrabble and Anagram like word solver";
        $route = (isset($this->request[2])?$this->request[2]:null);
    }

    function load(){
        set_time_limit(0);
        $data=array('var'=>$this,'result'=>'','word'=>'','word_sort'=>'');

        switch($this->core->router->subaction){
            case "index":
                $string='';
                if($_SERVER['REQUEST_METHOD']=='POST'){
                    $string = substr(preg_replace('/[^a-zA-Z]/s', '', trim(strtolower($_POST['letters']))),0,8);
                    $data['word'] = $string;
                    $string = $this->str_sort($string);
                    $data['word_sort'] = $string;
                }
                $stringLen = strlen($string);

                $result = array();
                for($i=2;$i<=$stringLen;$i++){
                    $seq = substr($data['word_sort'],0,$i);

                    $rounds = explode('|',$this->permute($seq,0,strlen($seq)));
                    $r=$i;
                    foreach($rounds as $round){
                        $result[$r] = $this->get_words($round,strlen($seq));
                        $r++;
                    }
                }

                $data['result'] = $result;

                $this->core->template->content_center = $this->core->template->loadContentView(get_class(),$this->core->router->subaction,$data);
                $this->core->template->content_left   = '';
                $this->core->template->content_right  = '';
                break;

            case "update":
                $this->insert_word_lists();
                header('Location: '.SITE_URL.'/'.$this->core->router->action);
                die;
                break;

            case "api":
                header('Content-Type: application/json');
                echo 'No api for this plugin, perhaps one comming soon. ;p';
                break;

            default:
                header('Location: '.SITE_URL.'/'.$this->core->router->action);
                die;
                break;
        }
    }

    //Query Method to search for sequenced alphabetically sorted words.
    private function get_words($word,$stringLen){
        $chars = str_split($word,1);
        $sql = "SELECT DISTINCT `word` FROM `plugin_scrabble_words` WHERE ";
        foreach($chars as $char){
            $sql .=' `sorted` LIKE "%'.$char.'%" AND';
        }
        $sql = trim($sql,'AND');
        $sql .= ' AND LENGTH(sorted) = '.$stringLen;

        $statement = $this->core->db->prepare($sql);
        $statement->execute();

        $result = $statement->fetchAll(PDO::FETCH_ASSOC);

        return $result;
    }

    //A Model method for updating the database word list.
    private function insert_word_lists(){
        set_time_limit(0);
        $lists = glob($this->plugin_path."wordlists/*.txt");
        foreach ($lists as $list){
            $words = file($list);
            foreach($words as $word){
                $word = strtolower(preg_replace('/[^a-zA-Z]/s', '', $word));
                if($this->sql_check_word($word)===false){
                    $this->sql_put_word($word);
                }
            }
        }
    }

    //A Model method for checking the database specific word.
    private function sql_check_word($word){
        $sql = "SELECT `word` FROM `plugin_scrabble_words` WHERE `word` = :word";
        $statement = $this->core->db->prepare($sql);
        $statement->bindParam(':word', $word, PDO::PARAM_STR);
        $statement->execute();
        $result = $statement->fetchAll(PDO::FETCH_ASSOC);

        if(!empty($result)){
            return true;
        }else{
            return false;
        }
    }

    //A Model method for adding the word to the database.
    private function sql_put_word($word){
        $sql = "INSERT into `plugin_scrabble_words` (word,sorted) VALUES (:word,:sorted)";
        $statement = $this->core->db->prepare($sql);
        $sorted = $this->str_sort($word);
        $statement->bindParam(':word', $word, PDO::PARAM_STR);
        $statement->bindParam(':sorted', $sorted, PDO::PARAM_STR);
        $statement->execute();
    }


    //Sort Method that will sort a sring in alphabetical order
    private function str_sort($string) {
        $tmp = str_split($string);
        sort($tmp);
        return implode('',$tmp);
    }

    //Method to generate and return all permutations of the string with | delimiter.
    private function permute($str,$i,$n) {
        if ($i == $n){
            return $str.'|';
        } else {
            for ($j = $i; $j < $n; $j++) {
                $this->swap($str,$i,$j);
                $this->permute($str, $i+1, $n);
                $this->swap($str,$i,$j);
            }
        }
    }

    //Method to swap the char at pos $i and $j of $str.
    private function swap(&$str,$i,$j) {
        $temp = $str[$i];
        $str[$i] = $str[$j];
        $str[$j] = $temp;
    }
}
?> 
 2
Author: Lawrence Cherone, 2017-05-23 11:50:59

Uma abordagem seria gerar todas as permutações possíveis das letras e combiná-las com um dicionário. Para uma sequência de caracteres N com letras, isto levaria O(N!) tempo se mantivesse o dicionário numa estrutura de dados definida.

Para sequências mais curtas (cerca de 10 caracteres), esta é uma estratégia perfeitamente boa.

Para sequências mais longas, deve fazer o inverso. Você pode fazer um loop através do dicionário e determinar se a sua sequência de caracteres tem os caracteres para faz a palavra. Para M elementos do dicionário, isto levaria mais ou menos O(M) tempo. Há várias maneiras que você pode acelerar esta técnica como pré-computar o número de cada letra em cada entrada do dicionário.

 1
Author: tskuzzy, 2012-06-22 01:06:16
Edit: o cavalheiro abaixo de mim dá um tratamento mais algorítmico e minucioso do assunto, e assim eu gostaria de direcioná-lo para a sua explicação (que emprega grande notação que a minha... embaraçosamente não).

Na verdade, embora VanDang o tenha chamado de "abordagem ingênua", não há nada de errado em testar todas as combinações possíveis do conjunto finito de caracteres dados. Desde que uma pessoa seja impedida de fornecer um número arbitrário de caracteres, existe um máximo de !n combinações de letras (com n = Número de letras, assumindo que não há repetições), e, uma vez que as palavras em inglês não têm tanto tempo, testar cada combinação não seria tão ruim.

Afinal de contas, o método de exaustão é na verdade um método aceito para otimizar grandes expressões booleanas ao gerar descrições de hardware.

 1
Author: root, 2012-06-22 01:07:35