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

Спасибо
...
Рейтинг: 0 / 0
14.02.2008, 22:59
    #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
15.02.2008, 11:56
    #35134451
michael R
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ускорить алгоритм ?
нет не так

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

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

A = "abcdefg"
B = "home?"
не должно сработать
...
Рейтинг: 0 / 0
15.02.2008, 12:31
    #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
15.02.2008, 12:40
    #35134613
michael R
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ускорить алгоритм ?
нет не то у меня не две строчки на миллион символов
а одна строчка для сверки проверяет миллион входимых строк
и для каждой нужно проверить что в каждой входимой строчке все символы попадают
из строчки для сверки
...
Рейтинг: 0 / 0
15.02.2008, 12:52
    #35134662
AndrF
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ускорить алгоритм ?
michael Rнет не то у меня не две строчки на миллион символов
а одна строчка для сверки проверяет миллион входимых строк
и для каждой нужно проверить что в каждой входимой строчке все символы попадают
из строчки для сверки

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

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

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

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

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

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

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

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

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

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

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

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

Делай код для своей конкретной задачи - я ведь просто набросал пример одного из решений, не учитывающий твои условности о которых не знал...
...
Рейтинг: 0 / 0
15.02.2008, 13:44
    #35134905
michael R
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ускорить алгоритм ?
Ладно спасибо попробую может действительно будет быстрее
...
Рейтинг: 0 / 0
15.02.2008, 17:37
    #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
17.02.2008, 10:35
    #35137359
michael R
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ускорить алгоритм ?
White Owl
я просил это
как без цикла проверить что каждый символ из входной строки присутствует в строке для сверки а не вся фраза
...
Рейтинг: 0 / 0
18.02.2008, 10:09
    #35138258
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ускорить алгоритм ?
Никак.
...
Рейтинг: 0 / 0
18.02.2008, 11:49
    #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
18.02.2008, 14:21
    #35139164
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ускорить алгоритм ?
Application.ReptЭто что за зверь?
...
Рейтинг: 0 / 0
18.02.2008, 14:45
    #35139265
Deggasad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ускорить алгоритм ?
Antonariy Application.ReptЭто что за зверь?

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

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

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

Вопрос ко всем у меня есть строка "DeggaSad" Как получить строку содержащую эту строку 20 раз например. Аналогично функции Повтор() в Exel, только в VB.
...
Рейтинг: 0 / 0
18.02.2008, 16:27
    #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
18.02.2008, 16:33
    #35139625
michael R
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ускорить алгоритм ?
копирование строчки

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


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