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

    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 портят всю картину.
    Ответ написан
  • Вывод 3 чисел, которые в сумме дают число n

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Не должны повторяться перестановки - значит для каждого множества слагаемых {a, b, c} можно найти множество {a', b', c'}, образованное перестановкой элементов исходного множества, такое, что a'<=b'<=c'. Значит каждый следующий вложенный цикл должен начинаться не с 1, а со значения итератора предыдущего цикла.
    ---
    Подумал ещё:
    При условии a<=b<=c, a+b+c=n значение a не может быть больше n/3, иначе b либо c будут б̶о̶л̶ь̶ш̶е меньше, чем a.
    Значение b не может быть больше, чем (n-a)/2, иначе c будет б̶о̶л̶ь̶ш̶е меньше b.
    Значение c будет равно (n-a-b).
    Итого, получаем
    int n = Integer.parseInt(reader.readLine());
    for (int i = 1; i <= n/3; i++) {
        for (int j = i; j <= (n-i)/2; j++) {
            System.out.println("Числа " + i + " + " + j + " + " + (n-i-j));
        }
    }
    Ответ написан
    2 комментария
  • Как осуществить поиск функции по известным значениям?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Если заранее неизвестен хотя бы общий вид функции, то, по моему, проще дизассемблировать программу и разобраться в вычислениях, чем пытаться определить взаимозависимости между 50 параметрами. Например, для такой функции двух переменных
    oohphsl.png
    зависимость от y сильно проявляется только в малой области значений x в районе x=b. А ведь функция может быть и кусочно-непрерывной, например
    lf3t5yz.png
    Ответ написан
  • Как осуществить поиск функции по известным значениям?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    По известному набору точек можно лишь предположить вид функции, например набор (-1, 0), (0, 0), (1, 0) может принадлежать как прямой y=0, так и синусоиде y=sin(πx) или полиному y=x3-x. Обычно вид функции выбирается из физической модели процесса, для которого получены данные.
    Ответ написан
    Комментировать
  • Как реализовать метод эластичной сети?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Если знаете английский, почитайте эту статью
    Ответ написан
    Комментировать
  • Существует ли стандартный алгоритм для расчета огибающей семейства кусочно-линейных функций?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    К каждой линии добавляются точки (x1; 0) и (xn; 0) (проекции крайних точек на ось X), получается полигон. Дальше алгоритм сложения полигонов.
    Ответ написан
    3 комментария