powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Ускорить алгоритм ?
4 сообщений из 29, страница 2 из 2
Ускорить алгоритм ?
    #35139775
Э...
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Deggasad
Код: plaintext
1.
2.
3.
x = "[абвгд]" ' образец поиска
y1 = "аабвв" ' наша строка, в которой мы сравниваем все символы
z1 = Replace(String(Len(y1), "|"), "|", x) ' создаём строку сравнения
Debug.Print y1 Like z1


А как спецсимволы учесть правильно? А то что-то не получается сравнить такие строчки, к примеру:

"abcde]" и "aabbc]"
...
Рейтинг: 0 / 0
Ускорить алгоритм ?
    #35139943
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
michael RWhite Owl
я просил это
как без цикла проверить что каждый символ из входной строки присутствует в строке для сверки а не вся фразаМой код как раз это и делает - проверяет что каждый из символов строки B упомянут в строке A.
...
Рейтинг: 0 / 0
Ускорить алгоритм ?
    #35140000
Deggasad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С открывающейся квадратной скобкой проблем нет
Код: plaintext
1.
2.
3.
x = "[abcde([)]" ' образец поиска
y1 = "aabbc[" ' наша строка, в которой мы сравниваем все символы
z1 = Replace(String(Len(y1), "|"), "|", x) ' создаём строку сравнения
Debug.Print y1 Like z1

а вот с закрывающейся похоже нужно в определённых местах её указать если нужно, напр
частный случай с одной возможной скобкой
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
x = "[abcde]"
y1 = "aabbca"
j = Len(y1)
i = InStr( 1 , y1, "]")
z1 = "]"
If i =  0  Then z1 = "": i = j: j = j +  1 
z1 = Replace(String(i -  1 , "|") & z1 & String(j - i, "|"), "|", x)
Debug.Print y1 Like z1

впринципе можно рассматривать каждый частный случай
...
Рейтинг: 0 / 0
Ускорить алгоритм ?
    #35140756
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Deggasad
впринципе можно рассматривать каждый частный случай

Решение довольно интересное, но есть громадное сомнение насчет его скорости.

Если гнаться за максимальной скоростью, то думаю лучше брать за основу данный пример:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
Option Explicit

Dim ms( 255 ,  255 ) As Boolean

Public Sub Main()
    Dim sb As String

    Dim m() As Byte, i As Long, j As Long, b As Boolean
    Dim a As String, t As Single, ma() As String

    ' Строка сверки
    sb = "123456789"
    ' 1000000 сверяемых значений
    ReDim ma( 999999 )
    For i =  0  To  999999 
        ma(i) = CStr(CLng( 1000000  * Rnd))
    Next i

    t = Timer

' ------------
    ' Заполним матрицу сверки
    m = sb
    For i =  0  To UBound(m) Step  2 
        ms(m(i), m(i +  1 )) = True
    Next i
    ' сверим наш миллион значений
    For i =  0  To UBound(ma)
        j = j - CLng(CompA(ma(i)))
    Next i
' ------------

    MsgBox "Есть все симоволы в " & j & " из " & i & " за " & Format$(Timer - t, "0.000") & " секунд"
End Sub

Private Function CompA(a As String) As Boolean
    Dim m() As Byte, i As Long
    m = a
    For i =  0  To UBound(m) Step  2 
        If Not ms(m(i), m(i +  1 )) Then Exit Function
    Next i
    CompA = True
End Function

Проверка в данном примере регистрозависимая, уенкод.
Сделать регистронезависимой, при необходимости, совсем не сложно.

Скорость выполнения данного теста (а в нем проверяется миллион строк) ~ 2,4 секунды из IDE/p-code и ~0,8 секунды из native-code.
...
Рейтинг: 0 / 0
4 сообщений из 29, страница 2 из 2
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Ускорить алгоритм ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]