Всем доброе утро! У меня друг - логопед, ему нужна программа, которая находила слова различающиеся только одной буквой. Я решил ему помочь) Вот код: Код (Text): <?php $startTime = date("s"); $numfor = 0; $file = 'db.txt'; $files = fopen($file,'r'); $buffer = fgets($files, 6000); $global = array(); $db = $buffer; $array = explode(" ",$db); $alfavit = array("а","б","в","г","д","е","ж","з","и","й","к","л","м","н","о","п","р","с","т","у","ф","х","ц","ч","ш","щ","ъ","ы","ь","э","ю","я"); for($i = 0; $array[$i]; $i++){ $numfor++; $slovoArray = array(); $slovo = ""; for($d = 0;$string = mb_substr($array[$i], $d, 1, 'UTF-8');$d++){ array_push($slovoArray,$string); $slovo .= $string; } for($c = 0; $slovoArray[$c]; $c++){ // пока есть буквы в слове $original = $slovoArray[$c]; for($j = 0; $alfavit[$j]; $j++){ // пока есть буквы в алфавите $numfor++; $slovoArray[$c] = $alfavit[$j]; $read = implode("", $slovoArray); //нашел эту функцию и убрал ниже стоячий код, но эта функция работает не быстро как я думал... //for($r =0; $slovoArray[$r]; $r++){ // формируем новое изменненое слово // $numfor++; // $read .= $slovoArray[$r]; //} if(array_search($read,$array) !== false && $slovo != $read){ if(!is_array($global[$slovo])){ $global[$slovo] = array(); array_push($global[$slovo],$read); }else{ array_push($global[$slovo],$read); } //echo "<b style='color:red'>".$slovo.":".$read."</b></br>"; }else{ //echo $read."</br>"; } $read = ""; $slovoArray[$c] = $original; } } } $endtTime = date("s"); echo "<h2>start time : ".$startTime.", endtime = $endtTime</h2>"; echo "<pre>"; print_r($global); echo "</pre>"; echo "<h1>количество операций: $numfor, кол. слов в массиве = ".count($array)."</h1>"; ?> Дело в том что эта функция ест очень много ресурсов, и больше чем 1000 слов посчитать не может (думает более 30 с.). Подскажите, кто знает как бы ее усовершенствовать, что-бы не ела так много ресурсов? Заранее всем огромное спасибо!
Попробуйте сравнивать слова побуквенно. Мне кажется, это должно быть быстрее. К тому же, как Вы понимаете, сравнивать можно до 2 несовпадений и только с последующими словами, которые по длине отличаются не больше, чем на 1 символ.
1. http://php.net/manual/ru/function.set-time-limit.html 2. найди алгоритм пузырьковой сортировки для примера сравнения каждого слова с другими - данный алгоритм отлично подходит для последовательного перебора всех слов в списке без повторений 3. отсортируй слова по алфавиту и кол-ву букв перед началом поиска, тогда сможешь прервать поиск на первом слове, чья длина будет больше на 2 буквы 4. продумай алгоритм сравнения двух слов - вариантов море.
Еще есть http://ru2.php.net/manual/ru/function.levenshtein.php Как минимум отфильтрует часть слов, а если поиграться с весами, то возможно и задачу решит.