Python-интеллектуализация жадного алгоритма от Codechef

Опять же, кажется, что он работает, но временные рамки и жалоба на то, что Python получает плохой «временной лимит на систему», не работает. Это происходит потому, что используется Python, решение содержит много числовых операций, а Python использует Biginteger Bigfloats, что замедляет решение.

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

Давайте посмотрим на описание работы Codechef/Chefstr2. Перейдите по ссылке для анализа и объяснения.

Объяснение немного сумбурное, а сумбур почему-то даже перемешан с входными данными (вторая строка ввода лишняя).

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

Здесь мы создали рисунок оригинальной версии программы.

Вы можете попробовать создать циклы разной длины («ind»). Это позволит вам повторять разное время ‘ks’, чтобы получить нужную длину или чуть большую (‘ind’ или меньше).

Если вы хотите создать цикл из буквы («ind = 1, ks = 8»), вам нужно измерить частоту этой буквы в «пути» (красная). Превратить остальные в него — оптимальное жадное решение. Здесь вы можете выбрать или взять «a» или «b». Сколько всего операций по смене имени? Это ‘ren’ буква новой строки с повторами, минус буквы, которые не переименовываются (‘OK’, три буквы ‘A’ или ‘B’). Здесь пять действий. (Если оставить ‘C’, то их будет 6. (Не соответствует).

Если вы создаете цикл из двух символов («ind = 2, ks = 4»), то у вас уже есть «красный» и «синий» путь — путь для первого и второго символа должен быть одним и тем же символом. Это очень независимо, и нам приходится полагаться на все пути, где символ является наиболее распространенным, а все остальные и вовсе приходится переименовывать.

На красном пути — наиболее частое → «A», на синем пути → «B». Поэтому оставляем «A» на «красном» пути как есть, а остальные имена меняем на «синем» пути → «B». На обоих путях остается одинаковое количество букв «ok1=2», «ok2=2» → Количество действий

ops = len - ok1 - ok2 = 8 - 2 - 2 - 2 = 4

Если перебрать три символа («ind=3, ks=3»), то «красный», «синий» и «зеленый» пути (от первого, второго и третьего символов) уже существуют … … Обратите внимание, что зеленый путь превышает исходную строку. Это означает, что длина зацикленной строки ‘len = ks*ind = 9’ больше длины исходной строки (‘8’), поэтому символ все равно должен быть добавлен.

Красный путь — самый частый → ‘A’, синий путь → ‘B’, зеленый путь → ‘C’ Поэтому для «красного» пути оставьте ‘A’ и переименуйте в него остальные. Перейдите к «синему» пути → «B», «зеленому» пути → «C».

ops = len - ok1 - ok2 - ok3 = 9 - 3 - 3 - 3 - 3 - 3 - 3 - 2 = 1.

Вы можете продолжить с этого места. Описание объясняет, почему ‘ind’ не нужно зацикливаться на начальной длине строки. Вы увидите, что больше нет никаких красивых цветов, которые можно было бы использовать для пути.

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

И вот мы здесь. Давайте напишем генератор тестовых строк.

Импорт. Random Импорт. Строка Печать(''.Участвовать((Random.Выбор(Строка.ascii_letters).Под.() дляIin Область применения(16000)))) Печать(1)

Создайте 16-килобайтный файл ‘big-sample-04.txt’, возьмите эталонный CPP-код из руководства и скомпилируйте его.

gc c-o good good . cp p-lstdc++ -g
$time good.< big-sample-04.txt 7671 2 real 0m47.380s user 0m46.872s sys 0m0.053s

Манипулируем PyPy3 сразу - никаких перетаскиваний numpy или хитрых единиц измерения. Мы также не используем коллекцию Counter, хотя она здесь необходима.

$ time pypy3 Chefstr2. py< big-sample-04.txt 7671 2 real 0m26.806s user 0m26.286s sys 0m0.104s

Ух ты, как интересно. Это решение - своего рода клон эталонного решения CPP, которое работает быстрее на PyPy. Но оно не перетекает в TL!

Советуем прочитать:  Возмещение ущерба и взыскание задолженности

Нет, чудес пока не произошло. Оптимизируем и компилируем код CPP

gc c-o good good . cp p-lstdc++ -O3

И наконец, решение на C показывает скорость.

$time good.< big-sample-04.txt 7671 2 real 0m1.968s user 0m1.947s sys 0m0.006s

Таким образом, мы можем понять, есть ли подходящее решение и есть ли цель, к которой нужно стремиться в плане скорости. Первое, что нас озадачивает, - зачем нам нужен раздел «математика», вещественные числа (ересь! Здесь есть честный комбинаторный аргумент). Просто округлить? Это можно сделать, не оставляя целых чисел.

Внесите эти правки, и вы получите немного улучшенную версию, работающую на 24.5.

Для очистки совести мы убираем 26-символьный хардкод и читаем входную строку через sys.readline. 26. 6 все еще немного хуже, но работа на сервере codechip, похоже, повышает надежность ввода.

Что еще вас беспокоит? Я имею в виду, потому что это очень глубоко и непрямолинейно:

[символ [(input_str [j])]]

          Необходимо много циклов, так что пора хорошенько подумать.

            Я пытаюсь загрузить решение в CC в ALAS и TL.

            Сейчас ночь, я хочу спать. И тут оживает дьявольский совет -> надо подумать - какова практическая миссия нашего кода?

            Пройти приемочный тест! Показать себя с хорошей стороны на реальных входных данных. Много ли плохих данных, которые стоит увеличить, отменив наши превышения? (Действительно, можно считать, что мы исследуем переход к потенциальному алгоритму или переход к «эффективности почти всех входных данных»).

              Конечно, добавление серии тестов к этой задаче означает, что это решение может не пройти... Поэтому оставим его в качестве «провальной» проблемы (если есть «теоретическая проблема») →

                Задача на «танец» → найти входные данные, для которых это решение дает неверные результаты.

                  Вариант: навыки и инструменты программиста Go-Developer

                  Привет, меня зовут Александр Тетеркин, я Go-разработчик в VK. После того как я написал письмо в Python, пошло-поехало - я пишу на этом языке уже три года, а также являюсь ментором на курсе'Переход от нуля к программисту'..

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

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

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

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

                    В этой статье вы познакомитесь с этими моментами, но пока не уходите. Давайте начнем с самых основ.

                    Советуем прочитать:  Исчерпывающий перечень документов, необходимых и обязательных для предоставления государственной услуги и требуемых в соответствии с нормативными правовыми актами для предоставления государственной услуги, которые должны быть представлены заявителем, в том числе в электронной форме, порядок их получения заявителем для предоставления услуги, порядок их представления

                    Основы планирования GO

                    Первый шаг на пути к разработке - это знакомство с ключевыми элементами синтаксиса языка.

                    Начните с чтения официальной документации. Здесь вы найдете весь материал, необходимый для быстрого вхождения в среду разработки GO. Документация очень обширна, но, по крайней мере, прочитайте GO Getting Started. По мере изучения вы сможете продвигаться дальше.

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

                    После теории полученные знания необходимо применить на практике. В этом могут помочь различные платформы для разработчиков. Лучшими их представителями являются LeetCode и Codewars. На них можно спланировать работу по развитию навыков алгоритмического мышления и составить план практических действий.

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

                    Ключевые элементы компьютерной науки

                    Codechef 2022-05-05 от Жадные алгоритмы Python-Интеллектуализация 12-39-25 Image0. png

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

                    Оптимизация и тестирование

                    Чтобы ваша программа работала правильно и быстро, вам нужно оптимизировать работу кода и проводить тесты производительности. Изучите методы оптимизации кода на GO и научитесь управлять программами на этом языке.

                    Искусственный интеллект для оптимизации кода

                    Сервисы, основанные на искусственном интеллекте, полезны для планирования. Современные нейронные сети могут создавать, дополнять и оптимизировать код на различных языках программирования. Например, модель нейронной сети Gigachat компании Sber работает на Python, Java, C ++, JavaScript и многих других языках.

                    Как ИИ пишет код

                    Главное отличие нейронной сети от обычной программы - способность к обучению. Нейронные сети учатся на больших объемах данных, запоминая синтаксис, логику и структуру различных языков. Обучаясь на примерах, искусственный интеллект выявляет закономерности, которые затем использует в кодировании.

                    Существует несколько алгоритмов механического обучения, один из самых распространенных - метод обратного распространения. Обучение основано на следующем алгоритме.

                      Цель процесса - минимизировать выходную ошибку, то есть расхождение между реакцией нейрона и его эталоном.

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

                      Примеры готовых подсказок

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

                      Другие типы нейронных сетей функционируют как чат-боты. Например, интеллектуальный бот Giga Chat доступен в браузерах «ВКонтакте» и Telegram и понимает два языка - английский и русский. Посмотрите, как работает эта модель нейронной сети, предлагая критерии для различных задач.

                      Поиск решений

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

                        В окне диалога Gigachat нужно ввести финальную подсказку, и нейронная сеть извлечет результат в ответное сообщение. Например, попросите бота показать реализацию стандарта Singleton в Java.

                        Написание хорошего кода: шесть советов для начинающих

                        Качество кода - важный критерий при оценке разработчиков.

                        Советуем прочитать:  Совместное завещание супругов как способ защиты прав на совместное имущество

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

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

                        Пишу в основном на Java, но иногда готовлю небольшие проекты на Kotlin, Scala и Typescript. Большую часть времени моя работа связана с бэкендом, поэтому советы в этой статье пригодятся в первую очередь специалисту по поддержке.

                        Финансовые проверки, расчеты по ипотеке или помощь в подготовке к рождению ребенка.

                        Баннер &lt; pan&gt; Понять и найти ошибки в больших структурах бывает непросто. Особенно если проект делала команда разработчиков: если у автора кода все еще есть доступ к написанному, то коллегам приходится углубляться в детали с нуля. Это замедляет работу всей команды.

                        Как отличить хороший код от плохого

                        На оценку кодов влияет множество критериев, которые можно разделить на две большие категории.

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

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

                            Разбейте свой код на более мелкие части

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

                            Понять и найти ошибки в больших структурах бывает непросто. Особенно если проект выполнялся командой разработчиков: если автор кода все еще имеет доступ к написанному, то коллегам приходится углубляться в детали с нуля. Это замедляет работу всей команды.

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

                            Понравилась статья? Поделиться с друзьями:
                            Добавить комментарий

                            ;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!:

                            Adblock
                            detector