Ответы пользователя по тегу Алгоритмы
  • Как однозначно конвертировать цвет из RGB в HSL и обратно, получая один и тот же результат?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Дело в том что HSV - это полярная система коррдинат. Цилиндр по сути. И один из параметров цветового тона (угол вращения) может циклически повторяться неся одинаковый смысл. И может быть любым находясь в центре цилиндра.

    Поэтому такая формула не будет никогда однозначной.
    Ответ написан
    Комментировать
  • Как перевести строку в число в ассемблере?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Безотносительно ассемблера. Это каноническая задача которую решают на 1 уроке информатики.
    Да был такой предмет когда-то. Допустим я-бы не знал готовой функции перевода. Но можно
    наверное написать свою функцию. Понадобиться ассемблерная операция деления+нахождения остатка.
    Ответ написан
    3 комментария
  • Как с MathNet.Numerics уменьшить число коэффициентов у преобразования Фурье?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Игнорируй младшие коэффициенты - вот и будет сжатие. Так оно и работает. Честно-честно.
    Ответ написан
    4 комментария
  • Какова сложность алгоритма?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Я обычно оцениваю на глазок просто мысленно предполагая что данных очень много.
    Например строка длиной 2 млрд символов.
    В этом случае 3 линейных поиска по ней (indexOf) дадут нам формулу

    O(n)

    Это в негативном сценарии когда мы не нашли скобочек трех типов.

    Но в позитивном сценарии если мы нашли - начинает работать еще более хардкорная логика
    реплейсмента которая ... ну я не знаю как работает. replace(..) которая под капотом тоже имеет
    свою complexity. Наверное тоже линейную если стоит билдер строк. Получается что линейная вложена
    в другую линейную. Получается квадратичная.

    o(n^2)

    Вообще мне кажется что этот код не оптимален и его лучше просто переписать на какой-то replace
    с регулярками чтоб заменять не только первое вхождение но и все. Впрочем я тут не сильно помню как
    Js работает с заменой. Пускай знающие откомментируют.
    Ответ написан
    Комментировать
  • Как правильно пропарсить лабиринт в граф?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Мне кажется что ничего не нужно парсить. Можно создать интерфейс графа поверх лабиринта.
    Вершины есть. Ребра есть. Все готово для поиска путей и доказательства достижимостей.

    Можно только добавить дополнительно на все ребра и вершины возможность ставить метки.
    Это как раз для графовых алгоритмов.
    Ответ написан
    Комментировать
  • Как расчитать шанс вещи от цены?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Линейная регрессия.
    Ответ написан
    Комментировать
  • Массовое сравнение сток, поиск пересечений, каким инструментом воспользоваться?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Коробочное решение - это библиотеки обработки текста Apache Lucene, Sphinx. Но их нужно программировать - следовательно вам надо искать разработчика.

    ElasticSearch/Solr (под капотом это тот-же Lucene) - вариант но вам надо будет его конфигурировать и тщательно подбирать настройки Analyzer чтоб не получать ложно-позитивных срабатываний. Возможно в дефолтном варианте он слишком умный и делает стемминг там где не надо.

    Если самостоятельно программировать то мы имеем такую complexity : 100 000 слов проверить в 150 текстах - это примерно 15 миллиардов тривиальных проверок. Типа поиска строки в строке. Хочется от этого уйти. Поэтому надо искать какие-то структуры данных работающие на exists(..). Например Фильтры Блума. При 150 тыщ элементов он будет достаточно компактен. Или сортирующие и хеширующие структуры (R&B Trees). Тогда вместо 15 млрд мы сведем к 100 либо к 150 тыс циклов по одному из измерений как будет выбрано.
    Ответ написан
  • Как можно ускорить алгоритм?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Какое-то время я посвятил играм с простыми числами. В студенчестве еще.
    Вот тут не надо каждый раз прибавлять единичку.
    if (K % (i + 1) == 0) {
    Ее просто надо учесть в условиях цикла.
    if (K % i == 0) {
    Далее. Если нужно найти первый попавшийся делитель - то не надо перебирать все числа. Достаточно только 2 и все нечетные. Или даже лучше задать хард-кодом таблицу простых чисел до 2^16. Это как раз будет половина разрядной сетки int32.
    int primes[] = { 2,3,5,7,11,13,17...... 65521 }
    Это даст хорошее ускорение для поиска. Хотя время загрузки executable может увеличится. Кстати у меня много вопросов к бенчмаркам где стоит запредельно короткое время инициализации (0.25 s). Здесь - практически невозможно вычленить где время занимает алгоритм а где - просто запуск процесса операционки. Обычно когда меряют что-то подобное - меряют длительные процессы хотя-бы порядка минут но никак не секунд.
    Ответ написан
    2 комментария
  • На сколько критичен сдвиг в массиве для алгоритмов?

    mayton2019
    @mayton2019
    Bigdata Engineer
    На проблему надо смотреть в комплексе. На самом деле еще важный вопрос - как вы найдете этот элемент в массиве. Это - тоже часть алгоритма.
    Ответ написан
    Комментировать
  • Доказано ли, и можно ли сжать произвольные данные до 20 байтов к примеру?

    mayton2019
    @mayton2019
    Bigdata Engineer
    В 4 байта можно втиснуть 4 миллиарда состояний. Или в терминах игровой индустрии - возможно создать процедуральный генератор миров или локаций где из одного целого числа можно создать 4 млрд миров. Но качество самих миров будет скорее всего плохое. Как раз по причине этих жалких четырех байтов. У нас не будет детального контроля над ландшафтом и другими свойствами мира. Согласитесь иметь 32 переключателя или 4 регулятора по 250 уровней (как угодно смотреть на это) - это маловато.

    По поводу обратной задачи. Всё будет зависеть от формы как представлены исходные данные. Но мне кажется что делать такой архиватор безсмысленно. Достаточно просто грамотно сохранить тот мир который нарисовал дизайнер миров. В игре kkreiger достаточно лаконично в 64 килобайта была втиснута Quake-подобная локация.

    Хотя если долго в нее поиграть видны дефекты мира. Процедуральные текстуры как будто повторяются. И геометрия мира какая-то повторяющася.
    Ответ написан
    Комментировать
  • Как реализовать алгоритм экспайринга элементов в базе данных?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Топик тегирован "Базами Данных". Какими - чорт его знает.

    Поэтому есть следующие коробочные решения. Cassandra, Redis, Amazon DynamoDb. Все они поддерживают дополнительное поле TTL и удаляют записи автоматически без участия разработчика.

    По поводу подводных камней о которых пишет автор. Это всё очень плохо и почти не работает в боевых условиях. Пока бэкап данных делается в обычном плановом режиме - никто не знает о существовании всяких там левых файлов на сервере приложений. Грубо говоря все думают что состояние системы (state) лежит в базе и только в базе. Поэтому попытка размазать состояние системы по нескольким нодам вычислительной сети приводит к сложным и трудноуловимым последствиям.
    Ответ написан
  • Как понять в коде сложность алгоритма?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Понимать сложность алгоритмов - сложно. В общем случае глядя на исходних достаточно трудно сказать какое там o(n). Особенно если есть рекурсии и предикаты которые срабатывают с вероятностью которую мы не знаем.

    Вообще, нарабатывая опыт. Например обход элементов квадратной матрицы имеет квадратичную стоимость а обход куба - кубическую. Это из простого. Шаблоны дихотомического поиска почти всегда содержат в основе своей формулы логарифм по основанию 2. И комбинаторные алгоритмы (сочетания и перестановки) - практически всегда содержат в своей основе n под факториалом.

    Кстати если формула содержит суперпозицию факториала и полинома - то полином можно выкинуть. Т.к. в сравнении пределов факториал улетает в бесконечность быстрее и соотв. решение зависит только от факториала.

    Я не очень понимаю зачем для собеседования знать оценку неизвестных алгоримов. Я прошел не один десяток интервью и меня никогда никто не просил оценить сложность неизвестного алгоритма.

    По поводу Дональда Кнута. Ничего он не поймет. Кнут писал 40 лет назад. Писал про железо которого уже не существует (ленточные накопители) и продавливал свои идеи алгоритмизации на ограниченном числе ресурсов. Кнут просто издевается над современным читателем имеющим ноутбук и смартфон тем фактом что заставляет изучать несуществующий компьютер MMIX (это такая себе машинка-калькулятор вроде Феликса или Энигмы, такие вот у меня ассоциации) и под него-же писать и читать код. Ну кому это надо!

    Сегодня я снимаю шляпу перед тем трудом который он сотворил. Но если студент хочет ПРОСТО освоить тему оценок сложностей алгоритмов то можно взять что-то более быстрое и эффективное. Вирт. Седжвик. Даже Кормен.
    Ответ написан
    Комментировать
  • Алгоритмы для эффективной нагрузки на сервис со стороны клиента?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Скорее всего прямой формулы не существует. Есть сравниительные подходы. Тоесть к примеру вы знаете уже такую конфигурацию которая "держит" 10 млн запросов. Вот смотрите как она реализована. Скорее всего это не один сервис а целый грид сервисов которые географически разбалансированы так чтобы каждая нода брала на себя часть нагрузки.

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

    mayton2019
    @mayton2019
    Bigdata Engineer
    Хеш-таблица - это не массив. Хотя она может опираться на массив как на базовую структуру хранения (в случае метода открытой адресации). В классическом варианте хеш таблица - это совокупность структур данных в памяти. Массив массивов. Или массив списков (как будет угодно).

    Про количество элементов - это сложный вопрос. Хеш таблица (ХТ) обычно резервирует памяти чуть больше чем надо. И экстендится когда памяти не хватает. Там для экстенда есть отдельный алгоритм. Можно считать что оверхед такой хеш-таблицы больше чем у массива. А количество элементов фактически - хранится отдельным счетчиков.

    Вообще русская wiki достаточно хорошо описывает ХТ и можно начать читать с нее и далее по ссылкам.
    Ответ написан
    Комментировать
  • Как нормализовать растянутые данные не линейной нормализацией?

    mayton2019
    @mayton2019
    Bigdata Engineer
    В науке и технике используются логарифм и экспонента. Только надо подобрать коэффициенты.
    Результат сохраняет монотонность. Но малые значения усиливаются а большие ослабляются.

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

    Тоже сохраняет мототонность.
    Ответ написан
    Комментировать
  • Какие алгоритмы помехоустойчивого кодирования можно использовать для передачи зашифрованных сообщений?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Обычно начинают с кодов Хемминга. Они - простые и исправляют 1 бит на блок.

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

    mayton2019
    @mayton2019
    Bigdata Engineer
    Проблема кроется в самой постановке. Боту недостаточно убегать от красных. Ему надо заранее прокладывать траекторию так чтобы при равных скоростях они оба бегали бесконечно. Я так понимаю что это будет успех.

    Все прочие алгоритмы при равных скоростях тяготеют к тому что зеленый будет становится все ближе и ближе. Ему ведь надо тыкаться в углы. А все известные машинные алгоритмы ближнего действия требуют ощупывания или осязания тупиков и углов. При таком раскладе зеленый будет пойман. Или надо давать ему фору в скорости.
    Ответ написан
  • Как проверить Теорию 6 рукопожатий в БД с миллионами юзеров?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Поскольку это задача из теории графов - то и решать ее нужно на языках разработки и библиотеках поддержки графов. 1 млн узлов графа - это не много для современной памяти.

    Из java библиотек есть Guava, Jung, GraphT.
    Ответ написан
    Комментировать
  • Как написать алгоритм пересечения графиков двух функций с определенным уровнем допуска?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Если функция непрерывна и если задана таблично. То можно проинтерполировать значения на интервалах между точками хотя бы по любой гладкой кривой типа полинома. И тогда окажется что несмотря на то что дискретные точки недостаточно близко находились друг к другу, а интерполированные отрезки сблизились к некому "эпсилон".

    Тоесть в условии задачи скорее всего не хватает деталей.
    Ответ написан
  • Оптимальный способ рассортировать точки в 2D по таблице?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Я бы предложил 2 шага.
    1) построить гистограмму для всех X,Y координат раздельно. Выбрать локальные минимумы. Это будут линии таблицы. Но не точно.

    2) дефекты клеток в которые попали по 2 точки можно поправить случайным образом двигая линии. Но чтоб случайность была эффективнее я бы предложил генетически алгоритм.
    Ответ написан
    Комментировать