Задать вопрос
Ответы пользователя по тегу Алгоритмы
  • Алгоритм для быстрой проверки соответствия строки шаблонам?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Можно из шаблонов построить дерево или конечный автомат, каждую из строк достаточно будет прогнать один раз. Конечный автомат немного сложнее, зато его можно привести в минимальную форму, что ускорит сравнение.
    Ответ написан
    Комментировать
  • В проверке с "&&" вторая часть не выполнится в случае ложной первой?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Зависит от языка программирования. Например VisualBasic имеет два оператора - And и AndAlso. And всегда вычисляет оба аргумента, AndAlso вычисляет второй аргумент только если первый true.
    Ответ написан
    7 комментариев
  • Как лучше построить и решить данную задачу?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Разрежённый массив. Можно хранить, например, в дереве - тогда поиск будет быстрым, а добавление медленным, или в списке, тогда добавление ускорится, а поиск замедлится.
    Ответ написан
    Комментировать
  • Как организовать хранение товаров-замен для оптимизации поиска?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Тут надо смотреть, насколько часто меняется список замен. Если не часто, то держать две таблицы - основной набор, как у Вас сейчас, и кэшированный список вида ('A' - 'B,C,D,E'), перестраивая его при изменении основного набора.
    Ответ написан
    Комментировать
  • Как решаются задачи на вероятность?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Конкретно для этой задачи алгоритм простой. На каждом шаге:
    Выигрыш (выход из леса) - одна дорога из трёх:
    W = 1/3
    Проигрыш (разбойники)- две дороги из трёх * вероятность встретить разбойников:
    L = 2p/3
    Остался в игре - две дороги из трёх * вероятность не встретить разбойников:
    G = 2(1-p)/3
    Соответственно, для i-го шага:
    Wi = 1/3*G(i-1)
    Li = 2p/3*G(i-1)
    Соотношение
    Wi/Li = (1/3)/(2p/3) = 1/(2p)
    не зависит от i, а значит для
    SUMi=1..N(Wi)/SUMi=0..N(Li) = 1/(2p)
    для любого N
    Таким образом, общая вероятность выигрыша
    PW = W/(W+L) = 1/(1+2p)

    Ну а читать - теорию вероятности и комбинаторику.
    Ответ написан
    Комментировать
  • Какой алгоритм коррекции ошибок выбрать для двумерного баркода?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Стандартный код Хэмминга, в Вашем случае вариант (31, 26) - 26 бит данных, 5 бит контроля. Восстанавливает одиночные ошибки и обнаруживает двойные ошибки.
    Ответ написан
  • Арифметическое сжатие/кодирование?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    А в чём проблема?
    Определяем алфавит: (а, и, й, м, н, о, р, ф, ц, ы).
    Считаем символы (распределение вероятности).
    а | и | й | м | н | о | р | ф | ц | ы
    1 | 2 | 1 | 1 | 3 | 2 | 1 | 1 | 1 | 1

    Строим накопительную сумму
    а | и | й | м | н | о  | р  | ф  | ц  | ы
    1 | 3 | 4 | 5 | 8 | 10 | 11 | 12 | 13 | 14

    Приводим в отрезок [0,1) делением на общую сумму (14)
    а     | и     | й     | м     | н     | о     | р     | ф     | ц     |  ы
    0.071 | 0.214 | 0.286 | 0.357 | 0.571 | 0.714 | 0.786 | 0.857 | 0.929 | 1

    Кодируем сообщение
    старт - [0, 1)
    и - [0.071, 0.214)
    н - [0.122, 0,153)
    ф - [0.1465, 0.1486)
    ...
    й - [0.147980532221506, 0.147980532221545)

    Берём середину интервала, получаем кодированное сообщение 0.147980532221526
    Ответ написан
    1 комментарий
  • Можно ли сделать линейные методы для рекурсивной структуры?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Ответ написан
    Комментировать
  • Как посчитать словарь текста?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Сортировка - практически то же бинарное дерево, так что проще за один проход.
    Ну или добавить корзинную сортировку, растить несколько деревьев, разделяя их по одной-двум первым буквам слова.
    А может лучше и не бинарное дерево. Если алфавит заранее известен и ограничен (скажем, N символов), то в каждом узле дерева делать разделение на N ветвей, беря в качестве индекса порядковый номер символа в алфавите.
    Ответ написан
    Комментировать
  • Какой алгоритм использовать для задачи?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Задача сводится к разбиению исходного множества грузов на группы, суммарное время доставки которых не превосходит 2:58, но максимально близко к этой величине.
    Точное решение - перебор всех вариантов - на таком количестве грузов неприменим.
    Один из методов приближённого решения - жадный алгоритм. Рассортируем грузы по убыванию времени доставки. Заведём (1000/(178/30)) = 169 ячеек и для каждого груза из отсортированного списка будем просматривать ячейки начиная с первой на возможность добавления в неё груза с учётом ограничений.
    Ответ написан
    Комментировать
  • Как пройти все подмножества в множестве?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Вообще-то у n-элементного множества 2n подмножеств, так что n2 при n > 2 получить нереально.
    Один из алгоритмов перечисления:
    1. Заводим второй массив (булеан), того же размера, что и исходный, инициализируем его нулями.
    2. Выводим подмножество из тех элементов исходного массива, которым в булеане соответствуют единицы.
    3. Трактуя булеан как запись числа в двоичной системе прибавляем к нему 1.
    4. Если в булеане есть хоть одна 1, переходим к пункту 2.
    Ответ написан
    1 комментарий
  • Как посчитать количество повторяющихся букв (отрезков) в наборе слов?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Угу. Туда же попадут "автор", "автохтон", "автобиография", "автомат"... А уж слова с приставками... По хорошему, надо разделять слова на приставку, корень (корни), суффикс и окончание, для чего желательно знать, как минимум роль слова в предложении (и то может не помочь, попробуйте разобрать "Косил косой косой косой" - да, тот самый заяц на поляне, да ещё и коса кривая.
    Но если так хочется - строите дерево, где каждый уровень - следующая буква слова, а в узлах и листьях стоят счётчики количества слов. Для слов "автомобиль", "авто" и "автострада" получаем:
    .                   +-м(1)-о(1)-б(1)-и(1)-л(1)-ь(1)
    .а(3)-в(3)-т(3)-о(3)+
    .                   +-с(1)-т(1)-р(1)-а(1)-д(1)-а(1)
    Затем обходим дерево, там где сумма счётчиков в дочерних узлах не равна счётчику в родительском - заканчивается слово, а разность между суммами даёт количество этих слов в тексте.
    Ответ написан
    Комментировать
  • Как наиболее эффективно проверить вхождение последовательности в массиве?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Если надо проверить именно на непрерывную последовательность - то это поиск подстроки на алфавите x,y,z,...
    Ответ написан
    Комментировать
  • Хранение хэшей в mysql и потребление памяти. Какой алгоритм выгодней?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    1. Хранить можно по разному. Можно, например, разбить таблицу на 2n таблиц по первым битам хэша (table_00, table_01, ... table_ff).
    2. Хэш, как таковой, не гарантирует однозначного отображения, то есть вполне вероятен вариант, когда две разные строки будут иметь один и тот же хэш. Для n-битного хэша перебор 2n/2 строк выдаст два одинаковых значения хэша с вероятностью 63% (парадокс дней рождения). По таблице можете оценить, какая вероятность коллизии будет для вашего количества строк при разной длине хэша.
    Ответ написан
    Комментировать
  • Как составить все возможные комбинации размещения 10 яблок на 21 тарелке?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Условие неполное. Считаются ли яблоки уникальными или одинаковыми? Какое максимальное количество яблок может лежать на одной тарелке?
    Ответ написан
    Комментировать
  • Как из польской нотации получить АСТ дерево?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    последовательно читаем выражение, для каждой лексемы по её типу:
    число -> создать ноду (ЧИСЛО, значение), положить её на стек;
    унарный оператор -> снять со стека ноду (потомок), создать ноду (УНАРНАЯОПЕРАЦИЯ, тип, потомок), положить новую ноду на стек;
    бинарный оператор -> снять со стека две ноды (потомок1 и потомок2), создать ноду (БИНАРНАЯОПЕРАЦИЯ, тип, потомок1, потомок2), положить новую ноду на стек;
    функция -> снять со стека N нод по числу аргументов функции (потомок1,... потомокN), создать ноду (ФУНКЦИЯ, имя, потомок1,... потомокN), положить новую ноду на стек;

    В конце работы по корректному выражению на стеке должна лежать одна нода, она и будет корнем дерева.
    Ответ написан
    Комментировать
  • Как вычислить погрешность, при которой два числа с плавающей точкой можно считать равными?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Если речь идёт об абстрактной математике, то надо рассматривать представление плавающего типа (float, double, long double) в конкретной архитектуре. В большинстве случаев используется IEEE 754-1985. Скажем, для float32 в нормализованной форме точность - то есть единица младшего разряда мантиссы - в зависимости от экспоненты может быть от 1.175494351×10−38 до 3.402823466×1038.

    Если же речь о прикладных задачах, то точность выбирается исходя из модели процесса. Скажем, при поиске кратчайшего маршрута поездки достаточно точности в десяток метров, а при парковке нужны, как минимум, сантиметры.
    Ответ написан
    Комментировать
  • Балансировка нагрузки: как разбить набор чисел на две части с примерно равными суммами?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Для разбиения на две группы задача сводится к задаче о рюкзаке с весом рюкзака равным половине общего веса камней и ценностью камней равной их весу.
    Ответ написан
    2 комментария
  • Как написать алгоритм для для поиска кратчайшего расстояния?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Тогда придётся повторно пересматривать вершины если для них нашёлся более короткий путь.
    Пример:
    .  A  B  C
    A  -  4  1
    B  4  -  1
    C  1  1  -

    Начальная точка A (A = 0). Строим пути из A (B = 4, C = 1), добавляем их в очередь. Строим пути из B (С = 1). Строим пути из C (B = 2). И снова надо перестраивать пути из B, поскольку до него нашёлся более короткий путь.
    Поэтому у Дейкстры и используется сортированная очередь, тогда не возникает необходимости в повторном просмотре точек.
    Ответ написан
  • Найти количество чисел заданного порядка, модуль разницы соседних цифр которых не больше 1

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    У вас уже неправильно, для двузначных будет (10, 11, 12, 21, 22, 23, 32, 33, 34...).
    Модуль разницы:
    myglbyq.png
    Верхнюю оценку получить легко, 10*3(n-1), а вот точное число посчитать по формуле скорее всего не получится, 0 и 9 портят всю картину.
    Ответ написан