Ответы пользователя по тегу Алгоритмы
  • Существует ли какой-нибудь алгоритм склонения существительных во множественном числе?

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

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

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

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

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Стандартный алгоритм для интервалов:
    Пусть на каждый случай большего рейтинга противника приходится два случая равного и три случая меньшего.
    Больший: 1
    Равный: 2
    Меньший: 3
    Просуммируем, 1+2+3 = 6.

    Найдём граничные значения:
    Больший: [0, (0+1)] = [0, 1)
    Равный: [1, 1+2) = [1, 3)
    Меньший: [3, 3+3) = [3, 6)

    Генерируем случайное число X от 0 до 6.
    Если X < 1, то выбираем противника с большим рейтингом
    Иначе если X < 3, то выбираем противника с равным рейтингом
    Иначе выбираем противника с равным рейтингом
    Ответ написан
    4 комментария
  • В чем ошибка алгоритма(8 Puzzle, A*)?

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

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    MAD = ((x1 + x4)/2, (y1 + y4)/2)
    A' = MAD + (A - MAD) * scale
    B' = MAD + (B - MAD) * scale
    Ответ написан
    Комментировать
  • Имеем 4 списка значений по 100 гб. Как получить значения входящие во все списки?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    А в чём проблема? Если индексы уже построены (читай - списки отсортированы), то просто двигаясь параллельно по всем четырём спискам можно находить все пересечения списков за один проход.
    Пусть у нас есть четыре отсортированных по возрастанию списка.
    0. Добавим в конец каждого списка один и тот же элемент, заведомо больший любого элемента из любого списка.
    1. Поставить указатели на первые элементы списков.
    2. Найти минимальное значение из текущих элементов, обозначим его через Min.
    3. Посчитать количество текущих элементов, равных Min. Если оно равно 4 - вывести элемент.
    4. Для каждого списка, пока значение текущего элемента равно Min, передвинуть указатель на следующий элемент.
    5. Если ни один указатель не дошёл до конца списка, то перейти к пункту 2.

    Для поиска пересечений трёх из четырёх или двух из четырёх списков - подкорректировать пункты 3 и 5.
    Ответ написан
    2 комментария
  • Алгоритм для быстрой проверки соответствия строки шаблонам?

    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)
    Затем обходим дерево, там где сумма счётчиков в дочерних узлах не равна счётчику в родительском - заканчивается слово, а разность между суммами даёт количество этих слов в тексте.
    Ответ написан
    Комментировать