Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.06.2015, 08:21   #1
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию Поиск подстроки битов в 1024-битовой строке

Наткнулся на достаточно интересное "студенческое" задание
Цитата:
Разработать программу поиска кодовой комбинации в строке 1024 бит. Кодовая комбинация задана в виде строки длиной не более 16 бит
Например: строка для поиска: 0110010101101110... ...00101000100110010010010010110111 100100100
Кодовая комбинация для поиска: 010011
Результат получить в виде номера разряда, с которого начинается кодовая комбинация в строке.
По виду, похоже чем-то на поиск подстроки в строке в алгоритме Бойера-Мура, но может быть найдутся и другие интересные решения
Mikl___ вне форума Ответить с цитированием
Старый 11.06.2015, 10:34   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Как-то не понял сам алгоритм, но если это биты, то что мешает делать сравнение по маске, сдвигать регистр и опять сравнивать?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 11.06.2015, 11:13   #3
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

Здравствуйте, Stilet!
если делать сравнения по маске, сдвигать и опять сравнивать, то для поиска 6 разрядов в 1024-разрядной строке потребуется 1024-6=1018 сравнений в худшем случае, хотелось бы чего-нибудь более быстрого. Например, потратить 1024/6=170 сравнений в худшем случае
Mikl___ вне форума Ответить с цитированием
Старый 11.06.2015, 11:25   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Стоп, а речь идет не о самом решении, а о нахождении наиболее шустрого алгоритма?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 11.06.2015, 12:48   #5
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

Stilet дело говорит.

Код:

LEA rsi, [str_ptr]
MOVZX rdx, WORD PTR [code_val]
MOVZX rcx, BYTE PTR [code_length]

MOV r8, 120

MOV r9, 1
SHL r9, cl
DEC r9

MOV rax, [rsi]
LEA rsi, [rsi+8]

XOR rcx, rcx

align 16
    search_loop:
        MOV r10, r9
        AND r10, rax
        XOR r10, rdx
        JZ search_done
        SHL r9, 1
        SHL rdx, 1
        INC rcx

        MOV r10, r9
        AND r10, rax
        XOR r10, rdx
        JZ search_done
        SHL r9, 1
        SHL rdx, 1
        INC rcx

        MOV r10, r9
        AND r10, rax
        XOR r10, rdx
        JZ search_done
        SHL r9, 1
        SHL rdx, 1
        INC rcx

        MOV r10, r9
        AND r10, rax
        XOR r10, rdx
        JZ search_done
        SHL r9, 1
        SHL rdx, 1
        INC rcx

        MOV r10, r9
        AND r10, rax
        XOR r10, rdx
        JZ search_done
        SHL r9, 1
        SHL rdx, 1
        INC rcx

        MOV r10, r9
        AND r10, rax
        XOR r10, rdx
        JZ search_done
        SHL r9, 1
        SHL rdx, 1
        INC rcx

        MOV r10, r9
        AND r10, rax
        XOR r10, rdx
        JZ search_done
        SHL r9, 1
        SHL rdx, 1
        INC rcx

        MOV r10, r9
        AND r10, rax
        XOR r10, rdx
        JZ search_done
        SHR r9, 7
        SHR rdx, 7
        INC rcx

        
        LODSB
        ROR rax, 8
    DEC r8
    JNZ serach_loop

   

align 16
    search_done:
        MOV rax, rcx
думаю такое будет быстрее любой дополнительной логики.
(бит-стрим читается справа-налево)

// последние 8 байт непроверенными получились, можно сделать еще один цикл без LODSB и r8 = 8

Последний раз редактировалось f.hump; 11.06.2015 в 13:13.
f.hump вне форума Ответить с цитированием
Старый 11.06.2015, 14:53   #6
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Стоп, а речь идет не о самом решении, а о нахождении наиболее шустрого алгоритма?
Конечно, решение здесь вторично...
допустим, подстрока начинается с нуля, составляем массив индексов положения нулей в 1024-строке, подставляем подстроку к каждому нулю и проверяем на совпадение со следующим от нуля битами, ну это так, на уровне бреда
Mikl___ вне форума Ответить с цитированием
Старый 11.06.2015, 19:20   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
ну это так, на уровне бреда
Эт вообще-то Fulltext поиск. Везде используется, правда места ему много надо в памяти и ресурсоемок он при создании. Если важна только скорость отбора, то он подходит, а если от начала до конца разбор то нет.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 12.06.2015, 14:03   #8
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

Stilet,
это также на уровне бреда, здесь в поисковой подстроке на 6 бит соотношение нулей и единиц 0,5; делим 1024-строку на участки по 6 бит и смотрим соотношение нулей и единиц, если больше или меньше - пропускаем
Mikl___ вне форума Ответить с цитированием
Старый 12.06.2015, 20:19   #9
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

..сори, но для чего может понадобится поиск 6-битного значения?!
Если это маска, то должна быть минимум 8 бит (с нулями впереди), а так - где можно применить значение в 6-бит? Просто интересно..
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Старый 12.06.2015, 20:24   #10
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Цитата:
Сообщение от R71MT Посмотреть сообщение
минимум 8 бит (с нулями впереди), а так - где можно применить значение в 6-бит? Просто интересно..
Чё-чё чё? Ещё раз, подробнее. . Ой. Уже умираю от смеха.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
поиск подстроки в строке С pepsik66 Помощь студентам 10 12.11.2012 19:25
поиск подстроки в строке Aina Utebekova Помощь студентам 27 11.10.2012 04:24
поиск подстроки в строке Pozitiffe Общие вопросы C/C++ 5 18.02.2012 21:48
Поиск подстроки в строке videolord Общие вопросы по Java, Java SE, Kotlin 2 10.04.2011 09:11
поиск подстроки в строке!!! StoneSour Общие вопросы C/C++ 2 15.03.2010 21:31