/** * Method creates node * @param $string * @param $left * * @return array|null */ public function createNode($string, $left) { if ($string == null || $string == '') { return null; } $alphabet = WaveletTree::getAlphabet($string); $isLeaf = false; if (count($alphabet) == 1 || count($alphabet) == 2) { $isLeaf = true; } $letters = array_keys($alphabet); usort($letters, "WaveletTree::sortLetters"); //set half of letters to 0 half to 1 $dictionary = []; for ($i = 0; $i < count($letters) / 2; $i++) { $dictionary[$letters[$i]] = 0; } for ($i = count($letters) / 2; $i < count($letters); $i++) { $dictionary[$letters[$i]] = 1; } $result = []; for ($i = 0; $i < strlen($string); $i++) { $result[$i] = $dictionary[$string[$i]]; } //translate dictionary to node strings return [new Node($result, $isLeaf, $left, $left + count($dictionary) - 1), $dictionary]; }