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

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Если без оптимизаций, то как угодно, это крайне простая задача для начинающего программиста. Если же с оптимизациями, то зависит от того, что именно нужно оптимизировать - например, память или вычисления.

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

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

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Основными организациями являются: ЦУП (РФ), NORAD (США и Канада, так что без VPNа не получится) и ESA (Европа).

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

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Можно индексировать индекс. А именно, хранить, например, в 10 файлах: в первом все id % 10 == 1, во втором id % 10 == 2 и т.д. Если id - строки, то по первой букве, например. По сути это хеширование. Если потом перестраивать, то не всё и сразу, а тоже по 10% от всего индекса за раз. Это как пример.
    Ответ написан
  • Как понять в коде сложность алгоритма?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Мат. анализ и практика программирования помогают в этом. Да, это большие области знаний.

    Кратко можно ознакомиться здесь:
    https://ru.wikipedia.org/wiki/«O»_большое_и_«o»_малое

    P.S. Простого ответа нет. Никто не говорил, что будет легко. Даже есть поговорка: тяжело в учении - легко в бою. Ну а если в учении легко, то в бою - верная смерть.
    Ответ написан
    Комментировать
  • Как вернуть первые N максимальных элементов из массива без сортировки массива?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Строго - никак.

    Есть разные алгоритмы частичной сортировки с минимальной сложность O(N+KlogN), где K - количество максимумов, а N - размер массива, но совсем без сортировки не получится в общем случае.

    Если не строго, то сильно зависит от специфики задачи, из которой нужно взять какие-то доп. условия и допущения. Именно они позволят оптимизировать алгоритм.

    Например, если K не строгое, а лишь примерное, то можно прикинуть некий порог, выше которого эти элементы будут расположены. Скажем, K=10, N=1000 элементов, и в каждом случайное число от 1 до 1000. Тогда можно почти уверенно заявить, что все искомые элементы больше 970. Пробегаем массив один раз и находим все элементы больше 970. Их окажется около 30 плюс-минус. Главное, что не менее 10. Далее этот маленький массив можно отсортировать, но это снова сортировка.
    Ответ написан
  • Как проверить введенное римское число на правильную запись?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Просто сделайте функцию перевода римского числа в обычное (int32). Ошибка (т.е. исключение) в ходе работы этой функции и будет означать невозможность преобразования. Алгоритм тот же.

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

    dollar
    @dollar
    Делай добро и бросай его в воду.
    1. A[i] ∈ A
    2. i ∈ {0, ...A.length - 1} или i ∈ {}

    Как по мне, такой инвариант будет несколько бесполезен, поскольку не позволяет доказать правильность алгоритма (по индукции). Также "или i ∈ {}" ещё более бесполезное дополнение к условию, поскольку, хоть и не делает инвариант неверным, но делает его слабее, ведь внутри цикла (да и после него) в i всегда какое-то число.

    Имхо, хороший инвариант:
    В элементах A с индексами до [i-1] включительно не содержится v.
    Ответ написан
    Комментировать
  • «Новый» подход к рекурсии?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Нет, подход не «новый».

    Автор, дам советы по изложению больших текстов (не литературных, а по делу).
    • Название не должно содержать интригу, а быть максимально понятным.
    • В первом абзаце должно быть вступление, которое ещё детальнее раскрывает тему и объясняет, что будет дальше (но не частично, а полностью). Не нужно начинать издалека. Это просто обобщение, абстрактный уровень того, что будет дальше. То есть нужно начать с главного, с объяснения сути.
    • В последнем абзаце примерно то же самое, что и в первом, то есть тоже обобщение, только с позиции завершения (с позиции выводов).
    • И с учётом специфики этого ресурса, среднюю часть лучше вообще загнать под спойлер, если там больше 2 абзацев. Большие статьи лучше вообще в другом месте публиковать, но порядок изложения тот же нужен будет.
    Ответ написан
    2 комментария
  • Как равномерно размешать строки?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Предлагаю такой простой алгоритм.

    Сначала выясняем, какая строка больше, сравнив length1 и length2. Какая больше, в той и будем растворять.

    Например, путь length1 >= length2 (пример с "hello world"). Тогда посчитаем, сколько символов чередовать: x = Math.round(length1/length2). Далее в цикле берём x символов из исходной строки, затем 1 символ из строки с невидимками. И так до конца, пока строки не кончатся. В цикле склеиваем эти кусочки в результирующую строку.

    Если же length1 < length2, то всё то же самое, только берём 1 символ из исходной и x из строки с невидимками.

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

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Сначала считаешь количество "мест" и составляешь массив возможных цифр: 0, 2, 9
    Причём, для каждой цифры также нужно запомнить, сколько её повторять. В данном примере "2" можно повторить дважды.

    Далее в цикле или рекурсией:
    на первом месте может быть 0,2,9
    на втором месте - уже зависит от первого места (если первое 0, то второе - 2,9, а если первое 2, то второе 0,2,9 и т.д.)
    на третьем месте снова выбираешь из оставшихся.
    Вот в таком порядке и сможешь вывести все перестановки.

    Естественно, код приводить не буду, так как вопрос про алгоритм. Осталось написать в виде текста программы. Удачи)
    Ответ написан
    Комментировать
  • Как эффективно найти все объекты, у которых в названии есть все заданные слова?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Конечно, есть. Можно увеличить скорость за счёт использования памяти.

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

    Если подумать, можно ещё что-нибудь наоптимизировать. Но это уже надо знать больше нюансов конкретно вашей задачи.
    Ответ написан
    Комментировать
  • Алгоритм перевода RGB-компонент в длину волны?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Если цвет как бы чистый, т.е. светит на одной длине волны (и с одной конкретной частотой), то он будет соответствовать какому-то одному конкретному "цвету": либо R, либо G, либо B, либо что-то между ними. И если между, то глаз может вообще это не увидеть.

    На этом принципе построены светодиодные лампы. Зачем тратить электричество на свет в том диапазоне, который не видно?

    Естественный же свет - это обычно целый спектр. И RGB - это всего лишь 3 точки на нём (условно). Вот я набросал пример спектра:
    spoiler
    614b1f51996c6771307024.png

    А теперь главный вопрос. Ну, предположим, мы смирились с тем, что из всего спектра нам известны всего 3 значения. В конце концов таково человеческое зрение, ничего не поделаешь. И нашли функцию преобразования к длине, то есть к единственному числу. Тогда как в таком случае из единственного числа снова получить три значения RGB? Никак.
    Ответ написан
  • Возможно ли создать алгоритм для угадывания рандомных чисел ЭВМ?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Да, если это псевдослучайные числа.
    Только нужно знать алгоритм генерации этих самых псевдослучайных чисел. Собственно, он и будет решением.

    Главное, что для псевдослучайных чисел такой алгоритм существует. Даже если его не знать, его в теории можно угадать. А значит ответ на вопрос - всё-таки возможно.

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

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Самое простое - это просто позволить игрокам покупать и продавать валюту X по любой цене за валюту Y.
    Это и будет регулирование спросом и предложением.

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

    Так если валюты X - 1000 единиц в игровом мире, а валюты Y - 2000 единиц,
    то курс будет: 1 ед. X = 2 ед. Y.

    То есть получается, что валюта X - более редкая, поэтому более дорогая. А дальше курс определяется соотношением. Вот и формула.

    Можно добавить всякие хитрости. Например, если ты вливаешь в игру 100000 X, то курс меняется не резко, а плавно, и не обязательно линейно.

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

    Конечно, польза самой валюты (что на неё можно купить) определяется субъективно игроками. Так что если какая-то валюта будет условно бесполезной, то курс по идее должен быть иным. Ну а что ты хотел при регулировании игровыми правилами? Если хочешь полностью рыночные отношения, то решение в первом абзаце - дать игрокам полную свободу самим выбирать курс.
    Ответ написан
    Комментировать
  • Как исправить скобочную последовательность?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Определить такую последовательность можно с помощью стека - это структура в памяти (обычный массив), куда вы должны будете складывать скобки по мере прохождения по текстовой строке со скобками. Если скобка открывающая, то скалываете её в стек. Если закрывающая, то вынимаете соответствующую открывающую скобку из стека. И если скобка не та (тип не совпал), или необходимо взять скобку из пустого стека, или в конце строки стек не опустел, то значит в строке присутствует ошибка.

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

    Например, строка из текста программы: x = 2 * 2 + 2);
    С помощью алгоритма выше вы можете узнать, что в скобочной последовательности допущена ошибка. Но есть целых три места, куда можно вставить открывающую скобку, чтобы строка стала валидной синтаксически. Если это Си-подобный язык, то четыре. Но даже если рассматривать более или менее разумные места для вставки, то их два, и всё равно не понятно, что именно будет исправлением ошибки.

    P.S. Дарю вам бонусный пример строки для медитации:
    /* [(]) */ y = (a[i] + 7); // }])
    Ответ написан
    2 комментария
  • Как найти кратчайший путь с минимальным количеством поворотов(повороты в приоритете)?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Неоптимизированный алгоритм (для понимания сути):
    Перебираем вообще все всевозможные пути достижения цели. Считаем количество шагов. Так как нужен самый быстрый путь, то ищем минимальное количество шагов. Теперь среди множества найденных "мнимальных" путей выбираем те пути, которые имеют минимальное количество поворотов. Ответ будет любой из найденных в итоге.

    Можно немного модифицировать, считая сразу (шаги + повороты). Естественно, поворот будет иметь вес больше, чем вес 1 шага. Например, в 10 раз больше, чтобы подчеркнуть важность именно поворотов, что они в приоритете. Тогда расстояние будет считаться по формуле:
    S = шаги + 10 * повороты
    Очевидно, что при такой схеме любой лишний поворот резко увеличит расстояние. Это и будет критерием для отбраковывания неудачного пути.

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

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Головоломки - это по сути математические задачи. Можно взять олимпиадные или из каких-нибудь учебников, и дальше оформить их в виде фей и гномов (в соответствии с сеттингом игры).

    Так что ресурсов много, включая книги.

    Пример ресурса.
    Ответ написан
    1 комментарий
  • Как выявить сильное отклонение в массиве?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    В идеале вам нужно как-то посчитать себестоимость. По весу, по материалу товара, по его бренду, стране сборки и т.д. Затем прибавить условные 20%. Это будет "красная" цена (не путать со средней).

    Далее вам нужно определиться, какое отклонение допустимо.
    • Например, оно может быть выражено в процентах от красной цены. Скажем, плюс-минус 40% - ок.
    • Другой пример, когда мы смотрим соседние цены, и если очередной скачок цены превышает 10%, то считаем, что продавец оборзел, а значит и все после него тоже борзые - отсекаем.
    • Любой другой числовой критерий. Это может быть комбинация вышеуказанных способов или ещё более сложная формула.


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

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Контрольная сумма (хеш).

    Если искажение и будет, то шанс его не обнаружить - один на миллион (на самом деле ещё меньше, хотя зависит от разрядности).
    Ответ написан
  • Как восстановить окружность по массиву точек?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    А как они распределены? Если равномерно, или хотя бы симметрично, то сначала ищем центр масс (среднее арифметическое всех координат по X и Y отдельно, ибо "массы" равны), а затем считаем среднее удаление точек от этого центра - это будет радиус. Центром и радиусом задаётся окружность.

    Но если не равномерно и не симметрично, то сложно сказать. Например, такой случай:
    spoiler
    5f59dc800df79221516740.png
    Ответ написан
    6 комментариев