Страница: 1 |
Страница: 1 |
Вопрос: Найти цепочку байт в диню.массиве
Добавлено: 22.02.06 20:34
Автор вопроса: Alex | Web-сайт:
Имеется динамический массив большой размерности около 30-40mb в нем необходимо найти цепочку байт произвольно заданной длины. Как это сделать?
Заранее спасибо.
Ответы
Всего ответов: 13
Номер ответа: 1
Автор ответа:
HOOLIGAN
Вопросов: 0
Ответов: 1066
Профиль | | #1
Добавлено: 22.02.06 20:45
Если длина цепочки равна n, то начиная от первого байта массива, сравнивать n байт массива с искомой цепочкой. Если не совпало, сравниваем начиная со второго, третьего и т.д. байта массива.
Номер ответа: 2
Автор ответа:
Alex
Вопросов: 13
Ответов: 26
Web-сайт:
Профиль | | #2
Добавлено: 22.02.06 21:04
А как это осуществить программно. Если задвать в цикле придется минут 20-30 ждать если не больше пока он прверит. А мне желательно побыстрей бы.
Номер ответа: 3
Автор ответа:
ChemistN1
Вопросов: 7
Ответов: 43
Web-сайт:
Профиль | | #3
Добавлено: 22.02.06 21:17
Если взять 1-й байт искомой цепочки и проверять начиная с 1-го байта массива, потом, если совпадет - со 2-м байтом иск. цеп-ки, итд, должно выйти намного быстрее.
Номер ответа: 4
Автор ответа:
HOOLIGAN
Вопросов: 0
Ответов: 1066
Профиль | | #4
Добавлено: 22.02.06 21:29
Ну есть разные алгоритмы, типа Бойера-Мура, quick search и т.д.
Сходи на http://algolist.manual.ru там есть алгоритмы.
Я когда-то делал такой поиск, но на ассемблере. Получилось весьма быстро.
А на VB тут делать нечего.
Номер ответа: 5
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #5
Добавлено: 22.02.06 23:29
ну чё нечего долго просто будет... хотя и не факт что пол часа,
если шустрый алгоритм, вполне реально уложиться в минуту...
Номер ответа: 6
Автор ответа:
HOOLIGAN
Вопросов: 0
Ответов: 1066
Профиль | | #6
Добавлено: 22.02.06 23:40
Минута - это очень много.
Номер ответа: 7
Автор ответа:
GSerg
Вопросов: 0
Ответов: 1876
Профиль | | #7
Добавлено: 23.02.06 06:22
InStrB()
Номер ответа: 8
Автор ответа:
HOOLIGAN
Вопросов: 0
Ответов: 1066
Профиль | | #8
Добавлено: 23.02.06 09:46
InStrB()
Медленно.
Номер ответа: 9
Автор ответа:
[root]
Вопросов: 45
Ответов: 1212
Web-сайт:
Профиль | | #9
Добавлено: 23.02.06 11:05
Returns a Variant(Long) specifying the position of the first occurence of one
string within another.
Syntax:
InStr([start,]string1, string2[,compare]
The InStr function syntax has these arguments:
Part  escription
start Optional. Numeric expression that sets the starting position for
each search. If omitted, search begins at the first character
position. If start contains Null, an error occurs. The start argument
is requird if compare is specified.
string1 Required. String expression being searched.
string2 Required. String expression sought.
compare Optional. Specifies the type of string comparison. If compare is
Null, an error occurs. If compare is omitted, the Option Compare
setting determines the type of comparison. Specify a valid LCID
 LocaleID) to use locale-specific rules in the comparison.
Settings
The comare argument settinga are:
Constant Value Description
vbUseComareOption -1 Performs a comparison using the setting of the
Option Compare statement.
vbBinaryCompare 0 Performs a binary comparison.
vbTextCompare 1 Performs a textual comparison.
vbDataBaseCompare 2 Microsoft Access only. Performs a comparison
based on information in your database.
Return Values
If InStr returns
string1 is zero-length 0
string1 is Null Null
string2 is zero-length start
string2 is Null Null
string2 is not found 0
string2 if found within string1 Position at which match is found
start > string2 0
Remarks
The InStrB function is used with byte data contained in a string. Instead of
returning the character position of the first occurence of one string within
another, InstrB returns the byte position.
Номер ответа: 10
Автор ответа:
BUG(O)R
ICQ: 827887
Вопросов: 13
Ответов: 142
Web-сайт:
Профиль | | #10
Добавлено: 23.02.06 12:11
Используй ассемблерные вставки. На ВБ такое действительно будет очень долго, а на асме можно уложиться в пару секунд секунды
Номер ответа: 11
Автор ответа:
HOOLIGAN
Вопросов: 0
Ответов: 1066
Профиль | | #11
Добавлено: 23.02.06 12:34
InstrB() укладывается в 200 мс (для файла 30Мб и строки 16 байт)
На асме укладывается в 60 мс.
Номер ответа: 12
Автор ответа:
Alex
Вопросов: 13
Ответов: 26
Web-сайт:
Профиль | | #12
Добавлено: 23.02.06 23:03
Функция InStrB() сравнивает одну строку с другой. То есть мне надо сначала создать строку из этих байт и искать в ней. Примерно это будет выглядеть так сейчас нет под рукой установленного VB.
for i=n to m
строка=строка+Str(динамический_массив(i))
next i
Вхождение=InStrB(1,строка,строка_поиска)
if вхождение<>0 then
MsgBox "Вхождение найдено"
else
n=n+1
m=n+Len(строка_поиска)
end if
Loop
Долго ведь получается. Если можно то приведите плиз какой нить рабочий пример.
Номер ответа: 13
Автор ответа:
HOOLIGAN
Вопросов: 0
Ответов: 1066
Профиль | | #13
Добавлено: 23.02.06 23:57
При чем здесь строки?
Строки сравниваются при помощи InStr, а не InStrB.
Читаешь в массив свой файл, задаешь второй массив(искомая последовательность байт), и передаешь эти два массива в InStrB. Вот тебе рабочий пример:
Dim a() As Byte
Dim s(0 To 15) As Byte
Dim fsize As Long
Dim t As Single
ffree = FreeFile
s(0) = &HB2
s(1) = &H4D
s(2) = &HB4
s(3) = &H55
s(4) = &H78
s(5) = &HF9
s(6) = &H1
s(7) = &H8D
s(8) = &H93
s(9) = &H5B
s(10) = &HAA
s(11) = &H51
s(12) = &H9E
s(13) = &HA8
s(14) = &H9E
s(15) = &H38
Open "C:\Program Files\Microsoft Visual Studio\MSDN\2001OCT\1033\PERIOD98.CHM" _
For Binary As #1 'for binary access
fsize = LOF(1)
Debug.Print fsize
ReDim a(0 To 33686956)
Get #1, , a()
t = Timer
fsize = InStrB(1, a, s)
t = Timer - t
Debug.Print fsize
Debug.Print t
Close #1
Если время поиска порядка 200 мс (на средней машине) не устраивает - пишешь свою ф-цию.
Но судя по вопросу, вряд ли ты напишешь быстрее, чем InStrB.