|
Схожесть строк, много записей | ☑ | ||
---|---|---|---|---|
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
|
на быстром языке программирования написать и все дела
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |