Имя: Пароль:
1C
1С v8
Схожесть строк, много записей
,
0 Nikoss
 
03.10.12
13:37
Есть 2 списка значений (или ТЗ, не суть) с 2тыс записей и 40тыс соответственно, запись - строка. Нужно каждую строку первого списка сравнить на схожесть со всеми из второго, и выдать самые похожие строки. Есть функции, например, написанная ниже. НО! 2к * 40к = 80 млн, 80 миллионов вызовов... в общем выполняться будет часов 15(по примерной прикидке). Есть ли варианты решения такой задачи побыстрее?

[CODE]
Функция Релевантность(выр1,выр2)
   Длина1 = СтрДлина(Выр1);
   Длина2 = СтрДлина(Выр2);
   
   СовпавшихСимволов = 0;
   Сч = 1;
   Для Сч = 1 По Длина1 Цикл
       Символ = Сред(Выр1,Сч,1);
       НомерПозиции = Найти(Выр2,Символ);
       Если НомерПозиции = 0 Тогда
           Продолжить;
       Иначе
           СовпавшихСимволов = СовпавшихСимволов + 1;
           Выр2 = Лев(Выр2,НомерПозиции-1)+Сред(Выр2,НомерПозиции+1);
       КонецЕсли;
   КонецЦикла;
   рел="";
   Если (Длина1<>0) и (Длина2<>0) тогда рел=цел((СовпавшихСимволов/Длина1 + СовпавшихСимволов/Длина2)/2*100);КонецЕсли;
   возврат рел;
КонецФункции
[/CODE]
1 Nikoss
 
03.10.12
13:37
и как спрятать код под плюсик(спойлер)?
2 rs_trade
 
03.10.12
13:39
(0) на скуле, регулярками.
3 rs_trade
 
03.10.12
13:41
джойн по подобно или что там у тебя за условие
4 Deon
 
03.10.12
13:41
(0) Чё-то мне кажется, что ты загнул с 15 часами
5 Deon
 
03.10.12
13:44
Кстати эту функцию релевантности я тут уже много раз встречал, она ж для 7ки написана )
6 Азазелло
 
03.10.12
13:47
(5) суровая функция. релевантность авб, абв = релевантность авб, вба = 100
7 Азазелло
 
03.10.12
13:47
+(6) * абв, вба
8 Nikoss
 
03.10.12
13:51
(4), пробовал 2 строки в первой таблице на те же 40к во второй: 55 секунд.
9 Nikoss
 
03.10.12
13:51
(6), да от сюда откуда-то и брал. Есть другие, но они еще дольше.
10 rs_trade
 
03.10.12
13:54
(8) в запрос запихни. пусть сервер субд исполняет. оп всяко быстрее должен.
11 hhhh
 
03.10.12
13:56
ну 15 часов нормально для такой задачки. Поставите на выполнение на ночь.
12 МихаилМ
 
03.10.12
13:57
идея простая
1) найти полностью совподающие
и исключить их из сопоставления

2) найти условно совпадающие те если известно, что сравниваемые строки
могут содержать определенные значения, то дополнить ими и повторить поиск.


3) в ф-ции релевантности добавить параметр точность
и вычислять функцию только до достижения точности
это менеее ресурсоёмко по сравнению с Сред().

4)
в качестве итератора используйте скд.
13 Deon
 
03.10.12
14:02
(8) Можно распределить задачу между компами сети, пусть напрягаются
14 Deon
 
03.10.12
14:03
(6) Вроде как 33% выдаст
15 Азазелло
 
03.10.12
14:04
(14) я там очепятался ) для абв, абв = абв, вба = 100
16 МихаилМ
 
03.10.12
14:14
+(12)
опятьже разложить посимвольно 1 раз . уже ускоритесь раз в 100.
если клиент серверный вариант - используйте фоновые задания в количестве равном процусоров (ядер)
17 Кирпич
 
03.10.12
14:14
на быстром языке программирования написать и все дела