Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Увеличить скорость выполнения [D7, XP]


Страницы:   1 2

User ©   (2010-04-06 22:02:00) 

Здравствуйте. Очень нужен совет опытных людей.
У меня имеется список строковых предложений (По 4-5 слов в среднем) загруженных в TStringList. Количество предложений около 50 тыс.

Пример предложений:
0. Товарищество с ограниченной ответственностью
1. Открытое Акционерное Общество
2. закрытое Акционерное Общество
и т.п.

При вводе пользователем определенного текста, например  "Акционерное общество", система ищет данный текст по нашему списку, и сравнивает с помощью "специальной функции сравнения 2х текстов" на процент схожести. Если процент переваливает за (например 70%) текст из списка должен быть отображен.

Проблема в том, что поиск происходит очень долго, при явном сравнении  текстов типа (Str = SL.String[i]) Поиск на много быстрее, но функция сравнения на процент схожести, единственная самая быстрая которую я нашел. Подскажите, как можно ускорить процесс поиска, может быть использование потоков?  Если да, то если можно по подробнее. Спасибо.

Сама функция нечеткого сравнения, взято из http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1147

function CompareStrings(S1, S2: string; MatchCount: integer;
                       out NCount: integer):integer;
var i, j, Count_, Count: integer;
   S1_, S2_: String;

 function Flag:Boolean;
 begin
   Result:= false;
   if (i + Count_ <= Length(S1_))and(j + Count_ <= Length(S2_)) then
     if (UpCharRus(S1_[i+Count_]) = UpCharRus(S2_[j+Count_]))
     {and(S1[j+Count_] <> ' ')} then
       Result:= true;
 end;

begin
 Count:= 0;
 NCount:= 0;

 S1_:=S1;
 ReplaceAllStr(S1_, ' ', '');
 S2_:=S2;
 ReplaceAllStr(S2_, ' ', '');
 if (S1_ = '')or(S2_ = '') then
     begin
       Result:= 0;
       NCount:= 255;
       Exit;
     end;
 i:= 1;
 repeat
   j:= 1;
   repeat
     if (UpCharRus(S1_[i]) = UpCharRus(S2_[j])){and(S1[i] <> ' ')} then
       begin
         Count_:= 1;
         while flag do
           Inc(Count_);
         i:= i + Count_ - 1;
         j:= j + Count_ - 1;
         if Count_ >= MatchCount then
         Count:= Count + Count_;
       end;
     inc(j)
   until j >= Length(S2_);
   inc(i)
 until i >= Length(S1_);

 if Length(S1_) < Length(S2_) then
   Count_:= Length(S1_)
 else
   Count_:= Length(S2_);
Result:= Count;
NCount:= Count_ - Count;
end;


User   (2010-04-06 22:05:00) [21]

Забыл добавить, поиск по вхождению исключается, поиск должен быть именно "нечеткого сравнения"


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо