Ответы пользователя по тегу Алгоритмы
  • Библиотека, которая поможет понять, что "ответы" и "OtBETЫ" - это одно и тоже?

    LaRN
    @LaRN
    Senior Developer
    Есть вот такой вариант, но он наверное слишком мощный для вас:
    https://tech.yandex.ru/speller/

    Вот тут интересная статья про трансформацию слов:
    https://habr.com/ru/post/270845/
    Возможно вам подойдет "Функция оценки похожести пары слов"
    Ответ написан
    Комментировать
  • Как искать однокоренные слов в русских текстах?

    LaRN
    @LaRN
    Senior Developer
    Это сложная задача, решение которой еще и от контекста в котором употребляется слово зависит.
    Посмотрите вот эту ссылку для примера:
    https://ru.wikipedia.org/wiki/%D0%9E%D0%BC%D0%BE%D...
    Ответ написан
    Комментировать
  • Прграмные реализации методов/алгоритмов многомерной интерполяции по нерегулярной сетке?

    LaRN
    @LaRN
    Senior Developer
    Вот тут реализация на Python.
    https://github.com/bsmurphy/PyKrige

    А вот по такому запросу находиться на c++
    kriging interpolation c++
    Ответ написан
    1 комментарий
  • Как посчитать значения из AST-дерева?

    LaRN
    @LaRN
    Senior Developer
    Посмотрите вот эту статью:
    https://habr.com/ru/post/281495/

    Там в комментариях много интересных ссылок, например эта:
    journal.stuffwithstuff.com/2011/03/19/pratt-parser...
    Ответ написан
    Комментировать
  • Как сделать систему рекламных объявлений, показывающих равномерно?

    LaRN
    @LaRN
    Senior Developer
    Может вот этот вариант подойдет:
    https://tproger.ru/problems/rand-element-sequence/
    Ответ написан
    Комментировать
  • Как происходит перестановка букв в этом алгоритме с рекурсией?

    LaRN
    @LaRN
    Senior Developer
    При каждом заходе в тело функции getPermutations, от входной стоки отсекается последний символ и от получившейся строки снова вызывается функция, тут мы как бы спускаемся в низ.

    Условие для остановки рекурсии:
    if (string.length <= 1) {
    return new Set([string]);
    }

    Т.е. как только цепочка вызовов дойдет до того, что на вход придет пустая строка (тут мы как бы достигли дна) произойдет возврат значения - пустая строка и теперь вы начинаем подниматься вверх.

    Проще на примере, если взят строку 'ABC' на вход, то рекурсия будет такой
    ->getPermutations('ABC')
    --> getPermutations('AB')
    ---> getPermutations('A')
    ----> getPermutations('')
    <---- ''
    <---'A'
    <--'A', 'BA', 'AB'
    <-'A', 'BA', 'AB', 'CA', 'AC', 'CBA', 'BCA', 'BAC', 'CAB', 'ACB', 'ABC'
    Ответ написан
  • Как сделать поиск кратчайшего пути на графе по массиву данных?

    LaRN
    @LaRN
    Senior Developer
    Судя по нарисованному графу, тут есть два варианта пути:
    1. х1-х2-х5
    2. х1-х3-х4-х5
    Из этих двух нужно выбрать меньший.

    Ребро х2-х3 нужно исключить, т.к. в треугольнике х1-х2-х3 всегда выгоднее выбирать одну из сторон х1-х3 или
    х1-х2, чем две стороны (х1-х2 + х2-х3 или х1-х3 + х3-х2).

    Зная это, простым сложением по вашей таблице легко найти ответ.
    Ответ написан
    Комментировать
  • Как найти расхождения в сортировке массивов?

    LaRN
    @LaRN
    Senior Developer
    Можно попробовать вычислить разницу между индексами одного и того же элемента в двух массивах и найти сумму этих разниц для всех элементов. Разницу брать по модулю, чтобы плюсы/минусы не влияли на результат.
    Если в массивах некоторые элементы дублируются, то нужно запоминать индексы уже проверенных элементов чтобы не сравнивать их повторно.
    Ответ написан
    Комментировать
  • Как подобрать кривую преследования заданной формы?

    LaRN
    @LaRN
    Senior Developer
    Если я правильно понял, возможно вам вот это подойдет:
    https://habr.com/post/314218/

    Суть сводиться к приближению произвольной линии сплайном определенного порядка.
    И тут вся сложность сводиться к выбору порядка сплайна и ключевых точек.
    Указанная статья как раз про это.
    Ответ написан
  • Почему n^3 работает быстрей чем 2^n?

    LaRN
    @LaRN
    Senior Developer
    Потому что если подставить в формулу N >= 10, то значение 2^N больше N^3.
    Ответ написан
    1 комментарий
  • Алгоритм нахождения синуса любого угла?

    LaRN
    @LaRN
    Senior Developer
    Иногда для скорости используют(вали) табличный метод.
    Т.е. создают таблицу в памяти с вычисленными значениями функции(с нужной точностью)
    для какого-то фиксированного шага по углу.
    Если попадаем между узлами сетки таблицы углов, то используем интерполяцию.
    Ответ написан
    Комментировать
  • Алгоритм xgboost работает через cpu или gpu?

    LaRN
    @LaRN
    Senior Developer
    В офф доке описано про поддержку gpu.
    Подробнее можно вот тут изучить:
    https://xgboost.readthedocs.io/en/latest/gpu/index.html
    Ответ написан
    Комментировать
  • Генерация случайной уникальной последовательности чисел?

    LaRN
    @LaRN
    Senior Developer
    Можно попробовать генерировать GUID и брать нужное количество цифр с конца.
    Если верить GIT, то последние 6 знаков в хэше коммита почти никогда не повторяются.

    В Win есть АПИ, например это:
    https://msdn.microsoft.com/ru-ru/library/windows/d...

    Многие БД, если их планируете использовать из коробки умеют генерировтать GUID.
    Ответ написан
    Комментировать
  • Как можно улучшить эти функции?

    LaRN
    @LaRN
    Senior Developer
    В первом примере можно немного оптимизировать время работы за счёт меньшего количества вызовов indexof:
    function findAll(str, target) {
      let res = [];
      let ind = 0;
      for(let position = 0; position < str.length; position++) {
         if (ind <= position){
             ind = str.indexOf(target, position);
             if (ind == -1) break;
             res.push(ind);
         }
      }
      return res
    }
    Ответ написан
    2 комментария
  • Почему не совпадает сложность алгоритма?

    LaRN
    @LaRN
    Senior Developer
    Сложность показывает сколько элементарных операций нужно сделать, чтобы решить задачу.
    Если использовать цикл, то сложность будет порядка n операций (по числу итераций цикла), а если взять формулу суммы n первых членов арифметической прогрессии, то сложность будет не O(n*n), а порядка O(1), потому что при любом n по указанной формуле можно вычислить сумму условно за одно умножение.
    Ответ написан
    1 комментарий
  • Как покрыть полигон прямыми?

    LaRN
    @LaRN
    Senior Developer
    Не нужно рисовать сразу все прямые.
    Нужно найти на указанном контуре две точки, наиболее удаленные друг от друга.
    Далее рисовать линии разметки перпендикулярно линии проведенной через найденные выше две точки.
    Так как точки наиболее удаленные (условно самая длинная хорда), количество линий разметки будет максимальным.

    Для поиска наиболее удаленных точек, можно по координатам точек образующих контур вычислить геометрический центр масс фигуры и затем найти точки контура наиболее удаленные от нет по формуле Евклида.
    Далее для каждой найденной точки строим луч из текущей точки через геометрический центр масс и ищем точку пересечения этого луча с контуром.
    Исходная точка контура и найденная путем трассировки луча образуют отрезок, нужно найти и запомнить длину отрезка.
    После этого имеем массив отрезков с длина, нужно выбрать самый длинный (или один из самых длинных, если есть несколько равных по длине).
    Найденный отрезок и будет проходить через наиболее удаленные точки контура и перпендикулярно ему нужно строить линии разметки.
    Ответ написан
    Комментировать
  • Как найти число которое будет делиться без остатка на все элементы массива?

    LaRN
    @LaRN
    Senior Developer
    Я бы вначале отсортировал массив чисел по возрастанию.

    Зачем для каждого элемента массива проверил бы, а нет ли в массиве числа большего чем данное (для этого сортировал массив, чтобы не перебирать каждый раз все элементы массива - это экономит время), которое делиться на данное, и если такое число есть, то текущее выбрасываем, т. к. оно уже входит в состав большего числа.
    (Например в приведенном массиве есть число 3 и есть число 300, 3 можно выкинуть, т.к. 300 делится на 3.)

    Зачем оставшиеся числа перемножаем (исключая дубли, если они будут).
    (это позволит уменьшить количество чисел и тем самым избежать переполнения типа unsigned long на длинных массивах)

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

    Например: есть число 100500 = 2*2*3*5*5*5*67, тогда словарь будет такой
    {2: 2, 3: 1, 5: 3, 67:1}

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

    LaRN
    @LaRN
    Senior Developer
    А ключи отсортированы?
    Десятки минут даже для Excel как-то медленно.
    Это как будто для каждого ключа одного файла пробегать все ключи другого.
    Если взять два отсортированных списка и пройтись по ним, то недостающие ключи можно за один проход найти - это секунды для 100000 записей.
    Ответ написан
    Комментировать
  • C#. Как минимизировать функцию, в которой присутствуют суммы?

    LaRN
    @LaRN
    Senior Developer
    Судя по виду функции ваша задача распадается на три более простых.
    Т. к. в функции есть три блока сумм и в каждом блоке сумм суммируемые значения идут в четной степени (степень = 2), то значение каждой из сумм строго положительно.
    А раз так то минимизируйте каждую из сумм по отдельности.

    Теперь если взять каждую из сумм по отдельности, видно что для минимизации значения коэффициентов С не важны, минимизировать нужно результат выражения в скобках.
    Если взять выражение в скобках, то для него минимум будет для случая, когда
    a(i)=x(i), b(j)=x(j), d(k)=x(k), т.е. для тех a(i), b(j), d(k), которые попадают в диапазон x min<=x<=x max, значение
    скобки будет минимальным и равным нулю.

    По остальным значениям, функция вида (а/х)^2 не имеет экстремумов, это значит, что она принимает максимальное и минимальное значение на границе диапазона x min<=x<=x max, т.е. либо для х =x min, либо для
    х = x max.
    Ответ написан
    Комментировать
  • Как считать тепловую карту удалённости от дорог в городе?

    LaRN
    @LaRN
    Senior Developer
    Все зависит от точности, которую вы хотите получить.
    Скорее всего вам нужно учитывать не только удаленность от дорог, но и загруженность дороги, т.е. условно есть МКАД от которого лучше жить километрах в 7 или маленькая дорога на въезде в микрорайон для которой и 50 м нормальное удаление. Также если на определенных участках дорог периодически случаются мощные пробки, то влияние такой дороги будет намного сильнее чем у просто загруженной магистрали.

    Кроме этого на втором этапе вам возможно захочется учитывать факт того, что если между дорогой и расчетной точкой есть естественные или искусственные препятствия, то влияние дороги на эту точку снижается исходя из типа препятствия.

    Я бы попробовал так:
    Если сравнить дорогу с проводником тока и загруженность дороги сравнить с силой тока, то можно попробовать воспользоваться вот этими формулами:
    https://www.chem-astu.ru/chair/study/physics-part2...
    Нужно только подобрать коэффициенты формулы исходя из условий вашей задачи.

    Условную силу тока определять из указанных выше факторов.
    Ответ написан
    Комментировать