Страницы: Пред. 1 2 3 След.
RSS
VBA Как организовать сверхбыстрый поиск пары слов с пропущенными буквами?
 
Цитата
iMrTidy написал:
Да, верно, прошляпил, вот что значит брать за основу чужой код, теперь колеблется от 100 до 800 мс.
если 50 таких диапазонов разных и поиск в каждом всреднем по 5000 раз то будет

500мс * 50 * 5000 = 125.000 сек = 35 часов
долговато
 
Может это поможет чтонибудь придумать Метод Array.BinarySearch ??? заранее можно понять это эффективное или нет?
может Метод Array.Find(Of T)(T(), Predicate(Of T)) . Тут нельзя сделать так просто arr.Find(X_find) тут в примере накручено куча строчек кода какихто, что прочесть то не могу

у меня не хватает мощности чтобы понять самому
Изменено: tod2020 - 20.08.2017 11:21:04
 
А у нас не хватает всех наших мощностей чтоб угадать что вообще нужно :(
 
Цитата
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:30:23
 
Задача из разряда: авто уровня Нива заставить работать на трассе Формулы 1 и требовать победы.
Вы в двух темах на протяжении 2 (3?) дней разбираете одно и то же. Хочется, понятно... Но есть же разумный предел... Используйте програмы работы с базами  данных.
 
Цитата
tod2020 написал:
количество доступов к каждому диапазону 100...10.000 раз
- зачем/почему?
Вообще думаю тут Эксель/VBA совершенно "не в тему", тут что-то вроде гугля/яндекса нужно.
 
Цитата
vikttur написал: Используйте програмы работы с базами  данных.
не умею я такого
 
Я вот не умею летать на самолете. Что теперь, биться в истерике и требовать, чтобы велосипед летал со сверхзвуковой скоростью? :)
Можно ведь накопить денег на перелет или не спеша поездом добраться... Или попутными, с пересадками...
Ну, не полетит велосипед!
 
Методы Array.BinarySearch или Array.Find(Of T)(T(), Predicate(Of T)) обладают сверхскоростными характеристиками?
 
Цитата
vikttur написал:
Я вот не умею летать на самолете. Что теперь, биться в истерике и требовать, чтобы велосипед летал со сверхзвуковой скоростью?
Форумчане, чтоб прояснить некоторые моменты о ТС - сей персонаж с мая месяца постит темы о смарттаблицах. И в теме об обращении к диапазону опять же смарттаблицы в ответ на предложенный вариант пишет:
Цитата
tod2020 написал:
kuklp, ListObject не интерсует
Т. е. чел убежденный дилетант, невежда. Вникать и изучать ВБА он принципиально не желает. "Хочу чтобы все!" и все тут. Ссылка на упомянутую тему. И там же опять:
Цитата
tod2020 написал:
сделать бы так чтобы код был без указания листа
. Так что не удивляйтесь. :(
Изменено: kuklp - 20.08.2017 12:41:12
Я сам - дурнее всякого примера! ...
 
Сергей, ссылка не туда
 
Цитата
tod2020 написал:
Методы Array.BinarySearch или Array.Find(Of T)(T(), Predicate(Of T)) обладают сверхскоростными характеристиками?
Нет, они также просматривают весь массив данных.
Цитата
vikttur написал:
Используйте програмы работы с базами  данных.
Виктор, не поможет. По первой задаче - поиск точного соответствия, да - не нужно будет создавать словарь, он будет постоянно храниться в базе. С нечётким поиском, присоединюсь к Игорю
Цитата
Hugo написал:
тут что-то вроде гугля/яндекса нужно.
чтобы было быстро.tod2020, разберитесь уже со словарями и алгоритмами поиска, чтобы не пытаться подгонять под желаемое всё что угодно.
 
ну если мы изобличать начали  то я могу сказать следующее kuklp,   не очень высокого уровня морального развития, для детей такое характерно, посколь:


Цитата
kuklp написал:
И в теме об обращении к диапазону опять же смарттаблицы в ответ на предложенный вариант пишет:Цитата tod2020  написал:
kuklp, ListObject не интерсует
- Мне просто не нужна была смарт таблица мне нужен было строго Range потомучто удобнее работатает
- Вас очень задело тогда отказ, не переносите отказы? )))))) (смеюсь), как же с женщинами тогда?
- плюс эта злопамятство  - этож надо помнить это что отказали и ещё раз и тут акцентировать внимание
- надо быть таким максимально гнусным, человек старается максимально изобличать другого и даже ткнул в лишний магкий знак в слове

Цитата
kuklp написал:
Вникать и изучать ВБА он принципиально не желает. "Хочу чтобы все!" и все тут.
- какой же человек злостный что предпочитает такую интерпертацию
- ой как я вникаю в силу своих возможностей и обстоятельств мало кто наверное с абсолютного нуля (ваще не зная чё такое редактор VBA) и до создания уже работающих программ за 1,5 мес всё это сделать
Изменено: tod2020 - 20.08.2017 13:11:25
 
Исправил ссылку.
Я сам - дурнее всякого примера! ...
 
tod2020, сбавьте обороты! Причём тут Ваш отказ?
 
Цитата
Юрий М написал:
tod2020 , сбавьте обороты!
Да тогда я не стал характеризовать человека и даже написал "что он мне причинил много боли"  чтобы человек почувствовал своё величие
Но щас он снова свою гнусность включил и я потому вот ...
Изменено: tod2020 - 20.08.2017 12:53:44
 
tod2020, бан совсем рядом. Хватит!
 
Цитата
Юрий М написал:
tod2020 , бан совсем рядом. Хватит!
хорошо, понял
 
Цитата
tod2020 написал: 500мс * 50 * 5000 = 125.000 сек = 35 часов
Это скорость домашнего компьютера. На сервере будет в разы быстрее, а на пуле серверов речь пойдет о секундах или даже миллисекундах, все зависит от мощностей.
Я дал Вам несколько ссылок на теорию по Вашему вопросу. Ознакомьтесь, возможно, придет понимание того, как в Вашем конкретном случае можно будет реализовать хранение и поиск, чтобы максимально минимизировать время.
 
tod2020, тут тема есть про скачивание файла через IE - не Вы, случайно? Точно так же человек отстаивает свою позицию.
Ответ на вопрос можно ли в словаре искать неточное совпадение - нет. Это всё равно будет цикл.
Для ускорения поиска по массиву, как уже говорилось, искомое значение берём в переменную и, если совпадение будет одно, то используем exit for после того, как нашли значение.
Код
s = Cells(9, 3)
For i = 1 To UBound(a)
    If a(i, 1) Like s Then
        MsgBox a(i, 2)
        Exit For
    End If
Next
 
Можно ли применить функцию Find или Match для
массива ?
Словаря?
Коллекцции?
Дипазанна?
 
Мне тут пришла идея подключить регэкспы, но чет шаблон не могу составить.
Код
Public Sub findPattern()
Dim regEx As Object, oDict As Object
Dim s As String, s1 As String
Dim rowLast As Long
Dim arrWords, unoWords, regRez
Const strRaz = "||"

Set oDict = CreateObject("Scripting.Dictionary")
oDict.CompareMode = 1
With ActiveSheet
    rowLast = .Cells(Rows.Count, 1).End(xlUp).Row
    For i = 2 To rowLast
        If Not oDict.exists(.Cells(i, 1).Value) Then _
        oDict.Add .Cells(i, 1).Value, i
    Next i
    
    arrWords = oDict.keys
    For Each unoWords In arrWords
        s = s & unoWords & strRaz
    Next
    Set regEx = CreateObject("VBScript.RegExp")
    With regEx
        .Global = true'Нужны все совпадения
        .IgnoreCase = False 'Регистр 
        s1 = "(" & ActiveSheet.Cells(9, 4).Text & ")" & "+?(" & strRaz & ")"
        
        .Pattern = s1 'Регулярка
     ''.Pattern = strRaz
    End With
    If regEx.Test(s) Then
        Set regRez = regEx.Execute(s)
    End If
    s = ""
    For Each unoWords In regRez
        s = s & unoWords.submatches(0) & " " & oDict(unoWords.submatches(0)) & strRaz
    Next
End With
End Sub
.+?ол.+?ко   .+?во.+?ач.+?ва.+?
это сама регулярка
Изменено: Udik - 20.08.2017 19:06:32
Арфы - нет, возьмите бубен.
 
Udik, RegExp ресурсозатратная технология и медленная, но очень гибкая.
 
Может для VBA готовые SQL функции есть подходящие?
Изменено: tod2020 - 20.08.2017 19:56:13
 
Вопросы по SQL в VBA хорошо освещены в "Курилке" в теме "Excel и Access могут облегчить друг другу жизнь?". Почитайте.
По вариантам в SQL. Рассмотрим упрощённую версию поиска вида "часть1* часть2* часть3*", то есть в поиске не определён либо конец слов, либо его начало (в случае начала в таблице Слов имеем дополнительный столбец обратного порядка букв и индекс по этому столбцу). Будет выглядеть как "1ьтсач*". В случае Like если шаблон имеет структуру "часть*, то "движок" баз данных использует индекс для поиска вхождения (по крайней мере на SQL Server это так), что позволит исключить полный перебор.
Тогда создаём таблицу эталонных фраз Фразы (№ фразы, Фраза). Где № фразы порядковый номер.
Таблицу Слов (№ слова, Слово). Где Слово содержит все уникальные слова во фразах, а № слова порядковый номер.
Таблицу Определений (№ Фразы, № Слова, Позиция). Где № Фразы – порядковый номер фразы из таблицы Фраз, № Слова – порядковый номер из таблицы Слов, а Позиция – порядковый номер этого слова во фразе.
Если настроить индексы в таблицах, то тогда можно создавать запросы, используя подзапросы, имеющие только часть полного шаблона для Like с учётом порядка этих частей. В прилагаемом файле базы Access показано, как это сделать для примера шаблона "вод* за*" - запрос Выборка.
Успехов.
 
Андрей VG, хммм, интересная метода и вещица
Изменено: tod2020 - 21.08.2017 10:42:40
 
Эххх, было бы простому что-то типа:


array find(*ол*ко *во**ва*)  Collection find(*ол**во*ач*ва*)   dictionary find(*ол*ко *во*ач*ва*)

array Match(*ол*ко *во**ва*)  Collection Match(*ол**во*ач*ва*)   dictionary Match(*ол*ко *во*ач*ва*)


может какие-то модули подключаются или библиотеки заточенные под такие конструкции
Изменено: tod2020 - 21.08.2017 11:09:42
 
Цитата
tod2020 написал:
Эххх, было бы что-то по простому типа
Ну, так напишите код для такого простого варианта, выложите - вполне возможно немало людей будут вам благодарны.

P. S. для Array есть же Array.Find, правда, с полным просмотром. Чтобы не всё просматривать - структуры соответствующие нужны. В общем вас ждёт не дождётся курс "Структуры данных и алгоритмы". Начните с этой книги.
 
Цитата
Андрей VG написал: P. S. для Array есть же  Array.Find ,
уменя, честно говоря, не хватает мощности чтобы осознать эту техническую информацию и не вышло составить свой Array.Find
Изменено: tod2020 - 21.08.2017 11:25:17
 
.
Изменено: tod2020 - 21.08.2017 11:34:53
Страницы: Пред. 1 2 3 След.
Наверх