На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! правила раздела Алгоритмы
1. Помните, что название темы должно хоть как-то отражать ее содержимое (не создавайте темы с заголовком ПОМОГИТЕ, HELP и т.д.). Злоупотребление заглавными буквами в заголовках тем ЗАПРЕЩЕНО.
2. При создании темы постарайтесь, как можно более точно описать проблему, а не ограничиваться общими понятиями и определениями.
3. Приводимые фрагменты исходного кода старайтесь выделять тегами code.../code
4. Помните, чем подробнее Вы опишете свою проблему, тем быстрее получите вразумительный совет
5. Запрещено поднимать неактуальные темы (ПРИМЕР: запрещено отвечать на вопрос из серии "срочно надо", заданный в 2003 году)
6. И не забывайте о кнопочках TRANSLIT и РУССКАЯ КЛАВИАТУРА, если не можете писать в русской раскладке :)
Модераторы: Akina, shadeofgray
  
> Алгоритм быстрого подсчета заданных символов в строке.
    Подскажите Алгоритм быстрого подсчета заданных символов в строке.
    Последовательно это понятно, разделить строку на несколько частей и сканировать параллельно тоже понятно.
    Но может есть какой то еще более лучший способ - классический алгоритм?
      Боуер-Мур
      http://algolist.manual.ru/search/esearch/bm.php

      Быстрый поиск
      http://algolist.manual.ru/search/esearch/qsearch.php
      Сообщение отредактировано: sourceman -
        Цитата mishapk @
        Цитата mishapk @
        быстрого подсчета заданных символов в строке.



        Именно подсчета символов в строке, а не поиск подстроки.

        1. Заводишь массив из 256 элементов (в общем виде, для конкретной задачи как правило меньше)
        2. Всем клементам массива присваиваешь нули.
        4. В цикле пробегаешься по всей строки для каждого найденого символа увеличивашь на 1 соответствующий элемент в массиве просчета. Т.е mas[str[i]]++;, где mas массив, str - строка, i - номер символа в строке
        5. Выводишь значения счетчика из массива для нужных символов

        Добавлено
        Цитата mishapk @
        разделить строку на несколько частей и сканировать параллельно тоже понятно.

        Так и разделить. Допустим надо обработать массив из 1000 элементов. В одном потоке обрабатываешь от 0 до 500, в другом от 500 до 1000, результаты суммируешь. Также см. распараллеливание вычислений (а это уже намного сложней).
          mishapk
          Можно и быстрее но это уже зависит от архитектуры. Или если у нас есть частная задача.
            Цитата shm @
            Допустим надо обработать массив из 1000 элементов

            Маловато будет, т.к. пока будет создан второй поток, первый успеет по несколько раз пройтись по этим 1000 символам ;)

            Добавлено
            PS: Если бы речь шла о поиске одного конкретного символа, то можно было бы юзать обработку по 4 или 8 байт одновременно, как это делается в продвинутых реализациях StrLen
              Цитата leo @
              Маловато будет, т.к. пока будет создан второй поток, первый успеет по несколько раз пройтись по этим 1000 символам

              Ну этож понятно, я это чтобы пример проще получился
                в моей задаче нужно создать функцию для подсчета количества нулевых бит в символах строки, не считая нулевого символа в конце строки и возвратит результат.
                Последовательно проскандировать это понятно, а как реализовать быстрый поиск так и не понял.
                Сообщение отредактировано: mishapk -
                  ДЕлаешь как предложил shm, а потом полученные значения умножаешь на количество нулевых бит в букве и суммируешь.
                    Я правильно понял?
                    символ 'a'-имеет код 97 = 1100001b то есть результат для данного символа равен 4.
                      shm
                      Цитата
                      Именно подсчета символов в строке, а не поиск подстроки.


                      Это понятно, я предложил с учетом переделать :)
                      Сообщение отредактировано: sourceman -
                        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                        0 пользователей:


                        Рейтинг@Mail.ru
                        [ Script execution time: 0,0312 ]   [ 15 queries used ]   [ Generated: 21.06.25, 10:22 GMT ]