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

    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 точки можно поправить случайным образом двигая линии. Но чтоб случайность была эффективнее я бы предложил генетически алгоритм.
    Ответ написан
    Комментировать
  • Можно ли сделать быстрый поиск по карте с 1 млн маркеров (MongoDb) и кластеризацией?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Почти все гео-поисковые системы для хранения геометрии используют либо quad-tree либо R-tree. К чему здесь Mongo - вообще непонятно. Это бд другого типа. Для документов.

    Бери деревья и используй. Мало памяти - ну решай это быстрыми дисками или просто покупай больше узлов для параллельных поисков.
    Ответ написан
    3 комментария
  • Как компьютер складывает два числа?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Тут тема вопроса - не ассемблер а цифровые устройства и микропроцессорные системы. В частности сумматоры. Тема - специфичная. Не для тостера. А для форумов где сидят дядьки с паяльниками. Вообще удивительно что такое ещё задают.
    Ответ написан
    Комментировать
  • Как найти кратчайший путь с минимальным количеством поворотов(повороты в приоритете)?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Похоже это называется Расстояние Манхеттена.
    Как пешеход идёт по кварталам.

    Кстати автор слегка хитрит. Там ещё есть два пути с таким же числом поворотов.

    Нужно ли искать все? И как долго автор хочет искать пока задача не превратилась чисто в комбинаторную?
    Ответ написан
  • Есть ли алгоритм кодирования, который не допускает подряд 3-6 одинаковых значений?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Да ты правильно делаешь. В телеграфии и передаче данных - это единственный способ синхронизировать передатчик и приёмник. Договорись сам с собой что 3 нуля подряд + 3 единицы будут синхро-импульсом а дальше пойдут данные. Если будет сбой - значит был ложный синхроимпульс и надо ждать следующий.
    Ответ написан
    Комментировать
  • Как вырезать квадраты из матрицы?

    mayton2019
    @mayton2019
    Bigdata Engineer
    На самом деле эту задачу можно сделать очень разными способами. Деструктивными и нет. Экономными (массив) и неэкономными (зубчатый или двумерный массив). И автор должен конкретизировать как он хочет.
    Ответ написан
    Комментировать
  • Читабельность кода или скорость его выполнения?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Несколько мыслей.

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

    2) Во всех случаях всегда надо выбирать "читабельность". Прошли времена когда программисты отдавали дань ассемблеру или указателям на сырую память. Сегодня так пишут все меньше и меньше. И основная задача написания кода - сделать его понятным для вашего коллеги. Цитата : "Код пишется человеком для прочтения человека и лишь в очень редких случаях - для машины".

    Вобщем пишите код. Просите коллег чтоб они его посмотрели и ПОНЯЛИ что вы имели в виду. И если коллеги будут кричать WTF! - фиксируйте их замечания и доводите до такого состояния чтобы ни у кого не было вопросов.
    Это будет идеальный код по Роберту Мартину.
    Ответ написан
    Комментировать
  • Зачем нужно знать эффективность\сложность алгоритма?

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

    А если говорить простыми словами то все подмножество алгоритмов делится на константные O(1) - это поиск в хеш-табличке. Логарифмические O(Log n) - это поиск в дереве или сортированной коллекции. Линейные - любой поиск в произвольнйо коллекции O(n). И дальше идут полиномиальные (это всегда цикл в цикле) экспоненциальные O(exp n). Здесь начинается криптография. И комбинаторные, в формулу которых входит факториал от N или еще апроксимируется O(n^n). Последние как-раз и создают тот самый класс нерешаемых наукой алгоритмов для которых пытаются строить квантовые устройства работающие совсем на других физических принципах.
    Ответ написан
    Комментировать
  • Как создать алгоритм, который определяет на видео в реальном времени цифры ( от 0 до 9) и цвет?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Тут наверное OpenCV не надо. Просто замерять цвета нескольких точек в течение 3-5 секунд (как фотик наводит резкость) и брать их среднее значение.

    Этот алгоритм прост - как автомат Калашникова. А все что простое - работает быстро. Как будет работать OpenCV на Raspberri мне даже страшно представить. Скорее всего плохо т.к. OpenCV проектировалась сразу для сильного железа а Распберри это больше игрушка для энтузиастов чем платформа для видое-обработки.
    Ответ написан
    2 комментария