Как решать алгоритмические секции: помощь разработчикам, собеседующимся в Яндекс. Часть 2

Автор German Usachev
Как решать алгоритмические секции: помощь разработчикам, собеседующимся в Яндекс. Часть 2

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

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

Это задача была граммах нам даны строки и.

Необходимо определить отличаются ли они лишь только порядком следования букв в каких задачах часто можно предложить больше 1 алгоритм алгоритм и будут отличаться по скорости выполнения по количеству за своими памяти и может быть ещё чем-нибудь данном случае я могу предложить 3 алгоритма и для того чтобы удобно между ними выбирать. В среду и характеристики в таблицу как решать эту задачу например можно отсортировать входной строки. И после этого сравнить в таком случае если мы сортируем именно входные мы не тратим никакой дополнительной памяти, но изменяем входные данные в этой задаче и время исполнения алгоритма будет логарифм потому, что мы занимаемся сортировкой — это будет алгоритм номер другой стороны мы можем скопировать содержимое строчек какие-то новые структуры отсортировать уже их, тогда мы не будем изменять входные данные, но нам потребуется времени на память с другой стороны мы можем поместить содержимое строк в ассоциативный массив затем сравнить содержимое ассоциативных массивов для двух строк, тогда нам потребуется по-прежнему линейную память время исполнения будет линейным по длине строк поскольку нам не требуется сортировка и мы не будем изменять входной массив — это будет алгоритм номер три как правило наибольший интерес представляет именно самый быстрый алгоритм of поэтому сегодня мы будем реализовывать. Именно его дереализация я буду по-прежнему использовать языка Python — это одно из очень популярных решения этой задачи и легко видишь, что она некорректно некорректно, но из-за того, что она нарушает симметричной задачи мы создаем множество из 1 строк. В данном случае строки б, а затем проверяемое для каждого символов входящих в строку, а находится лиановый там множестве понятно, что если строка б в свою очередь содержит какие-то лишние символы мы этого не обнаружено нарушение симметрии. В задачах связанных с ассоциативными массивами 1С очень часто не обращайте на — это внимание попробуем исправить эту ассиметрию. Создайте множество из обеих строк и затем сравним — это решение настолько короткое и красивое, что когда она приходит в голову очень тяжело удержаться от желания сразу его сдать. К сожалению она тоже является неверным поскольку. Рассмотри как множеств не учитывает повторных вхождений букв строки скажем если строка содержит две буквы, а а другая строка содержит только одну букву. А в этом сравнение мы ошибки не найдём — это тоже достаточно распространенная ситуация при работе с ассоциативными массивами когда мы не твоим количество вхождений элементов в наш объект. Это тоже нужно исправлять иногда языки программирования предоставляет нам некий готовые алгоритмы и структуры данных которые позволяют наши задачи удобно. Вот например в языке Python есть такой каунтер он в данном случае позволяет нам превращать строку в словарь в котором для каждого символа указано сколько раз он в этой стране родился. Давайте попробуем использовать этот метод. К сожалению использование таких методов зачастую приводит к ошибкам поскольку мы не до конца понимаем как они работают на самом деле и в данном случае произошло ровно — это разность двух. К сожалению будет пустой даже если строка содержит какие-то лишние символы то есть мы снова имеем дело с нарушением симметрии задачи. Но в данном случае увидеть его несколько сложнее мы используем какую-то встроена структуры данных к счастью — это достаточно легко исправить зачастую проблему асимметрии можно победить некоторыми дополнительными проверками в частности не сложно доказать, что в данной задаче нам достаточно проверить, что длинный срок совпадают. Давайте проверим абсолютно корректен он хорош по памяти и по времени, но конечно же на реальный секции вам потребуется доказать, что этот кот бисквитный корректен и так не встроенных язык средств. Вы должны очень точно понимать как они работают с какой скоростью какие там возможные проблемы из-за. Этого часто бывает выгодное и в продакшн коде и при прохождении реализовать какие-то простые алгоритмы непосредственно в данном случае мне очень хочется написать самому метод который строит словари строчки и затем сравнить два таких словаря. Давайте напишем такой кот. Как видите получился достаточно короткий и максимально понятной кот который не использует никаких сложных средств языка и поэтому его очень легко понять объяснить его корректность — это очень здорово и конечно же. Он удовлетворяет всем вашим требованиям по скорости по дополнительной памяти. Японии сменности входных данных стоит здесь ещё во-первых очень часто кандидаты стараются заменить словарь на какой-нибудь структуру вроде массива. Скажем мы работаем со строками их элементами являются символы. Давайте эти символы превратим в элементы массива и будем сохранять таким же наш ассоциативное отображение внутри массива как правило — это является достаточно действием поскольку — это никак не скажется на синтетике алгоритмы, но при этом сделать его чуть менее универсальным скажем вам уже будет намного сложнее работать со строками внутри которых находятся не. Чара какие-нибудь другие и второе конечно же нам стоило бы начать решение нашей задачи с написание нескольких тестовых примеров которые бы позволили обнаружено в сети ошибка которых мы уже поговорили средних должны были встретиться и тесты где некоторые символы встречаются больше одного раза и строки разных размеров.

0 комментариев
0

Читайте также