Страницы: 1 2 3 След.
RSS
VBA Как организовать сверхбыстрый поиск пары слов с пропущенными буквами?
 
Цитата
Hugo написал:
А у нас не хватает всех наших мощностей чтоб угадать что вообще нужно
масса данных  = 2 столбца: слева текст1 и справа текст2
в виде =  (диапазон, массив, словарь. коллекция,......)

x_find=  (*ол*ко *во*ач*ва*)  (изначальная фраза "только поворачивайся")  
отыскать x_find  в текст1. Установить соответствующий найденному текст 2  
поиск был максимально быстро

для следующего объема
у "масса данных" число строк = 100.000...1.000.000  
число таких "масса данных" =  10...100
количество доступов к каждому диапазону 100...10.000 раз
Изменено: tod2020 - 20.08.2017 11:42:30
 
Насколько я понял искомое слово отредактировать нельзя? Даже учитывая огромный массив данных по ячейке формула отработает достаточно быстро.
Хотя странно у меня ни if like не отработал, ни "=" зато .find(x_find) работает аж бегом. Но это все к словарю не прикрутишь (
Изменено: Илья Демид - 19.08.2017 16:03:27
 
Решения нет?
 
Искать в массиве, словарь не нужен.
Код
Sub uuu()
    Dim a()
    Dim i&
'-----------
    a = Range("Table1").Value
    For i = 1 To UBound(a)
        If a(i, 1) Like Cells(9, 3) Then
            Beep
            MsgBox a(i, 1)
        End If
    Next
End Sub
Изменено: kalbasiatka - 19.08.2017 18:14:57
 
Нет, нужно в словаре потому что объемы гигантские и скорости высокие нужны
 
Цитата
tod2020 написал:
Нет, нужно в словаре
Ну значит не будет ни как
 
Может есть средство? Коллекции может? Но словари получше
 
В данном случае массив не будет менять своего размера, но будет использоваться для поиска, поэтому это наиболее быстрый способ. А найденные совпадения Вы можете в словарь.
 
Цитата
tod2020 написал:
Решения нет?
Решения все на даче... :)

Код
Sub ffffffff()
Dim a, x, i As Long
'как-то получили массив a
i = 0
For Each x In a 'For Each ... быстрее, чем For ... To... Даже с учетом i=i+1. А то Вы используете For to там где в этом нет необходимости.
  i = i + 1
  If d.exists(x) Then d(x) = d(x) & " " & i Else d(x) = i
Next
'Теперь у Вас есть Dictionary с уникальными значениями по Key
For Each x In d.Keys 'Прозваниваем по Key, ведь d.Keys - массив
'Если ошибки ситематические(т.е. имеют частые повторения), то этот способ принесет скорость.
'Если нет, то лучше по массиву сразу без создания Dictionary. Разница по времени может быть значительной
  If k Like "*ол*ко *во*ач*ва*" Then s = s & "|" & k
Next
aRes = Split(s, "|") 'получаем массив "как есть" соответствий ожидаемому условию начиная с нумерации = 1
End Sub
 
Да через Each побыстрее, но всеравно это очень долго
хочется также мгновенно находить Item по Key с пропущенными буквами.
Код
d.exists("*ол*ко *во*ач*ва*") 

может тут звездочку на какой-то спец символ заменить и exist сообразит что от него хотят
Изменено: tod2020 - 20.08.2017 11:17:21
 
tod2020, везде есть инструменты, у которых свои свойства и методы, и если их изучать, то постепенно придет понимание того что и от кого ждать, а так просто, быстро получить что-то не получиться...
Перебор массива это самый быстрый способ, если б не словарь, например, но запись в словарь медленней, чем массив и т. д.
Коллекция быстрей словаря, но ней нельзя многого того, что можно со словарем...
Объект у которого есть метод типа obj("*ол*ко *во*ач*ва*") будет в чем-то медленней, но заточен для другого по своим возможностям и т. д.
 
Цитата
tod2020 написал:
может тут звездочку на какой-то спец символ заменить и exist сообразит что от него хотят
Тут пишут, что проект в думу вносят для признания равнозначности похожести, в силу существующих отказов людям считать документы, например, с именами Наталья и Наталия, равными. А вы хотите от простого в сущности объекта, работающего с понятиями уникальный ключ и его значение, того же, что и человек не всегда готов сделать.
Google на таком поиске осмысленного вырос в гиганта (ну, может и не только на этом).
Увы, в VBA, чтобы в массиве быстро искать похожее, нужно будет строить достаточно сложную конструкцию, или медленно - полный перебор.
 
я не хочу верить в безвыходность
Может переменной присвоить результат какого нибудь оператора типа Like ("*ол*ко *во*ач*ва*") и по этой переменной искать??
Изменено: tod2020 - 20.08.2017 11:18:08
 
Цитата
tod2020 написал:
ипа Like ("*ол*ко *во*ач*ва*") и по этой переменной искать??
Искать где? Как искать в массиве вам предложил kalbasiatka, как средствами Excel - Илья Демид Но и то и другое - это полный перебор всех исходных фраз на тест - удовлетворяют ли шаблону.
 
Цитата
Андрей VG написал:
Искать где?
VBV = оператор типа Like ("*ол*ко *во*ач*ва*")
dic1.item(VBV)

item быстрее чем Each в 1000 раз, я замерял
Изменено: tod2020 - 20.08.2017 00:47:50
 
Цитата
tod2020 написал:
методом exist в 1000 раз быстрее чем Each
А как связаны два метода exists и Each?  У них по сути разные задачи. и exists обычно используют в цикле, если необходимо найти более одного соответствия!
"Все гениальное просто, а все простое гениально!!!"
 
Можно при занесении в словарь сразу анализировать на это Like ("*ол*ко *во*ач*ва*") и заносить не сам ключ, а результат анализа.
Только вот зачем? Если сразу известно что это значение годится - сразу его и берите, зачем его потом искать в словаре?
Единственный смысл вижу такой - есть например десяток (или сотня) разных  "Like ("*ол*ко *во*ач*ва*")", причём неизвестно что когда именно будем искать (например юзер будет выбирать из предложенного списка, а словарь уже "набит"), тогда можно при наполнении словаря сразу проанализировать и разложить например по ключам 1 - 100 эти значения.
Затем когда нужно найти например что  Like ("*ал*ка *ва*ач*ва*") (т.е. №25) - берём из словаря всё что собрано для ключа 25.
 
Цитата
Nordheim написал:
А как связаны два метода exists и Each?
я ошибся не exist а item
 
а Item как связан с Each. Item это не метод а элемент словаря.
"Все гениальное просто, а все простое гениально!!!"
 
Hugo, не понял не могу представить
 
Цитата
Nordheim написал:
а Item как связан с Each.
здесь я говоря про Each я говорю о цикле с использованием Each
метод Item быстрее в 1000 раз по сравнению с перeбором с помощью цикла с использованием Each
Изменено: tod2020 - 20.08.2017 00:50:49
 
Цитата
tod2020 написал:
здесь я говоря про Each я говорю о цикле и использованием Each
Я понимаю , что имеется ввиду For Each In ........Next , но как можно сравнивать цикл и элемент словаря?
"Все гениальное просто, а все простое гениально!!!"
 
Если хотите перебрать все ключи - быстрее перебирать массив, словарь не нужен.
Если из всего массива позже нужно отобрать несколько (или одно) КОНКРЕТНОЕ значение - тогда есть смысл в словаре.
 
Цитата
tod2020 написал:
объемы гигантские
О каких объемах идет речь? 1млн, 10млн, 1млрд? Может быть Вы просто выбрали не тот инструмент?
 
планируется для диапазона(переведенного в словарь например) число записей между 100.000 и 1.000.000  
число таких диапазонов 10 -100
количество доступов к каждому диапазону 100 - 10.000 раз

нужно мегамоментальное поисковое и когда ещё идет поиск по неопределнным буквам и даже пропущенным словам
Изменено: tod2020 - 20.08.2017 11:19:53
 
Можно увидеть code Item  который создали программисты VBA и подкорректировать или создать свою функцию?
словарь это же наверно обыкновенный arrey и применить к обкновенному arrey поисковую лоигку(которую наверно оттачивали десятилетиями) взятую из Item с возможностью Like
Изменено: tod2020 - 20.08.2017 01:17:33
 
tod2020, я скопировал Ваш "словарь" пока не стало 0,5млн+ записей и протестировал на следующем коде:
Код
Sub FindLike()

Dim a()
Dim l As Long
Dim dic As New Dictionary
Dim t As Long
Dim sFind As String

t = Timer
a = [A2:A524289].Value2
sFind = Cells(9, 3)
For l = 1 To UBound(a)
    If a(l, 1) Like sFind Then
        dic.Add l, a(l, 1)
    End If
Next
Debug.Print (Timer - t) * 1000

End Sub

На домашнем компьютере это заняло 1,5 секунды, на сервере это будет куда быстрее. Не знаю на чем и к каким скоростям Вы стремитесь, но все-таки похоже, что Вы выбрали не тот инструмент.

Изменено: iMrTidy - 20.08.2017 01:43:30
 
iMrTidy, Вы в цикле многократно обращаетесь к ячейке. Попробуйте заменить на переменную - должно быть быстрее.
 
Да, верно, прошляпил, вот что значит брать за основу чужой код, теперь колеблется от 100 до 800 мс.
 
И если на то пошло, то вот ссылки по проблематике:
https://en.wikipedia.org/wiki/Approximate_string_matching
https://en.wikipedia.org/wiki/Levenshtein_distance#Computing_Levenshtein_distancehttps://www.topcoder.com/community/data-science/data-science-tutorials/introduction-to-string-searching-algorithms/
http://users.ece.utexas.edu/~valvano/embed/chap8/chap8.htm
Страницы: 1 2 3 След.
Наверх