powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Ускорить алгоритм ?
25 сообщений из 29, страница 1 из 2
Ускорить алгоритм ?
    #35133951
Фотография michael R
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
есть строка A=".-abcde ..." для сверки
есть входная строка B="home"
как без цикла проверить что каждый символ из входной строки присутствует в строке для сверки

Спасибо
...
Рейтинг: 0 / 0
Ускорить алгоритм ?
    #35134264
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
set re = new RegExp
re.pattern = "^([" & A & "].*)$"
set m = re.execute(B)
if not m is nothing then
   if m( 0 ).submutches( 0 ) = B then
       print "Ok"
       exit sub
   end if
end if
print "Not Ok"
...
Рейтинг: 0 / 0
Ускорить алгоритм ?
    #35134451
Фотография michael R
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нет не так

во первых конструкция if m(0).submutches(0) = B then ошибочка
во вторых даже если через перебор коллекции то ничего нет

A = "abcdefghmopuyt"
B = "home"
должно сработать

A = "abcdefg"
B = "home?"
не должно сработать
...
Рейтинг: 0 / 0
Ускорить алгоритм ?
    #35134576
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нужно именно без циклов или просто быстро?

Подобная сверка двух строк в 10 миллионов символов каждая с циклами выполняется из IDE за ~6 секунд:

Код: 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.
Public Sub Main()
    Dim a As String, b As String, t As Single

'    a - входная строка
    a = String( 10000000 , "a") & "home"
'    b = строка для сверки
    b = String( 10000000 , "b") & "abcdefghmopuyt"
    
    t = Timer
    Debug.Print MyFunc(a, b), Format$(Timer - t, "0.0000")
End Sub

Public Function MyFunc(a As String, b As String) As Boolean
    Dim ma( 255 ) As Boolean, mb( 255 ) As Boolean
    Dim i As Long

    For i =  1  To Len(a)
        ma(Asc(Mid$(a, i,  1 ))) = True
    Next i
    For i =  1  To Len(b)
        mb(Asc(Mid$(b, i,  1 ))) = True
    Next i
    For i =  0  To  255 
        If ma(i) Then
            If Not mb(i) Then Exit Function
        End If
    Next i
    MyFunc = True
End Function

Устраивает или надо быстрей?
...
Рейтинг: 0 / 0
Ускорить алгоритм ?
    #35134613
Фотография michael R
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нет не то у меня не две строчки на миллион символов
а одна строчка для сверки проверяет миллион входимых строк
и для каждой нужно проверить что в каждой входимой строчке все символы попадают
из строчки для сверки
...
Рейтинг: 0 / 0
Ускорить алгоритм ?
    #35134662
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
michael Rнет не то у меня не две строчки на миллион символов
а одна строчка для сверки проверяет миллион входимых строк
и для каждой нужно проверить что в каждой входимой строчке все символы попадают
из строчки для сверки

Я сравнивал две строки во 10 млн сиволов просто для того чтобы показать что функция работает быстро.

Сверка 1 миллиона коротких строк навроде

Код: plaintext
1.
2.
3.
    '    a - входная строка
        a = "home"
    '    b = строка для сверки
        b = "abcdefghmopuyt"

Выполняется менее чем за 0,3 секунды (на моем компьютере).
...
Рейтинг: 0 / 0
Ускорить алгоритм ?
    #35134680
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Точнее наврал ~0,1 секунды. Кроме того можно еще быстрей легко сделать, если соптимизировать под конкретные условия...
...
Рейтинг: 0 / 0
Ускорить алгоритм ?
    #35134719
Фотография michael R
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
но цикл 255 раз иногда бежит зазря
и во вторых могуг быть и UNICODE символы

у меня было немного подругому

каждый символ из входящей строчки сверялся через Instr в цикле со строчкой для сверки
но мое впечатление что это долго
...
Рейтинг: 0 / 0
Ускорить алгоритм ?
    #35134727
Фотография michael R
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
3 цикла как то не оптимально
...
Рейтинг: 0 / 0
Ускорить алгоритм ?
    #35134761
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
michael Rно цикл 255 раз иногда бежит зазря
и во вторых могуг быть и UNICODE символы

Зазря цикл не бегает. Из 3-го цикла при несовпадении вылетает сразу.

Под UNICODE - надо несколько изменить код. Я же не знаю постановки твоей задачи...

michael R
у меня было немного подругому
каждый символ из входящей строчки сверялся через Instr в цикле со строчкой для сверки
но мое впечатление что это долго

Конечно, это дольше. Так как неоптимально.
...
Рейтинг: 0 / 0
Ускорить алгоритм ?
    #35134856
Фотография michael R
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndrF

всё таки думаешь что 3 цикла быстрее чем один
хотя уже 2 цикла строчка для сверки задаётся один раз
...
Рейтинг: 0 / 0
Ускорить алгоритм ?
    #35134878
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
michael R
всё таки думаешь что 3 цикла быстрее чем один
хотя уже 2 цикла строчка для сверки задаётся один раз

Да, для строки сверки его можно выполнить один раз.

Делай код для своей конкретной задачи - я ведь просто набросал пример одного из решений, не учитывающий твои условности о которых не знал...
...
Рейтинг: 0 / 0
Ускорить алгоритм ?
    #35134905
Фотография michael R
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ладно спасибо попробую может действительно будет быстрее
...
Рейтинг: 0 / 0
Ускорить алгоритм ?
    #35135944
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
michael Rнет не так
во первых конструкция if m(0).submutches(0) = B then ошибочкаНет. Так.
Исправить опечатку религия не позволяет?

Ну а вообще-то, на второй взгляд можно сократить до вот этого:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
set re = new RegExp
re.pattern = "^[" & A & "]+$"
if re.test(B) then
	print "Ok"
else
	print "Not Ok"
end if
...
Рейтинг: 0 / 0
Ускорить алгоритм ?
    #35137359
Фотография michael R
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl
я просил это
как без цикла проверить что каждый символ из входной строки присутствует в строке для сверки а не вся фраза
...
Рейтинг: 0 / 0
Ускорить алгоритм ?
    #35138258
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Никак.
...
Рейтинг: 0 / 0
Ускорить алгоритм ?
    #35138606
Deggasad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возможно-возможно
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Sub test()
x = "[абвгд]" ' образец поиска

y1 = "ааббвв" ' наша строка, в которой мы сравниваем все символы
z1 = Application.Rept(x, Len(y1)) ' создаём строку сравнения
Debug.Print y1 Like z1

y2 = "ааббввя" ' наша строка, в которой мы сравниваем все символы
z2 = Application.Rept(x, Len(y2)) ' создаём строку сравнения
Debug.Print y2 Like z2

End Sub
...
Рейтинг: 0 / 0
Ускорить алгоритм ?
    #35139164
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Application.ReptЭто что за зверь?
...
Рейтинг: 0 / 0
Ускорить алгоритм ?
    #35139265
Deggasad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy Application.ReptЭто что за зверь?

Функция абочего листа Повтор()
К сожалению функция String в VBA только один символ повторяет
...
Рейтинг: 0 / 0
Ускорить алгоритм ?
    #35139526
Фотография michael R
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Deggasad

действительно интересно придуманно

а как в VB6 (без Excel) размножить строчку без цикла (не один символ)
...
Рейтинг: 0 / 0
Ускорить алгоритм ?
    #35139587
Deggasad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
michael R
как в VB6 (без Excel) размножить строчку без цикла (не один символ)

Вопрос ко всем у меня есть строка "DeggaSad" Как получить строку содержащую эту строку 20 раз например. Аналогично функции Повтор() в Exel, только в VB.
...
Рейтинг: 0 / 0
Ускорить алгоритм ?
    #35139606
Фотография michael R
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот такое нашёл

Function ReplicateString(Source As String, Len As Long) As String
' build a string of spaces whose length is equal to the number of
' repetitions, then replace each space with the string to be repeated
ReplicateString = Replace$(Space$(Len), " ", Source)
End Function

есть вариант через API - Copy Memory
...
Рейтинг: 0 / 0
Ускорить алгоритм ?
    #35139625
Фотография michael R
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
копирование строчки

вот тут ещё разные примеры на копирование строчки
...
Рейтинг: 0 / 0
Ускорить алгоритм ?
    #35139644
Deggasad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
x = "[абвгд]" ' образец поиска
y1 = "аабвв" ' наша строка, в которой мы сравниваем все символы
z1 = Replace(String(Len(y1), "|"), "|", x) ' создаём строку сравнения
Debug.Print y1 Like z1
...
Рейтинг: 0 / 0
Ускорить алгоритм ?
    #35139715
Фотография michael R
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
думаю что это в любом случае быстрее чем циклы
...
Рейтинг: 0 / 0
25 сообщений из 29, страница 1 из 2
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Ускорить алгоритм ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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