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