Итак,остановился я на шаблонах.Теперь нужно решить вопрос с ключами массива.Может можно решить проблему PHP-ссылками.Но мне нужно эффективное решение.Придётся всё-таки использовать foreach в этом случае к сожалению,то есть перебирать все шаблоны этого уровня.
Итак,нужно будет создать специальный массив который будет перебираться вместе с каждым словом.Однако это плохое решение нашей задачи в плане скорости.То есть нам нужен другой тип массивов->ассоциативный но в котором может быть поиск в ключах
.Хотя это пока бессмыысленно,потому что у меня предчувствие что ассоциативный массивы даже в C++ работают путём перебора(вообще нужно узнать механимизм этих массивов).Ну хорошо ,что тогда нужно заменить внутри существующего кода,нужно добавить ещё один foreach вместо if ,однако и другой вариант нужно сохранить в виде комментария.
Однако массив который нужно перебрать многомерный,одно измерение которого определено заранее,второе измерние и третье которое нужно перебрать.Второе измерение ключ в виде строки ,третье измерение — в виде цифры.То есть обязательно нужен
//$шаблон[$lo][$корень][$gh]
foreach($шаблон[$lo] as $kk=>$vk)
{
$key=split('|',$kk);
/*
$key[0]-номер шаблона с таким же корнем
$key[1]-корень слова
$key[2]-часть речи
$key[3]-падеж
$key[4]-число
$key[5]-время
*/
$flag=true;
if(strlen($key[1])>0){if(strpos(''.$key[1],''.$kon[$g][$i])===false){$flag=false;}}//Корень
if(strlen($key[2])>0){if(strpos(''.$key[2],''.$tre[$g][$i])===false){$flag=false;}}//Часть речи
if(strlen($key[3])>0){if(strpos(''.$key[3],''.$pad[$g][$i])===false){$flag=false;}}//Падеж
if(strlen($key[4])>0){if(strpos(''.$key[4],''.$chi[$g][$i])===false){$flag=false;}}//Число
if(strlen($key[5])>0){if(strpos(''.$key[5],''.$vre[$g][$i])===false){$flag=false;}}//Время
if($flag===true)
{
$условия=$vk;
//Если шаблон оказался тем чем нужно ,то тут подключаем остальной код
....
}
}
Всё же пришлось в ущерб оптимизации изменить исходный код.А пока надо ознакомиться с организацией ассоциативных массивов на машшинном уровне для оптимизации.
Вообщем-то я думаю можно создать ассоциативные массивы используя часть адресов в оперативной памяти если использовать 32-битную систему такие ключи будут выглядеть так как адреса ячеек памяти оперативки 00ff00ff однако в таких ключах может сохраняться только 2-3 байтные значения и цифры такие же,что означает что длины строк для этого способа до 2х символов или чисел до 65536.Этот способ позволяет максимально убыстрить процесс поиска в нужного ключа в оперативной памяти,то есть в оперативной памяти создаётся своеобразная сеть по типу нейронной которая собирает статистику как и система поиска закономерностей однако в более полной реализации она выходит за рамки ОС
Соответственно в данной задаче нужен подробнейший парсер русского языка.
Но мне пока не хватает ума сформировать и представить всю модель пасрера сразу.Я двигаюсь методом обратного инженеринга,то есть исправляю исключения и ошибки и дополняю новыми элементами.Такой путь слишком не рациональный и сложный и главное медленный ,у меня такое чувство что я что-то пропускаю перед самым носом.Вообщем задча стоит так:
1)как сформировать самым эффективным и полным способом парсер русского языка?
2)как сформировать самым эффективным и полным способом парсер всех языков возможных с использованием двоичных данных(строк)?