Ответы пользователя по тегу Алгоритмы
  • Алгоритмы парадигмы и т.д. Как учить?

    iCoderXXI
    @iCoderXXI
    React.JS/FrontEnd engineer
    Важно знать и язык, и алгоритмы, и парадигмы, и структуры данных, и еще очень много всего, дабы успешно справляться с разнообразными задачами различной сложности.

    Лично я советую Кодварс для прокачки базовых скиллов в алгоритмах, структурах данных и API языка, например JavaScript. Разумеется литературу тоже стоит читать, и ролики всякие познавательные смотреть на темы, но это гуглится.

    В целом я склоняюсь к тому, что 90% практики и 10% теории - нормальное соотношение для эффективного развития, при условии, что этому уделяется не менее 4-6 часов в сутки.

    Ваши 10-20 тысяч часов для достижения мастерства в конкретной сфере никто не отменял и вряд ли сможет.
    Ответ написан
    Комментировать
  • Как развить алгоритмические навыки программирования?

    iCoderXXI
    @iCoderXXI
    React.JS/FrontEnd engineer
    Вообще алгоритм - это последовательность шагов, стало быть декомпозировать надо, потом снова декомпозировать, пока отдельные части не станут решаемы. Потом архитектурно всё соединяешь и вуаля.

    Иногда когда нужна многоходовочка, я сажусь и рисую, пишу, короче говоря формулирую, а после структурирую поток сознания.

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

    iCoderXXI
    @iCoderXXI
    React.JS/FrontEnd engineer
    Го на кодварс и качайся там хотя бы до 4-кью, потом уже умные книжки понятнее станут. :)
    Ответ написан
    Комментировать
  • Как посчитать количество чисел превышающие количество памяти?

    iCoderXXI
    @iCoderXXI
    React.JS/FrontEnd engineer
    Считать порциями, которые умещаются в памяти, отдавать порциями. Если нужно в заголовках отдать общий объём, значит складывать на диск при подсчете, одновременно подсчитывая объём, потом отдать заголовки отдавать с диска порциями... Как-то так.
    Ответ написан
    Комментировать
  • Как сделать рандом из массива с указанной вероятностью для элементов?

    iCoderXXI
    @iCoderXXI
    React.JS/FrontEnd engineer
    Приводим коэффициенты к целым числам пропорционально так, чтобы минимальный коэффициент равнялся единице, остальные округляем до единиц. Таким образом получаем на выходе массив с целыми числами, где отношения в пропорции элементов друг к другу будут близкими к изначальным. Далее на основе этого промежуточного массива генерируем новый, с диапазонами, для первого элемента от 0 до его значения, для каждого последующего от суммы всех предыдущих значений до сумма + текущее значение. Таким образом весь массив диапазонами покрывает значения от 0 до суммы всех величин из первого промежуточного массива, которую обозначим как S. Далее используем только второй массив с диапазонами, для каждого элемента выборки генерим рандомное число R от 0 до S, и находим ключ согласно тому диапазону, куда в каждой итерации попадает R.

    По идее данный алгоритм идентичен варианту Дмитрия, но эффективен по части использования памяти. Опять же, его тоже можно оптимизировать. :)

    ЗЫ: Те же яйца, но в профиль предложил Сергей Соколов
    Ответ написан
    2 комментария
  • Делимость двоичного числа на N?

    iCoderXXI
    @iCoderXXI
    React.JS/FrontEnd engineer
    Максимальное число для A+B бит = С = 2^(A+B) - 2^B, т.е. для 9 бит это 2^9-2^2 = 512-4 = 508

    Нужно найти все числа от N до С включительно, которые делятся на N без остатка (по сути являются произведением N на индекс цикла от 1 до (C div N) включительно), и проверить, являются ли они суммами не повторяющихся степеней двойки, и если являются, то равняется ли количество чисел в сумме значению A. Т.е. проверяем, все ли A бит задействованы.

    Для данного случая при N = 25, 508 div 25 = 20 (итераций). Нужно проверить является ли произведение индекса цикла на N суммой из A (7) чисел (не повторяющихся степеней двойки от 0 до A+B-1 (8)).

    Числа (степени двойки) можно предварительно вычислить и сложить в массив, и доставать оттуда по индексу.

    Таким образом самое сложное, что нужно написать, это функцию, которая будет проверять, является ли её аргумент суммой A не повторяющихся степеней двойки от 0 до A+B-1.

    Проверять все не нужно, можно прерывать выполнение на первом положительном результате.

    Быстро проверять на степень двойки можно через битовую операцию сравнения И

    Например K = 13 (8+4+1), тогда K & 1 = 1, K & 2 = 0, K & 4 = 4, K & 8 = 8. Т.е. очевидно, что если K & 2^i > 0, то число содержит степень двойки. Ну и останется считать для каждого числа, сколько степеней двойки оно в себе содержит.

    Опять же, сверять надо не со всеми степенями двойки, а с ближайшей меньшей от K, т.е. для K=28, максимальная степень двойки для сравнения будет равна 16. Для K=50 - 32, для К=100 - 64 и т.д.

    Нужно будет как-то вычислять эту степень, лучше всего лениво. Просто вычисляя очередное К, проверить, больше ли оно следующей степени двойки.

    https://codedump.io/share/hMw9j5suUF41/1/doesbinar... вот беглое решение на JS

    PS: решение нуждается в оптимизации, но это уже самостоятельно :)
    Ответ написан
    Комментировать
  • Как найти цепочки пар?

    iCoderXXI
    @iCoderXXI
    React.JS/FrontEnd engineer
    А еще часть клиентов будет отказываться от ряда цепочек, так-что невозможно найти одну-единственную и вариантов будет уйма.

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

    iCoderXXI
    @iCoderXXI
    React.JS/FrontEnd engineer
    Ответ написан
    Комментировать
  • Как научиться делать сортировки любой сложности в JavaScript?

    iCoderXXI
    @iCoderXXI
    React.JS/FrontEnd engineer
    Попробуй посмотреть в сторону Lodash/Underscore, там есть масса оптимизированных методов для, в т.ч., и сортировок по нескольким полям в разных направлениях.
    Ответ написан
    Комментировать
  • Как считать пустым элемент даже с пробелами?

    iCoderXXI
    @iCoderXXI
    React.JS/FrontEnd engineer
    Я отказался от прямых динамических манипуляций в DOM посредством хоть jQuery, хоть Vanilla JS. На мой взгляд это зло, которое ведет к полной и тотальной непредсказуемости поведения приложения и формированию обширного поля для неуправляемых багов.

    Наш путь - React.JS, когда интерфейсы генерятся из данных, а ты меняешь только данные.
    Ответ написан
    Комментировать
  • Как реализовать алгоритм частоты появления?

    iCoderXXI
    @iCoderXXI
    React.JS/FrontEnd engineer
    Я бы решил эту задачу так - каждому объекту присвоил бы счетчик, который инкрементируется при показе объекта.

    Т.е. 100 объектов - 100 счетчиков.

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

    После сортировал бы этот массив по возрастанию, и показывал объект по самой первой ссылке из отсортированного массива (при этом инкрементируя его индивидуальный счетчик).

    И так каждый раз. Таким образом получаем отображение наименее показанного объекта с учетом приоритетов минимальными усилиями и с достаточно прозрачной логикой.
    Ответ написан
    Комментировать
  • Ресурсы на углублённое изучение JavaScript с примерами?

    iCoderXXI
    @iCoderXXI
    React.JS/FrontEnd engineer
    Такой вид деятельности человека, как разработка программ, состоит из нескольких составляющих.

    Язык программирования - это инструмент, как молоток. Можно гвозди забивать, а можно по пальцу себе стучать, или на ногу уронить, ну и масса еще менее конструктивных способов применения.

    Вот допустим ты раздобыл инструмент и даже пару гвоздей забил им. Хорошо. Теперь перед тобой стоит задача построить сарай, и ты, вдруг, понимаешь, что кроме забивания гвоздей нужно еще кое-что:
    1) Нужно определить место, где будет построен сарай
    2) Нужно определиться с размерами сарая
    3) Нужно набросать некий план устройства сарая (гайдлайн/проект)
    4) Нужно прикинуть количество и виды строительных материалов
    4.1) Допустим строим самый простой деревяный сарай:
    4.1.1) Нужно посчитать брус под опоры (каркас)
    4.1.2) Нужно посчитать облицовочный брус
    4.1.3) Внезапно сараю нужны ворота
    4.1.4) Так же сараю нужна крыша, так-что в пункт 4.1.1 внезапно добавляем брус под каркас крыши
    4.1.4.1) Крышу решили облицовывать шифером, так-что закладываем шифер, предварительно посчитав площадь покрытия
    4.1.5) Оказалось что с земли строить сарай не удобно, нужна лестница
    4.1.6) Брусья оказались весьма тяжелыми, так-что нужна либо лебедка, либо помощники, а лучше то и другое сразу
    4.1.7) Опоры оказывается нужно заглублять в землю на полтора метра, иначе получается неустойчивая конструкция - пришлось озаботиться выкапыванием ям под опоры. Ломом это делать оказалось долго и муторно, да и лом пришлось приобрести
    4.1.8) Сосед подсказал, что если просто закопать опоры, то они сгниют за два года. Нужно опоры просмолить. пришлось купить бочку смолы и соорудить печь, чтобы смолу разогреть.
    4.1.9) Гвозди сотки забивать в доски и опоры простым молотком оказалось неудобно, пришлось приобрести молоток помощнее, но он оказался тяжелым и руки быстро устают. Работа идет очень медленно
    4.1.10) Сосед подсказал крепить доски саморезами. Пришлось купить саморезы и шуруповерт
    4.1.11) Аккумулятор у шуруповерта оказался слабый, он 10 минут работает и полтора часа заряжается. Пришлось купить еще один, работающий от розетки
    4.1.12) Второй шуруповерт За пол-часа разогревается так, что рискует расплавиться. пришлось купить еще одиин и работать ими попеременке
    4.1.13) Вот сарай построен, ворота установлены, оказалось что на ворота нужен замок
    4.1.14) Еще в сарае очень темно, пришлось провести туда электричество, для этого пришлось вкопать пять столбо ви приобрести 200 метров кабеля, и прочую электрическую мелочь типа выключателей
    4.1.15) По дереву монтировать проводку необходимо внавес, чтобы кабель не контактировал с деревом, пришлось заморочиться
    4.1.16) Зимой сарай оказался очень холодным, дерево промерзает и сыреет. Пришлось задуматься об утеплении сарая снаружи, но это летом, пока терпим.

    Ну и так можно проодлжать до бесконечности.

    А теперь, внимание, вопрос - а при чем здесь вообще молоток?

    PS: Разумеется когда ты построишь десяток-другой разнообразных сараев, многие из этих вопросов ты будешь обдумывать заранее, стало быть сюрпризов станет гораздо меньше, а сбываемость прогнозов гораздо выше. Тем и ценен опыт - сын ошибок трудных.
    Ответ написан
    Комментировать
  • Как подходить к решению нетривиальных задач?

    iCoderXXI
    @iCoderXXI
    React.JS/FrontEnd engineer
    Сам там балуюсь по мере свободного времени, сил и желания, чисто для поразмять мозги, т.к. в олимпиадах я участвовал давно, последний раз аж в 1998 году. Пруф: https://www.codewars.com/users/iCoderXXI

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

    Решаю итеративно, добиваясь прохождения тестов. Часто бывают пограничные случаи, которые далеко не сразу становятся очевидны и часто поначалу в ту сторону не думаешь, тут что называется хоть бы завелось вообще, а не то чтобы полетело. потом решение допиливаешь итеративно под каждый не прошедший тест.

    Часть задач встречаются, которые ранее никогда не решал. Если не понятно о чем речь, то гуглю суть задачи. стараюсь избегать смотреть в решения, если они где-то встречаются, для меня принципиально решить самостоятельно, пусть не так идеально и красиво.

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

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

    Где-то даже сохранился код гипертекстового компилятора и просмотрщика, который я писал в 1997 году по заказу одного юриста. Сейчас оно никому не надо, т.к. есть всякие Консультант+, но по тем временам я считаю был весьма интересный продукт. Кому интересно вот ссылка на гитхаб https://github.com/iCoderXXI/hypertext
    Ответ написан
    Комментировать
  • Как выполнять некоторое действие не чаще чем N раз в единицу времени?

    iCoderXXI
    @iCoderXXI
    React.JS/FrontEnd engineer
    Если события поступают достаточно часто, то при успешной обработке писать в поле mictorime(TRUE).
    Перед отработкой проверять это поле и текущий microtime(TRUE) и отбрасывать событие, если еще не вышел расчетный таймаут. Для 200 событий в минуту таймаут будет 60/200.
    Ответ написан
    Комментировать