<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/">
  <channel>
    <language>ru</language>
    <title>Сортировка и поиск</title>
    <description/>
    <link>https://tproger.ru/tag/sorting-and-searching</link>
    <atom:link href="https://tproger.ru/tag/sorting-and-searching/feed" rel="self" type="application/rss+xml"/>
    <lastBuildDate>Sat, 03 Oct 2026 23:32:35 GMT</lastBuildDate>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>12</sy:updateFrequency>
    <image>
      <title>Сортировка и поиск</title>
      <link>https://tproger.ru</link>
      <url>https://tproger.ru/apple-touch-icon.png</url>
    </image>
    <item>
      <title>В HTML появился новый элемент Search</title>
      <link>https://tproger.ru/articles/v-html-poyavilsya-novyj-element-lt-search-gt</link>
      <comments>https://tproger.ru/articles/v-html-poyavilsya-novyj-element-lt-search-gt?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Дух айтишной эмо школы]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/v-html-poyavilsya-novyj-element-lt-search-gt</guid>
      <description><![CDATA[<p>В HTML появился элемент search, который ищет данные по документу и всему Интернету. Обсудили его важность и привели примеры использования.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/v-html-poyavilsya-novyj-element-lt-search-gt">В HTML появился новый элемент Search</a>»</p>]]></description>
      <category><![CDATA[Сортировка и поиск]]></category>
      <category><![CDATA[Веб-разработка]]></category>
      <category><![CDATA[HTML]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 03 May 2023 07:16:08 GMT</pubDate>
      <content:encoded><![CDATA[<p>В стандарте HTML появился новый семантический элемент search. Он представляет собой раздел, который используется для поиска или фильтрации данных.</p><p>Search содержит элементы управления формой (такие как поле ввода текста, выпадающее окно, кнопки и т.д.), а область поиска или фильтрации может быть любой: от одного документа до всего Интернета.</p><h2>Как search работает в HTML</h2><p>Перед тем, как появился элемент &lt;search&gt;, обычно добавляли role="search" к тегу &lt;form&gt;, чтобы испрользовать форму для поиска:</p><p>Теперь достаточно использовать тег  для обёртки формы:</p><p>Увы, так как &lt;search&gt; — это новый стандарт, понадобится время, прежде чем все браузеры и инструменты догонят его. До тех пор можно использовать хак, указывающий роль ARIA.</p><p>В будущем этот хак уже не понадобится, но сейчас он поможет подготовить код до тех пор, пока браузеры не начнут поддержку нового тега:</p><p>Это может показаться нелогичным: мы удаляем role="search", но все обертываем &lt;search&gt;. Кроме того, так выходит больше кода (аж на три символа больше), ещё и увеличивается вложенность (на один уровень больше).</p><p>Это не какая-то огромная проблема, но некоторые разработчики наверняка будут жаловаться.</p><h2>Варианты использования search в HTML</h2><p>Есть важный момент: &lt;search&gt; не обязательно должен быть текстовым вводом с кнопкой. Его можно использовать для фильтрации результатов или строк в таблицах.</p><p>Польза &lt;search&gt; выходит за рамки обычных текстовых вводов и поисковых полей:</p><p>В этом примере форму поиска включили в заголовок веб-страницы:</p><p>В следующем примере на странице расположены две функции поиска.</p><p>Первая находится в заголовке веб-страницы и служит глобальным поиском по сайту. На его назначение указывает title.</p><p>Вторая функция включена в &lt;main&gt; и позволяет искать и фильтровать данные из содержимого этой же страницы. На его назначение указывает заголовок &lt;h2&gt;.</p><h2>Заключение</h2><p>С элементом &lt;search&gt; все востребованные сообществом роли ARIA landmark будут закрыты. Элемент увеличивает доступность разметки (хотя и пройдет много времени, пока все браузеры подхватят идею) и расширяет семантику языка.</p><p>Однако с точки зрения программиста кажется, что элемент мало что добавляет к существующей реализации. Например, введение тэгов типа &lt;tabpanel&gt; и &lt;tab&gt; было бы гораздо ценнее.</p><p>Но это не отменяет важности &lt;search&gt;. Все улучшения, даже незначительные, только приветствуются. И &lt;search&gt; — отличное дополнение к семейству HTML.</p>]]></content:encoded>
    </item>
    <item>
      <title>Google боится ChatGPT: компания спешит внедрить своего ИИ-помощника в поиск</title>
      <link>https://tproger.ru/news/google-boitsja-chatgpt-kompanija-speshit-vnedrit-svoego-ii-pomoshhnika-v-poisk</link>
      <comments>https://tproger.ru/news/google-boitsja-chatgpt-kompanija-speshit-vnedrit-svoego-ii-pomoshhnika-v-poisk?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Павел Федоренко]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/google-boitsja-chatgpt-kompanija-speshit-vnedrit-svoego-ii-pomoshhnika-v-poisk</guid>
      <description><![CDATA[<p>Глава Google Сундар Пичаи анонсировал появление в поиске ИИ-бота LaMDA. Он содержит 540 млрд параметров, что втрое больше, чем у ChatGPT.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/google-boitsja-chatgpt-kompanija-speshit-vnedrit-svoego-ii-pomoshhnika-v-poisk">Google боится ChatGPT: компания спешит внедрить своего ИИ-помощника в поиск</a>»</p>]]></description>
      <category><![CDATA[Сортировка и поиск]]></category>
      <category><![CDATA[Google]]></category>
      <category><![CDATA[Нейронные сети]]></category>
      <category><![CDATA[Искусственный интеллект]]></category>
      <category><![CDATA[Яндекс]]></category>
      <category><![CDATA[OpenAI]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sun, 05 Feb 2023 07:44:52 GMT</pubDate>
      <content:encoded><![CDATA[<p>Глава корпорации Сундар Пичаи анонсировал появление в поиске Google ИИ-компаньона. Им станет чат-бот на основе собственной нейросети LaMDA (Language Model for Dialogue Applications). Разработчики заявляют, что LaMDA подобна ChatGPT, только содержит <b>540 млрд параметров</b>, что в три раза больше, чем у чат-бота от OpenAI.</p><p>Презентация пройдёт 8 февраля.</p><h2>Что за ChatGPT?</h2><p>Напомним, ChatGPT — это нейросеть, разработанная компанией OpenAI. которая может очень натурально поддерживать разговоры, вести себя как настоящий Linux-терминал, проверять код на ошибки, составлять документацию, дописывать код и даже генерировать рабочие скрипты по запросу с нуля.</p><p>Но лучше всего у нейросети получается искать вопросы на ответы. Оказалось, что ИИ хоть иногда и ошибается, но даёт ответы точнее и подробнее, чем традиционные поисковики.</p><p>В этом Google и увидела угрозу для своего бизнеса. И даже создатель Gmail открыто <a href="https://tproger.ru/articles/novosti-chatgpt-student-rggu-napisal-diplom-nejrosetju-a-microsoft-voskreshaet-yahoo/">заявил</a>, что ChatGPT уничтожит Google всего за 2 года.</p><h2>Почему анонс ИИ-помощника на основе LaMDA — всё ещё слабый ответ Google на ChatGPT</h2><p>Безусловно, Google — сильная IT-корпорация и наверняка, LaMDA — ещё одна мощная технология. Но помимо них, уже несколько крупных компаний успели рассказать, что внедряют ИИ-помощников в свои поисковики.</p><p>Например, Microsoft <a href="https://tproger.ru/articles/novosti-openai-kompanija-poluchila-10-mlrd-ot-microsoft-i-napugala-google/">инвестировала</a> $10 млрд в OpenAI. И уже интегрирует в Bing новую версию GPT-4. До этого компания показала некоторым пользователям вариант внедрения ChatGPT в поисковик Bing.</p><p>И даже Яндекс анонсировал появление в поиске своей нейросети YaLM.</p><p>А Google только наметил дату презентации. Всё выглядит так, будто Google вступила в эту схватку с небольшим, но очень заметным опозданием.</p><p>К тому же, сейчас ChatGPT сильно выигрывает в медиапространстве — вирусные новости всплывают чуть ли не каждый день. Например, недавно блогер <a href="https://tproger.ru/articles/bloger-nauchil-chatgpt-reshat-domashku-i-perepisyvat-ejo-ruchkoj-prjamo-na-bumagu/">научил</a> ChatGPT решать домашку и переписывать её ручкой прямо на бумагу. И даже мы в Tproger написали с помощью ChatGPT неплохую обзорную <a href="https://tproger.ru/articles/sravnenie-react-i-vue-chto-obshhego-i-v-chjom-raznica/">статью про React и Vue</a>.</p><p>А вот всё, что пока всплывает в памяти про LaMDA — это <a href="https://t.me/your_tech/8132">скандал</a>, когда один из инженеров Google «уличил» нейросеть в наличии собственного сознания, чем сильно напугал общественность.</p><p>Пока непонятно, смогут ли компании полноценно ответить на вызовы ChatGPT. Но если даже Google и Microsoft включились в гонку, можно точно сказать, что скоро нейросети изменят привычный подход к поиску информации в интернете.</p>]]></content:encoded>
    </item>
    <item>
      <title>Как я написал свою поисковую систему для быстрого поиска личной информации</title>
      <link>https://tproger.ru/articles/kak-ja-napisal-svoju-poiskovuju-sistemu-dlja-bystrogo-poiska-lichnoj-informacii</link>
      <comments>https://tproger.ru/articles/kak-ja-napisal-svoju-poiskovuju-sistemu-dlja-bystrogo-poiska-lichnoj-informacii?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Eugenio Uglov]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/kak-ja-napisal-svoju-poiskovuju-sistemu-dlja-bystrogo-poiska-lichnoj-informacii</guid>
      <description><![CDATA[<p>Как создать собственную поисковую систему для быстрого поиска личной информации с применением метода графов или тэгов.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/kak-ja-napisal-svoju-poiskovuju-sistemu-dlja-bystrogo-poiska-lichnoj-informacii">Как я написал свою поисковую систему для быстрого поиска личной информации</a>»</p>]]></description>
      <category><![CDATA[Сортировка и поиск]]></category>
      <category><![CDATA[Веб-разработка]]></category>
      <category><![CDATA[Методологии разработки]]></category>
      <category><![CDATA[Пост пользователя]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 29 Dec 2022 11:30:07 GMT</pubDate>
      <content:encoded><![CDATA[<p>Все началось с того, что мне стало трудно находить нужную информацию, файлы. Чем больше файлов и папок у меня образовывалось, тем больше времени уходило на поиски нужного. Я понял, что каждый раз искать в бесконечных списках файлов и папок, особенно с условием вложенности это не вариант для больших объемов данных.</p><p>Что касается поиска по названию файла, то количество символов, указанных в названии ограниченно и слова при поиске должны быть в строго определенной последовательности. Тем более, если система индексирует другие, не нужные для поиска файла (системные файлы, файлы проектов), то поиск выдает много «мусора».</p><p>Поиск по содержанию файла даёт не самый релевантный результат. Может выдать бесполезные результаты с содержанием содержащие ключевые слова, но не относящиеся к тому, что действительно необходимо найти.</p><p>Более того, по содержанию можно искать только текстовые файлы.</p><p>Ссылка на проект — <a href="https://eugeniouglov.000webhostapp.com/yessir/#main">тут</a>.</p><h2>Структура содержания информации</h2><p>Структура папок представляется собой в виде дерева. Мне это не нравится, потому что каждая папка может содержать только определенные файлы, если не учитывать копирование и ссылки.</p><p>Так же это можно представить с примером из реальной жизни, для того, чтобы найти зелёное свежее яблоко сорт «Девственный». Необходимо найти отдел с фруктами, затем отдел с яблоками, затем ищем зеленные, затем сорт, ну там ещё их на свежие, не свежие фасуют в этом воображаемом примере и наконец найти нужное apple.</p><p>Усложняется ещё все и тем, что я не помню есть ли там вообще яблоки, и если есть, то хранятся ли они в отделе фрукты.</p><p>А почему бы об этом просто не попросить прихвостня (они уже у всех есть, правда?): «Принеси мне зелёное свежее яблоко».</p><p>Как сразу становится удобно!</p><p>В общем, всем этим я хочу сказать, что поиск нужной информации в папках хорош, если папок немного и если помнить какие папки существуют, а не перебирать все подряд.</p><p>А вот если мы не знаем существуют ли яблоки вообще, то спрашиваем прихвостня:</p><p>— Яблоки есть?</p><p>— Есть, господин! Сотни, игрушечные, красные, гнилые….</p><p>— Мне нужно свежее яблоко.</p><p>— Понял! Есть красное свежее яблоко «Сирота», красное свежее яблоко «Курага», …</p><p>— А что насчёт зелёного свежего яблока.</p><p>— Есть! Зелёное свежее яблоко «Пух-тибидух» и Зелёное свежее яблоко «Девственный».</p><p>— В таком случае, принеси мне, пожалуй, Зелёное свежее яблоко «Девственный».</p><p>— Да, сэр.</p><p>Вот последняя фраза как раз таки и стала названием приложения. Как ответ на команду пользователя — «Yes Sir».</p><p>Возвращаясь к яблокам. Заметили, что в первом случае нужно искать яблоки не пойми где, а во втором мы задаём уточняющие условия к запросу?</p><figure><img src="https://media.tproger.ru/uploads/2022/12/6d82f5dd-e858-47bb-be82-3d5dc1a64353.png" alt="" /></figure><p>Приведу пример более реалистичный. Есть папка с музыкой и подпапки для разделения на жанры. Но что если в какой-то момент мне захочется послушать французскую музыку не зависимо от жанра. Вот тут то и вся проблемность древовидной структуры папок вылазит. Можно конечно, как советовали на форумах, создавать отдельные папки под язык произведения и кидать ссылки, но опять папки…</p><p>А вот, что произойдет, если каждому файлу установить теги с жанром, языком, ну и конечно что это музыка, песня.</p><p>В этом случае возможно группировать, сортировать музыку гораздо гибче. Например, скомбинировав 3 тега: французская, русская, рок можно получить то, чего стандартными средствами Windows не возможно, ну или я чего-то не знаю.</p><h2>Попытки найти готовое решение</h2><p>Первой идеей было воспользоваться «тегированием» файлов, папок. Таким образом можно искать информацию комбинируя теги, не зависимо от порядка слов. И лучшими приложениями для этого, могу выделить XYplorer и Tagging for windows. Первая из себя представляет отдельный файловый менеджер с опцией тегирования. Второе приложение — дополнение к стандартному файловому менеджеру. Однако они позволяют искать файлы только на ПК и конечно нельзя написать как в Гугл поисковике запрос близкий к пользователю, а алгоритм уже бы сам выбрал из запроса теги и отсортировал информацию по приоритету. В последствии удалил обе, они подвисали и крашились частенько (возможно дело в моих надстройках Windows, не хочу делать анти пиар этих отличных программ).</p><h3>Визуальный поиск</h3><p>В попытках найти оптимальный способ поиска доходило до странного. Я больше визуал и поэтому загружал изображения более менее подходящее по теме информации в социальную сеть ВКонтакте, а саму информацию сохранял в комментариях под изображениями. Это дало некоторый прирост в скорости поиска и пользоваться можно с любого устройства. Но как вы, наверное, понимаете долго это продолжаться не могло. В конечном итоге я стал задумываться а к какой информации относится это изображение, на котором рельсы — означает адреса знакомых или желаемые места для путешествия… Ну а уж то, что под одним изображением образуется портянка из информации без возможности вложенности — это фиаско, бро.</p><h3>Желаемый функционал</h3><p>Я подумал, что было бы отлично разработать приложение, которое бы подходило по таким критериям:</p><ol><li>Можно использовать с любого устройства без возможности подключения к интернету.</li><li>Поиск личной информации настолько быстро, насколько это возможно.</li><li>Поиск должен быть простым как Google Search.</li><li>Возможность сохранить всю текстовую информацию в текстовый файл.</li></ol><h3>Выбор технологий</h3><p>1. По первому пункту из желаний было решено разработать веб приложение, так как с любого устройства, на котором есть браузер, можно получить к нему доступ. Данные хранятся в localstorage браузера, но при открытии сайта сразу выгружаются в переменную для обеспечения лучшей скорости.</p><p>Для синхронизации данных с другим устройством, браузером я взял базу данных mysql от 000webhost бесплатно, но потом перестал использовать из-за ограничений на объем. Сейчас единственный способ для обновления пользовательских данных — импорт и экспорт файла. Однако я делаю это очень редко, т.к. в основном пользуюсь только со смартфона. Что касается офлайн режима — я использовал serviceworking. Необходимо только один раз зайти на сайт, чтобы все ресурсы сайта загрузились и дальше использовать полностью офлайн из браузера.</p><p>2. Быстрый поиск.</p><p>Раз поиск должен осуществляться подобно Гугл поисковику, то нужно чтобы каждое слово из запроса проверять на существующий из уже созданного блока информации. Таким блоком у меня выступает объект с ключами: уникальное название блока, действие(показать информацию, открыть ссылку…), содержимое, теги.</p><p>Итак, по ключу «теги» у нас будет храниться массив из символов(слов) для конкретного блока информации.</p><p>Сразу возьмём пример блока.</p><p>Название: как создать сайт.</p><p>Действие: показать информацию.</p><p>Содержимое: берём html, добавляем js и украшаем css.</p><p>Теги: создание сайта, веб программирование, верстка.</p><p>Массив из тегов формируется из текстов полученных с полей ввода для тегов и названия. Каждое слово это тег, разделять можно запятой и пробелом. Была идея конечно сделать как на Ютубе, теги как словосочетания, но я решил остановиться на более широкой выдаче по ключевым словам. Из примера блока выше массив тегов будет таким: [«как», «создать», «сайт», «создание», «сайта», «веб», «программирование», «верстка»].</p><p>Теперь самое важное — определиться как будет происходить поиск. Первое, что пришло в голову это брать каждое слово из поискового запроса и сравнивать с каждым словом из тега каждого блока. В голову как пришло, так и ушло, это отвратительная идея. Следующей идеей было создание объекта, в котором каждый тег это отдельный ключ, а значение это массив из индексов блоков.</p><p>3. Итак, при вводе запроса проверяется есть ли слово в хранилище тегов, если да, то блок добавляется в массив на отображение.Теперь нужно отсортировать по приоритету. Чем выше результат в выдаче, тем более он подходит запросу. Это я реализовал с помощью количества ключевых слов в запросе, чем больше слов из запроса содержится в массиве тегов блока, тем более блок приоритетнее.</p><p>4. И насчёт сохранение в файл совсем кратко. Можно сохранять и импортировать файл в виде json.Так же мой опыт с использованием ВКонтакте как поисковик по изображениям дал мне идею для возможности добавлять изображение к каждому блоку при желании.</p><h2>Итоги</h2><p>В результате я сделал то, чем пользуюсь уже больше года. Как веб, так и ПК версия оказались очень полезными. Использую для работы и личной жизни. Скорость поиска, которую я в итоге получил меня многократно выручала, когда нужно было найти что-то очень быстро.</p><figure><img src="https://media.tproger.ru/uploads/2022/12/010d352d-7202-48cf-9033-f5cfda9fa510.png" alt="" /></figure><h2>Ответвление в другие проекты</h2><p>Веб приложение мне настолько понравилось, что я захотел написать программу для исполнения программ по команде от запроса пользователя на ПК. Вдохновлённый голосовыми помощниками, я создал программу, которая ищет и исполняет файлы. А поиск соответственно так же подобен веб поисковику. Особенность в том, что можно перетащить файл/файлы напрямую в программу и алгоритм автоматически установит теги исходя из названия файла и папок, в которых он содержится. Но это тема другого поста, если этот окажется интересным.</p><h2>Послесловие</h2><p>Буду рад любым комментариям. Узнать ваше мнение по поводу идеи. Полная ли это ерунда. Или, в чем я почти не сомневаюсь, есть уже приложения с подобной реализацией. Спасибо!</p>]]></content:encoded>
    </item>
    <item>
      <title>Алгоритмы сортировки: зачем они нужны?</title>
      <link>https://tproger.ru/articles/zachem-nuzhny-algoritmy-sortirovki</link>
      <comments>https://tproger.ru/articles/zachem-nuzhny-algoritmy-sortirovki?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Марина Александровна]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/zachem-nuzhny-algoritmy-sortirovki</guid>
      <description><![CDATA[<p>Где на практике применяются алгоритмы сортировки, и применяются ли? Или же их важно знать только для собеседований? Давайте разбираться.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/zachem-nuzhny-algoritmy-sortirovki">Алгоритмы сортировки: зачем они нужны?</a>»</p>]]></description>
      <category><![CDATA[Алгоритмы и структуры данных]]></category>
      <category><![CDATA[Сортировка и поиск]]></category>
      <category><![CDATA[Для начинающих]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 12 Aug 2022 10:34:52 GMT</pubDate>
      <content:encoded><![CDATA[<p>А зачем вообще нужны алгоритмы сортировки, если исключить собеседования? Как часто мы применяем их на практике, а если и применяем, то правильно ли? Давайте разбираться.</p><ol><li><a href="https://tproger.ru/#part1">Ложка теории</a></li><li><a href="https://tproger.ru/#part2">Бочка практики</a></li><li><a href="https://tproger.ru/#part3">Почему их так любят на собеседованиях?</a></li><li><a href="https://tproger.ru/#part4">Где на практике применяются алгоритмы сортировки?</a></li><li><a href="https://tproger.ru/#part5">Выводы</a></li></ol><h2>Ложка теории</h2><p>Сортировка данных — одна из алгоритмических категорий, к которым программисту следует привыкнуть. В первую очередь, конечно же, вы столкнётесь с сортировкой на этапе обучения. Задачи, где что-то нужно упорядочить по определённому признаку, — распространённая история, которая повторяется и на собеседованиях.</p><p>Сегодня существуют десятки алгоритмов сортировки. Прям на 100% одного идеального варианта нет: разные алгоритмы оптимальны для разных наборов и типов данных. Вы наверняка слышали или даже работали с самыми популярными из них:</p><ol><li>Пузырьковая сортировка</li><li>Сортировка перемешиванием</li><li>Сортировка расчёской</li><li>Сортировка вставками</li><li>Сортировка выбором</li><li>Быстрая сортировка</li><li>Пирамидальная сортировка</li></ol><p>Одни алгоритмы просты в реализации и хорошо подходят для разъяснения принципов сортировки, другие  — для работы с большими массивами данных, третьи оптимизированы по числу процессорных циклов, скорости, etc.</p><p>Вот так, например, выглядят 15 Алгоритмов сортировки за 6 минут.</p><p>Примечание Рекомендую убавить громкость.</p><h2>Бочка практики</h2><p>Чтобы понять, зачем нужны алгоритмы сортировки, следует проанализировать хотя бы несколько из них. Рассмотрим наиболее популярные алгоритмы в коде и с кратким объяснением.</p><h3>Сортировка пузырьком</h3><p>Сортировка пузырьком — один из самых известных алгоритмов сортировки. Его суть в последовательном сравнении значений двух соседних элементов слева направо: если предыдущее больше последующего, они меняются местами. При сортировке элементов по убыванию, наоборот: в конец списка уходят элементы с наименьшим значением.</p><figure><img src="https://media.tproger.ru/uploads/2022/08/Sortirovka-puzyrkom.gif" alt="" /><figcaption>Источник, лицензия</figcaption></figure><p><b>Код</b></p><p>Здесь во внутреннем цикле перебираем значения, начиная с последнего (array.length - 1), и в каждом следующем проходе уменьшаем количество просмотренных элементов (j &gt; i).</p><p><b>Сложность алгоритма:</b> О(n2)</p><ul><li>Алгоритм хорошо себя показывает с большими наборами данных, где элементы почти отсортированы и требуется всего одна итерация, чтобы определить, отсортирован ли список до конца.</li><li>В случае с совершенно неотсортированным списком, для пузырьковой сортировки он должен быть хотя бы небольшим.</li></ul><p>Улучшенными версиями пузырькового метода являются <a href="https://ru.wikipedia.org/wiki/%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D1%88%D0%B8%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC">сортировки перемешиванием (шейкерная)</a> и <a href="https://ru.wikipedia.org/wiki/%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D1%80%D0%B0%D1%81%D1%87%D1%91%D1%81%D0%BA%D0%BE%D0%B9">расчёской</a>.</p><h3>Сортировка вставками</h3><p>Это простая сортировка, при которой массив постепенно перебирается слева направо. При этом элемент сравнивается со всеми предыдущими элементами и размещается так, чтобы оказаться в подходящем месте среди ранее упорядоченных элементов. Так происходит до тех пор, пока набор входных данных не будет исчерпан.</p><p>Звучит сложно, но на деле это самый простой алгоритм сортировки.</p><figure><img src="https://media.tproger.ru/uploads/2022/08/Sortirovka-vstavkami.gif" alt="" /><figcaption>Источник, лицензия</figcaption></figure><p><b>Код</b></p><p><b>Сложность алгоритма:</b> О(n2) для сравнений и перестановок.</p><ul><li>Как и в случае с пузырьковой сортировкой, этот алгоритм работает быстрее всего на очень маленьком или почти отсортированном наборе данных.</li></ul><p>Этот алгоритм также используется как часть <a href="https://ru.wikipedia.org/wiki/%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%A8%D0%B5%D0%BB%D0%BB%D0%B0">алгоритма сортировки Шелла</a>.</p><h3>Быстрая сортировка</h3><p>Быстрая сортировка относится к эффективным алгоритмам и состоит из нескольких шагов:</p><ol><li>Из массива выбирается опорный элемент, чаще всего посередине массива.</li><li>Другие элементы массива распределяются таким образом, чтобы меньшие размещались до него, а большие — после.</li><li>Далее первые шаги рекурсивно применяются к подмассивам, которые разделились опорным элементом на две части — слева и справа от него.</li></ol><figure><img src="https://media.tproger.ru/uploads/2022/08/Bystraja-sortirovka.gif" alt="" /><figcaption>Источник, лицензия</figcaption></figure><p><b>Код</b></p><p><b>Сложность алгоритма: </b>O(n log n)</p><ul><li>Быстрая сортировка считается самой быстрой, но она не всегда O(n log n), так как в худших случаях она становится О(n2).</li><li>Быстрая сортировка более эффективна для наборов данных, которые помещаются в доступную память. Для больших наборов она неэффективна, и в этом случае более предпочтительна, например, <a href="https://ru.wikipedia.org/wiki/%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D1%81%D0%BB%D0%B8%D1%8F%D0%BD%D0%B8%D0%B5%D0%BC">сортировка слиянием</a>.</li><li>Быстрая сортировка — это сортировка на месте (т. е. она не требует дополнительной памяти), поэтому её целесообразно использовать для массивов.</li></ul><p>Ещё больше <a href="https://tproger.ru/digest/sorting-algorithms-visualized/">алгоритмов сортировки с визуализацией</a> и подробным объяснением.</p><h2>Почему их так любят на собеседованиях?</h2><p>Так работодатель преследует сразу несколько целей:</p><ol><li>Если вам дана возможность выбрать любой алгоритм сортировки на своё усмотрение, вас проверяют на понимание работы алгоритмов и грамотный подход к решению.</li><li>Если вас просят реализовать конкретный алгоритм, делается упор на стиль написания кода.</li><li>Иногда для задачи даётся намеренно неправильный алгоритм, например такой, с которым сортировка займёт больше времени или памяти. Тогда вам нужно озвучить и аргументировать более выгодный вариант. Это продемонстрирует ваше умение анализировать задачу и отстаивать своё мнение.</li></ol><p>Очень важно понимать механизм работы того или иного алгоритма. Допустим, быстрая сортировка предпочтительнее для массивов, а сортировка слиянием — для связных списков. Дело в том, что в связном списке для доступа к данным по индексу нужно пройти от головы до этого индекса. Сортировка слиянием обращается к данным последовательно, и потребность в произвольном доступе невелика.</p><p>Если вы готовитесь к собеседованию, обязательно погоняйте себя на знание и, что немаловажно, <a href="https://tproger.ru/translations/sorting-for-beginners/">понимание алгоритмов сортировки</a>.</p><h2>Где на практике применяются алгоритмы сортировки?</h2><p>Кто бы что ни говорил, а на практике это тоже бывает полезно. Да, зачастую мы заочно сортируем данные, например через SQL-запрос с оператором ORDER BY. Или если у вас небольшой понятный массив, можно воспользоваться встроенной функцией языка типа sort() в JavaScript. Но не всегда условия просты в выполнении.</p><p>Сложности с сортировкой начинаются, когда:</p><ul><li>это работа с массивами данных на десятки или сотни тысяч элементов;</li><li>затруднён доступ к этим данным;</li><li>нужно оптимизировать время выполнения или требуемый объём памяти.</li></ul><p>К примеру, в Salesforce-разработке мне приходилось не раз сталкиваться с условиями, в которых без сортировки не обойтись. Это актуально, когда нужен не просто запрос к базе данных, а соответствие искомого элемента нескольким условиям + запуск дополнительных процессов между проверками соответствия этим условиям. При этом проекты были большими, и каждый процесс тщательно оптимизировался, дабы сэкономить время и память.</p><p>Для веба это нормальная история. Игры, такие как знаменитая головоломка французского математика Эдуарда Люка «Ханойская башня», тоже потребуют от вас понимания сортировки. Ряд математических решений и работа со строками порой не обходятся без упорядочивания данных. Есть уйма примеров, но суть одна: алгоритмы сортировки — это далеко не всегда только про собеседования.</p><h2>Выводы</h2><p>Так зачем же нужны алгоритмы сортировки на практике?</p><ol><li>Чтобы иметь чёткое представление, как работает алгоритм и как он ляжет на синтаксис конкретного языка программирования.</li><li>Чтобы тренировать алгоритмическое мышление.</li><li>Чтобы уметь реализовывать алгоритмы там, где нет подходящей готовой библиотеки.</li></ol>]]></content:encoded>
    </item>
    <item>
      <title>Великий шёлковый путь: локализация AliExpress Россия. Часть 2: инфраструктура, поиск и рекомендации</title>
      <link>https://tproger.ru/articles/velikij-shjolkovyj-put-lokalizacija-aliexpress-rossija-chast-2-infrastruktura-poisk-i-rekomendacii</link>
      <comments>https://tproger.ru/articles/velikij-shjolkovyj-put-lokalizacija-aliexpress-rossija-chast-2-infrastruktura-poisk-i-rekomendacii?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Мария Кривоченко]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/velikij-shjolkovyj-put-lokalizacija-aliexpress-rossija-chast-2-infrastruktura-poisk-i-rekomendacii</guid>
      <description><![CDATA[<p>Продолжаем рассказывать о локализации глобальной платформы AliExpress России. В этой части поговорим о системах, которые мы написали с нуля.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/velikij-shjolkovyj-put-lokalizacija-aliexpress-rossija-chast-2-infrastruktura-poisk-i-rekomendacii">Великий шёлковый путь: локализация AliExpress Россия. Часть 2: инфраструктура, поиск и рекомендации</a>»</p>]]></description>
      <category><![CDATA[Сортировка и поиск]]></category>
      <category><![CDATA[Сервисы]]></category>
      <category><![CDATA[Облачные технологии]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 30 May 2022 09:53:10 GMT</pubDate>
      <content:encoded><![CDATA[<p>Продолжаем рассказывать о том, как мы <a href="https://tproger.ru/articles/velikij-shjolkovyj-put-ili-lokalizacija-aliexpress-rossija-chast-1-frontend-backend-i-mobilnye-prilozhenija/">локализуем глобальную платформу AliExpress</a>, чтобы сделать счастливыми покупателей и продавцов из России и стран СНГ. В этой части поговорим о системах, которые мы написали с нуля.</p><h2>Платформа поиска и рекомендаций</h2><p>Поиск считается одним из самых технически продвинутых подразделений Taobao, да и сама платформа очень крутая: в ней есть сквозная 100% персонализация поиска, которая дает 10% от общих продаж. Кроме того, там есть state-of-art рекомендации, которые продают почти так же хорошо, как поиск.</p><p>Хоть платформа и отличная, но её применение в России «имеет огромный потенциал для улучшения».</p><p>Во-первых, основа поиска — это английский язык. То есть запросы сначала переводятся на английский, и уже потом ищутся в базе данных. Это существенно влияет на выдачу, и это хотелось бы пофиксить.</p><p>Во-вторых, многие очевидные для нашего языка вещи в Китае — advanced-лингвистика. Есть совершенно юмористический пример про длину запроса. Берём какой-нибудь российский маркетплейс, копируем описание любого телевизора и вбиваем в поиск. Не ищется. Почему? Потому что в китайском языке 30 иероглифов — это абзац текста.</p><h3>Что мы сделали</h3><p>Изначально у нас не оставалось выбора, кроме sabj. Elastic, который является, наверное, самым крутым open source поисковым движком, нам не подходил. 170 миллионов карточек и более двух миллиардов товаров — это больше данных, чем Elastic сможет переварить.</p><p>Нам очень помогли ребята из команды поиска VK, которые дали свой движок (кстати, очень классный). Но, к сожалению, он нам тоже не совсем подошёл в силу особенностей e-commerce, и пришлось переписать основной формат индекса.</p><p>Сначала мы запустили версию поиска, которая называется Balalayka — в ней китайский recall и русское ранжирование. Это было достаточно быстрое решение, которое позволило заметно улучшить качество поисковой выдачи. А затем мы начали тестировать релиз, который называется Samovar — уже с российским recall’ом. Уже на этапе тестирования он показал результаты на 5% лучше, чем Balalayka.</p><h3>Как сейчас выглядит поиск:</h3><figure><img src="https://media.tproger.ru/uploads/2022/05/1_waifu2x_photo_noise3_scale_tta_1-autoconverted-scaled.jpeg" alt="" /></figure><figure><img src="https://media.tproger.ru/uploads/2022/05/2_waifu2x_photo_noise3_scale_tta_1-autoconverted-1-scaled.jpeg" alt="" /></figure><p>Как видим, китайский поисковик по запросу «Apple» выдает яблочный сок. А российский — уже ожидаемые пользователем товары.</p><h2>Платформа: инфраструктура</h2><h3>Технологии AliCloud</h3><p>Технологии Alibaba в области инфраструктуры просто космические.</p><p>Например, есть штука, которая называется MaxCompute (aka ODPS) — Big Data платформа компании, объединяющая десятки тысяч машин. Это очень впечатляет — тот же hadoop не сможет поддерживать такое количество.</p><p>Кластер быстрый, удобный, и в него встроены Data Quality и трейсы происхождения данных. Что это значит? Допустим, у вас есть табличка, и ваша основная проблема — узнать, как и кем она сформирована. В MaxCompute есть скрипт, который запускается каждый раз, когда кто-то меняет данные в этой табличке. В метаданных сохраняется весь код, можно просто кликнуть и посмотреть его.</p><p>Еще стоит упомянуть tEngine — это поправленный nginx — и AsparaDB (внутри ALiSQL). Это некий автоматически скалируемый/шардируемый MySQL, что мало у кого есть.</p><h3>В чём проблема</h3><p>К сожалению, облако, в основном, заточено под Китай, и на нашем рынке про него известно мало.</p><p>Кроме того, у нас нет прав конфигурировать облако AliExpress Global. Конечно, мы можем сделать внутри AliCloud своё, и его конфигурировать. Но там не будет нужных нам данных. Поэтому мы сделали облако в своем дата-центре и работаем с ним.</p><p>Что ещё важно? Внутри Alibaba облако гораздо мощнее, чем кажется. Туда встроены разные процессы: управление правами доступа, CI/CD, управление инцидентами, баг-трекинг и так далее.</p><p>Всё это очень хорошо адаптировано под китайский рынок, но не всегда подходит для нас. Например, нам неудобно обращатся к специалистам в Китае каждый раз, когда нужно делать emergency релиз или проводить тестирование на staging.</p><h3>Что мы сделали</h3><p>У нас довольно простое решение. Общепринятые технологии: Kubernetes, Postgres, Kafka, Gitlab как CI/CD и Jira как трекер. 3 независимых машзала в разных дата-центрах. И интеграция дата-центров AliCloud и AER.</p><p>На последнем можно остановиться подробнее. Alibaba очень заботится о безопасности (поэтому, например, нельзя получить VPN в дата-центр компании). Так что, когда мы интегрировались с этим облаком, Alibaba воспринимала это, как входящий трафик снаружи.</p><h2>В заключение</h2><p>Конечно, подробно рассказать про такую большую штуку, как локализация AliExpress, в паре статей невозможно. Поэтому с большого овервью мы начинаем блог о том, как команда AliTech развивает сервисы для продавцов и покупателей в России и СНГ.</p><p>Следите за обновлениями!</p>]]></content:encoded>
    </item>
    <item>
      <title>Яндекс анонсировал Y1 — обновлённый поиск с более 2100 улучшений</title>
      <link>https://tproger.ru/news/jandeks-anonsiroval-y1-obnovljonnyj-poisk-s-bolee-2100-uluchshenij</link>
      <comments>https://tproger.ru/news/jandeks-anonsiroval-y1-obnovljonnyj-poisk-s-bolee-2100-uluchshenij?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/jandeks-anonsiroval-y1-obnovljonnyj-poisk-s-bolee-2100-uluchshenij</guid>
      <description><![CDATA[<p>Обновлённый поиск «Яндекса» Y1 получил более 2100 улучшений; изменения затронули интерфейс и внутренние технологии сервиса.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/jandeks-anonsiroval-y1-obnovljonnyj-poisk-s-bolee-2100-uluchshenij">Яндекс анонсировал Y1 — обновлённый поиск с более 2100 улучшений</a>»</p>]]></description>
      <category><![CDATA[Сортировка и поиск]]></category>
      <category><![CDATA[Машинное обучение]]></category>
      <category><![CDATA[Нейронные сети]]></category>
      <category><![CDATA[Яндекс]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 10 Jun 2021 09:09:28 GMT</pubDate>
      <content:encoded><![CDATA[<p>Компания Яндекс представила новую версию своего поиска. В него вошли множество интересных улучшений, а назвали всё это — Y1.</p><figure><img src="https://media.tproger.ru/uploads/2021/06/1-12.jpg" alt="" /></figure><h3>Поиск фрагмента в видео</h3><p>Теперь поиск Яндекса умеет находить нужный фрагмент видео по тексту запроса пользователя.</p><p>Например, если спросить у обновлённого поисковика «как приготовить стейк тунца», то он найдёт соответствующее видео в интернете и покажет именно тот фрагмент, в котором автор учит готовить стейк тунца.</p><figure><img src="https://media.tproger.ru/uploads/2021/06/1_1-1.png" alt="" /></figure><h3>Быстрые ответы</h3><p>Разработчики Яндекса также обновили и улучшили быстрые ответы.</p><p>Теперь пользователь может спросить у поисковика «как открыть ИП», на что ему предложат как ответ на сам вопрос, так и ответы на связанные с ним темы: кто может открыть ИП, сколько это стоит и т.д.</p><figure><img src="https://media.tproger.ru/uploads/2021/06/1_2.png" alt="" /></figure><p>Число таких вот быстрых ответов, по словам представителей IT-гиганта, составляет внушительные 130 млн штук.</p><h3>Внедрение генеративной нейросети YaML</h3><p>Обновление Y1 впервые принесло в поиск Яндекса нейросеть YaLM. Ранее компания уже использовала её при создании Алисы и <a href="https://tproger.ru/news/jandeks-sozdal-onlajn-servis-dlja-demonstracii-svoego-analoga-jazykovoj-nejroseti-gpt-3-ot-openai/">«утёкшего» недавно сервиса для создания историй Зелибоба</a>.</p><h3>Как попробовать новую версию поиска?</h3><p>С компьютера нужно перейти по <a href="http://yandex.ru/beta">ссылке</a>, а на мобильных устройствах пять раз нажать на логотип Яндекса на главной странице.</p><p>Источник: <a href="https://yandex.ru/y1">Яндекс</a></p>]]></content:encoded>
    </item>
    <item>
      <title>Опубликовано видео с визуализацией 20 видов сортировок в виде новогодней ёлки</title>
      <link>https://tproger.ru/news/opublikovano-video-s-vizualizaciej-20-vidov-sortirovok-v-vide-novogodnej-jolki</link>
      <comments>https://tproger.ru/news/opublikovano-video-s-vizualizaciej-20-vidov-sortirovok-v-vide-novogodnej-jolki?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/opublikovano-video-s-vizualizaciej-20-vidov-sortirovok-v-vide-novogodnej-jolki</guid>
      <description><![CDATA[<p>Ролик канала CompilerStuck показывает работу быстрой, пузырьковой, циклической и других сортировок, а в конце сводит их результаты в общую таблицу.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/opublikovano-video-s-vizualizaciej-20-vidov-sortirovok-v-vide-novogodnej-jolki">Опубликовано видео с визуализацией 20 видов сортировок в виде новогодней ёлки</a>»</p>]]></description>
      <category><![CDATA[Сортировка и поиск]]></category>
      <category><![CDATA[Алгоритмы и структуры данных]]></category>
      <category><![CDATA[Визуализация]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 24 Dec 2020 09:18:52 GMT</pubDate>
      <content:encoded><![CDATA[<figure><img src="https://media.tproger.ru/uploads/2020/12/Screen-Shot-2020-12-24-at-12.08.43-1.png" alt="" /></figure><p>На YouTube-канале CompilerStuck <a href="https://youtu.be/p6rkVqgwVuI">опубликовали</a> новое видео. В нём демонстрируется визуализация 20 видов сортировок на примере построения новогодней ёлки. Быстрая сортировка (dual pivot и pivot middle), сортировка пузырьком, циклическая сортировка — вот лишь часть из того, что можно найти в видео:</p><p>В конце ролика автор показал таблицу, в которой внёс основные показатели использованных сортировок.</p><figure><img src="https://media.tproger.ru/uploads/2020/12/Screen-Shot-2020-12-24-at-12.11.40.png" alt="" /></figure><p>Так, например, пузырьковая сортировка справилась с 1080 элементами за 30,95 мс. Рекордсменом со знаком минус в этом плане оказалась гравитационная сортировка. На работу с теми же 1080 элементами она потратила 2081,97 мс.</p><p>Источник: <a href="https://youtu.be/p6rkVqgwVuI">YouTube/CompilerStuck</a></p>]]></content:encoded>
    </item>
    <item>
      <title>Всё о сортировке в Python: исчерпывающий гайд</title>
      <link>https://tproger.ru/translations/python-sorting</link>
      <comments>https://tproger.ru/translations/python-sorting?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Картофельный Повелитель]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/translations/python-sorting</guid>
      <description><![CDATA[<p>Как сортировать списки, словари и объекты в Python. Примеры sorted(), .sort(), lambda-ключей и кастомной сортировки. Разберитесь раз и навсегда.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/translations/python-sorting">Всё о сортировке в Python: исчерпывающий гайд</a>»</p>]]></description>
      <category><![CDATA[Алгоритмы и структуры данных]]></category>
      <category><![CDATA[Сортировка и поиск]]></category>
      <category><![CDATA[Для начинающих]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Для продолжающих]]></category>
      <category><![CDATA[Переводы]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 16 Dec 2020 08:30:20 GMT</pubDate>
      <content:encoded><![CDATA[<p><a href="https://tproger.ru/articles/python-roadmap">Сортировка в Python</a> выполняется функцией sorted(), если это итерируемые объекты, и методом list.sort(), если это список. Рассмотрим подробнее, как это работало в старых версиях и как работает сейчас.</p><p>• sorted() возвращает новый отсортированный список из любого итерируемого объекта, а list.sort() изменяет список на месте
• Параметр key позволяет задать функцию сортировки — от простых lambda до operator.itemgetter() и attrgetter()
• Сортировка в Python стабильна (Timsort) — элементы с одинаковыми ключами сохраняют исходный порядок
• Параметр reverse=True сортирует по убыванию без потери стабильности
• Для сложных сортировок можно комбинировать несколько последовательных вызовов sorted() благодаря стабильности алгоритма</p><p>Примечание Вы читаете улучшенную версию некогда выпущенной нами статьи.</p><h2>Основы сортировки</h2><p>Так как отсортировать список Python? Для сортировки по возрастанию достаточно вызвать функцию сортировки Python sorted(), которая вернёт новый отсортированный список:</p><p>Для сортировки списка Python также можно использовать метод списков list.sort(), который изменяет исходный список (и возвращает None во избежание путаницы). Обычно Python sort list не так удобен, как использование sorted(), но если вам не нужен исходный список, то так будет немного эффективнее:</p><p>Прим.перев. В Python вернуть None и не вернуть ничего — одно и то же.</p><p>Ещё одно отличие заключается в том, что метод list.sort() определён только для списков, в то время как функция sorted Python работает со всеми итерируемыми объектами. Грубо говоря, функция sort Python сортирует список и сохраняет его в отсортированном виде, в то время как функция sorted Питон создаёт новый отсортированный список без изменения исходного.</p><p>Прим.перев. При итерировании по <a href="https://tproger.ru/explain/python-dictionaries">словарю</a> Python возвращает его ключи. Если вам нужны их значения или пары «ключ-значение», используйте методы dict.values() и dict.items() соответственно.</p><p>Рассмотрим основные функции сортировки Python.</p><h2>Функции-ключи</h2><p>С версии Python 2.4 у list.sort() и sorted() появился параметр key для указания функции, которая будет вызываться на каждом элементе до сравнения. Вот регистронезависимое сравнение строк:</p><p>Значение key должно быть функцией, принимающей один аргумент и возвращающей ключ для сортировки. Работает быстро, потому что функция-ключ вызывается один раз для каждого элемента.</p><figure><img src="https://media.tproger.ru/uploads/2023/03/2.764x92-1.png" alt="" /></figure><p>Часто можно встретить код, где сложный объект сортируется по одному из его индексов. Например:</p><p>Тот же метод работает для объектов с именованными атрибутами:</p><h2>Функции модуля operator</h2><p>Показанные выше примеры функций-ключей встречаются настолько часто, что Python предлагает удобные функции, чтобы сделать всё проще и быстрее. Модуль <a href="https://docs.python.org/3/library/operator.html#module-operator">operator</a> содержит функции itemgetter(), attrgetter() и, начиная с Python 2.6, methodcaller(). С ними всё ещё проще:</p><p>Функции operator дают возможность использовать множественные уровни сортировки массива Python. Отсортируем учеников сначала по оценке, а затем по возрасту:</p><p>Используем функцию methodcaller() для сортировки учеников по взвешенной оценке:</p><h2>Сортировка по возрастанию и сортировка по убыванию в Python</h2><p>list.sort() и sorted() есть параметр reverse, принимающий boolean-значение. Он нужен для обозначения сортировки по убыванию. Отсортируем учеников по убыванию возраста:</p><h2>Стабильность сортировки и сложные сортировки в Python</h2><p>Начиная с версии Python 2.2, сортировки гарантированно стабильны: если у нескольких записей есть одинаковые ключи, их порядок останется прежним. Пример:</p><p>Обратите внимание, что две записи с 'blue' сохранили начальный порядок. Это свойство позволяет составлять сложные сортировки путём постепенных сортировок. Далее мы сортируем данные учеников сначала по возрасту в порядке возрастания, а затем по оценкам в убывающем порядке, чтобы получить данные, отсортированные в первую очередь по оценке и во вторую — по возрасту:</p><p>Алгоритмы сортировки Python вроде <a href="https://ru.wikipedia.org/wiki/Timsort">Timsort</a> проводят множественные сортировки так эффективно, потому что может извлечь пользу из любого порядка, уже присутствующего в наборе данных.</p><h2>Декорируем-сортируем-раздекорируем</h2><ol><li>Сначала исходный список пополняется новыми значениями, контролирующими порядок сортировки.</li><li>Затем новый список сортируется.</li><li>После этого добавленные значения убираются, и в итоге остаётся отсортированный список, содержащий только исходные элементы.</li></ol><p>Вот так можно отсортировать данные учеников по оценке:</p><p>Это работает из-за того, что кортежи сравниваются лексикографически, сравниваются первые элементы, а если они совпадают, то сравниваются вторые и так далее.</p><p>Не всегда обязательно включать индекс в декорируемый список, но у него есть преимущества:</p><ol><li>Сортировка стабильна — если у двух элементов одинаковый ключ, то их порядок не изменится.</li><li>У исходных элементов не обязательно должна быть возможность сравнения, так как порядок декорированных кортежей будет определяться максимум по первым двум элементам. Например, исходный список может содержать комплексные числа, которые нельзя сравнивать напрямую.</li></ol><p>Ещё эта идиома называется <a href="https://ru.wikipedia.org/wiki/Преобразование_Шварца">преобразованием Шварца</a> в честь Рэндела Шварца, который популяризировал её среди Perl-программистов.</p><p>Для больших списков и версий Python ниже 2.4, «декорируем-сортируем-раздекорируем» будет оптимальным способом сортировки. Для версий 2.4+ ту же функциональность предоставляют функции-ключи.</p><h2>Использование параметра cmp</h2><p>Все версии Python 2.x поддерживали параметр cmp для обработки пользовательских функций сравнения. В Python 3.0 от этого параметра полностью избавились. В Python 2.x в sort() можно было передать функцию, которая использовалась бы для сравнения элементов. Она должна принимать два аргумента и возвращать отрицательное значение для случая «меньше чем», положительное — для «больше чем» и ноль, если они равны:</p><p>Можно сравнивать в обратном порядке:</p><p>При портировании кода с версии 2.x на 3.x может возникнуть ситуация, когда нужно преобразовать пользовательскую функцию для сравнения в функцию-ключ. Следующая обёртка упрощает эту задачу по Python:</p><p>Чтобы произвести преобразование, оберните старую функцию:</p><p>В Python 2.7 функция cmp_to_key() была добавлена в модуль functools.</p><h2>Поддержание порядка сортировки</h2><p>В стандартной библиотеке Python нет модулей, аналогичных типам данных C++ вроде set и map. Python делегирует эти задачи сторонним библиотекам, доступным в <a href="https://pypi.org">Python Package Index</a>: они используют различные методы для сохранения типов list, dict и set в отсортированном порядке. Поддержание порядка с помощью специальной структуры данных может помочь избежать очень медленного поведения (квадратичного времени выполнения) при наивном подходе с редактированием и постоянной пересортировкой данных. Вот некоторые из модулей, реализующих эти типы данных:</p><ul><li><a href="http://www.grantjenks.com/docs/sortedcontainers/">SortedContainers</a> — реализация сортированных типов list, dict и set на чистом Python, по скорости не уступает реализациям на C. Тестирование включает 100% покрытие кода и многие часы стресс-тестирования. В документации можно найти полный справочник по API, <a href="http://www.grantjenks.com/docs/sortedcontainers/performance.html">сравнение производительности</a> и руководства по внесению своего вклада.</li><li><a href="https://pypi.python.org/pypi/rbtree">rbtree</a> — быстрая реализация на C для типов dict и set. Реализация использует структуру данных, известную как красно-чёрное дерево.</li><li><a href="https://pypi.python.org/pypi/treap">treap</a> — сортированный dict. В реализации используется Декартово дерево, а производительность улучшена с помощью Cython.</li><li><a href="https://pypi.python.org/pypi/bintrees">bintrees</a> — несколько реализаций типов dict и set на основе деревьев на C. Самые быстрые основаны на АВЛ и красно-чёрных деревьях. Расширяет общепринятый API для предоставления операций множеств для словарей.</li><li><a href="https://pypi.python.org/pypi/Banyan">banyan</a> — быстрая реализация dict и set на C.</li><li><a href="https://pypi.python.org/pypi/skiplistcollections">skiplistcollections</a> — реализация на чистом Python, основанная на списках с пропусками, предлагает ограниченный API для типов dict и set.</li><li><a href="https://pypi.python.org/pypi/blist">blist</a> — предоставляет сортированные типы list, dict и set, основанные на типе данных «blist», реализация на Б-деревьях. Написано на Python и C.</li></ul><h2>Прочее</h2><p>Для сортировки с учётом языка используйте locale.strxfrm() в качестве ключевой функции или locale.strcoll() в качестве функции сравнения. Параметр reverse всё ещё сохраняет стабильность сортировки. Этот эффект можно сымитировать без параметра, использовав встроенную функцию reversed() дважды:</p><p>Чтобы создать стандартный порядок сортировки для класса, просто добавьте реализацию соответствующих методов сравнения:</p><p>Для типов, сравнение которых работает обычным образом, рекомендуется определять все 6 операторов. <a href="https://tproger.ru/translations/demystifying-decorators-in-python">Декоратор</a> классов functools.total_ordering упрощает их реализацию. Функциям-ключам не нужен доступ к внутренним данным сортируемых объектов. Они также могут осуществлять доступ к внешним ресурсам. Например, если оценки ученика хранятся в словаре, их можно использовать для сортировки отдельного списка с именами учеников:</p><h2>Часто задаваемые вопросы</h2><h3>Чем отличается sorted() от .sort() в Python?</h3><p>Функция sorted() принимает любой итерируемый объект и возвращает новый отсортированный список, не изменяя исходные данные. Метод list.sort() работает только со списками и сортирует их на месте, возвращая None. Если исходный порядок элементов больше не нужен, .sort() работает немного быстрее за счёт отсутствия создания нового объекта.</p><h3>Как отсортировать список словарей по ключу?</h3><p>Используйте параметр key с lambda-функцией или operator.itemgetter(). Например, sorted(data, key=lambda x: x['age']) отсортирует список словарей по значению ключа 'age'. Для множественной сортировки передайте кортеж: key=lambda x: (x['grade'], x['age']).</p><h3>Что такое стабильная сортировка в Python?</h3><p>Стабильная сортировка гарантирует, что элементы с одинаковыми ключами сохраняют свой исходный порядок. Python использует алгоритм Timsort, который стабилен начиная с версии 2.2. Это позволяет строить сложные сортировки последовательными вызовами sorted() — сначала по вторичному ключу, затем по первичному.</p><h3>Как отсортировать список в обратном порядке?</h3><p>Передайте параметр reverse=True в sorted() или list.sort(). Например: sorted([3, 1, 2], reverse=True) вернёт [3, 2, 1]. Этот параметр сохраняет стабильность сортировки — элементы с одинаковыми ключами не поменяют взаимный порядок.</p><p>Надеемся, теория по Python list sort и соответствующие задачи по Питону с разбором были для вас полезны. Вас также может заинтересовать статьи:</p><ul><li><a href="https://tproger.ru/curriculum/python-how-to-learn">Хочу научиться программировать на Python. С чего начать?</a></li><li><a href="https://tproger.ru/curriculum/python-how-to-learn-2">Хочу научиться программировать на Python: инструкция для продолжающих</a></li></ul>]]></content:encoded>
    </item>
    <item>
      <title>Объяснение алгоритмов сортировки с примерами на Python</title>
      <link>https://tproger.ru/translations/sorting-algorithms-in-python</link>
      <comments>https://tproger.ru/translations/sorting-algorithms-in-python?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Klara Oswald]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/translations/sorting-algorithms-in-python</guid>
      <description><![CDATA[<p>Разбор шести алгоритмов сортировки на Python с реализацией: пузырьковая, выборкой, вставками, пирамидальная, слиянием и быстрая. Сравнение скорости и Big-O.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/translations/sorting-algorithms-in-python">Объяснение алгоритмов сортировки с примерами на Python</a>»</p>]]></description>
      <category><![CDATA[Алгоритмы и структуры данных]]></category>
      <category><![CDATA[Сортировка и поиск]]></category>
      <category><![CDATA[Для начинающих]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Переводы]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sun, 05 May 2019 19:41:53 GMT</pubDate>
      <content:encoded><![CDATA[<p><b>Ключевые выводы:</b><br />- Пузырьковая сортировка проста для понимания, но имеет сложность O(n²) — не подходит для больших массивов<br />- Быстрая сортировка и сортировка слиянием работают за O(n log n) — оптимальный выбор для большинства задач<br />- Встроенные sort() и sorted() в Python используют Timsort — гибрид сортировки слиянием и вставками<br />- Для практических задач рекомендуется использовать встроенные функции Python, а не собственные реализации</p><p>В этой статье будут рассмотрены популярные алгоритмы, принципы их работы и реализация на Python. А еще сравним, как быстро они сортируют элементы в списке.</p><p>В качестве общего примера возьмем сортировку чисел в порядке возрастания. Но эти методы можно легко адаптировать под ваши потребности.</p><h2>Пузырьковая сортировка</h2><p>Этот простой алгоритм выполняет итерации по списку, сравнивая элементы попарно и меняя их местами, пока более крупные элементы не «всплывут» в начало списка, а более мелкие не останутся на «дне».</p><h3>Алгоритм</h3><p>Сначала сравниваются первые два элемента списка. Если первый элемент больше, они меняются местами. Если они уже в нужном порядке, оставляем их как есть. Затем переходим к следующей паре элементов, сравниваем их значения и меняем местами при необходимости. Этот процесс продолжается до последней пары элементов в списке.</p><p>При достижении конца списка процесс повторяется заново для каждого элемента. Это крайне неэффективно, если в массиве нужно сделать, например, только один обмен. Алгоритм повторяется n² раз, даже если список уже отсортирован.</p><p>Для оптимизации алгоритма нужно знать, когда его остановить, то есть когда список отсортирован.</p><p>Чтобы остановить алгоритм по окончании сортировки, нужно ввести переменную-флаг. Когда значения меняются местами, устанавливаем флаг в значение True, чтобы повторить процесс сортировки. Если перестановок не произошло, флаг остается False и алгоритм останавливается.</p><h3>Реализация</h3><p>Алгоритм работает в цикле while и прерывается, когда элементы ни разу не меняются местами. Вначале присваиваем swapped значение True, чтобы алгоритм запустился хотя бы один раз.</p><h3>Время сортировки</h3><p>Если взять самый худший случай (изначально список отсортирован по убыванию), затраты времени будут равны O(n²), где n — количество элементов списка.</p><h2>Сортировка выборкой</h2><p>Этот алгоритм сегментирует список на две части: отсортированную и неотсортированную. Наименьший элемент удаляется из второго списка и добавляется в первый.</p><h3>Алгоритм</h3><p>На практике не нужно создавать новый список для отсортированных элементов. В качестве него используется крайняя левая часть списка. Находится наименьший элемент и меняется с первым местами.</p><p>Теперь, когда нам известно, что первый элемент списка отсортирован, находим наименьший элемент из оставшихся и меняем местами со вторым. Повторяем это до тех пор, пока не останется последний элемент в списке.</p><h3>Реализация</h3><p>По мере увеличения значения i нужно проверять меньше элементов.</p><h3>Время сортировки</h3><p>Затраты времени на сортировку выборкой в среднем составляют O(n²), где n — количество элементов списка.</p><h2>Сортировка вставками</h2><p>Как и сортировка выборкой, этот алгоритм сегментирует список на две части: отсортированную и неотсортированную. Алгоритм перебирает второй сегмент и вставляет текущий элемент в правильную позицию первого сегмента.</p><h3>Алгоритм</h3><p>Предполагается, что первый элемент списка отсортирован. Переходим к следующему элементу, обозначим его х. Если х больше первого, оставляем его на своем месте. Если он меньше, копируем его на вторую позицию, а х устанавливаем как первый элемент.</p><p>Переходя к другим элементам несортированного сегмента, перемещаем более крупные элементы в отсортированном сегменте вверх по списку, пока не встретим элемент меньше x или не дойдем до конца списка. В первом случае x помещается на правильную позицию.</p><h3>Реализация</h3><h3>Время сортировки</h3><p>Время сортировки вставками в среднем равно O(n²), где n — количество элементов списка.</p><h2>Пирамидальная сортировка</h2><p>Также известна как сортировка кучей. Этот популярный алгоритм, как и сортировки вставками или выборкой, сегментирует список на две части: отсортированную и неотсортированную. Алгоритм преобразует второй сегмент списка в структуру данных «куча» (heap), чтобы можно было эффективно определить самый большой элемент.</p><h3>Алгоритм</h3><p>Сначала преобразуем список в Max Heap — бинарное дерево, где самый большой элемент является вершиной дерева. Затем помещаем этот элемент в конец списка. После перестраиваем Max Heap и снова помещаем новый наибольший элемент уже перед последним элементом в списке.</p><p>Этот процесс построения кучи повторяется, пока все вершины дерева не будут удалены.</p><h3>Реализация</h3><p>Создадим вспомогательную функцию heapify() для реализации этого алгоритма:</p><h3>Время сортировки</h3><p>В среднем время сортировки кучей составляет O(n log n), что уже значительно быстрее предыдущих алгоритмов.</p><h2>Сортировка слиянием</h2><p>Этот алгоритм относится к алгоритмам «разделяй и властвуй». Он разбивает список на две части, каждую из них он разбивает еще на две и т. д. Список разбивается пополам, пока не останутся единичные элементы.</p><p>Соседние элементы становятся отсортированными парами. Затем эти пары объединяются и сортируются с другими парами. Этот процесс продолжается до тех пор, пока не отсортируются все элементы.</p><h3>Алгоритм</h3><p>Список рекурсивно разделяется пополам, пока в итоге не получатся списки размером в один элемент. Массив из одного элемента считается упорядоченным. Соседние элементы сравниваются и соединяются вместе. Это происходит до тех пор, пока не получится полный отсортированный список.</p><p>Сортировка осуществляется путем сравнения наименьших элементов каждого подмассива. Первые элементы каждого подмассива сравниваются первыми. Наименьший элемент перемещается в результирующий массив. Счетчики результирующего массива и подмассива, откуда был взят элемент, увеличиваются на 1.</p><h3>Реализация</h3><p>Обратите внимание, что функция merge_sort(), в отличие от предыдущих алгоритмов, возвращает новый список, а не сортирует существующий. Поэтому такая сортировка требует больше памяти для создания нового списка того же размера, что и входной список.</p><h3>Время сортировки</h3><p>В среднем время сортировки слиянием составляет O(n log n).</p><h2>Быстрая сортировка</h2><p>Этот алгоритм также относится к алгоритмам «разделяй и властвуй». Его используют чаще других алгоритмов, описанных в этой статье. При правильной конфигурации он чрезвычайно эффективен и не требует дополнительной памяти, в отличие от сортировки слиянием. Массив разделяется на две части по разные стороны от опорного элемента. В процессе сортировки элементы меньше опорного помещаются перед ним, а равные или большие — позади.</p><h3>Алгоритм</h3><p>Быстрая сортировка начинается с разбиения списка и выбора одного из элементов в качестве опорного. А все остальное передвигаем так, чтобы этот элемент встал на свое место. Все элементы меньше него перемещаются влево, а равные и большие элементы перемещаются вправо.</p><h3>Реализация</h3><p>Существует много вариаций данного метода. Способ разбиения массива, рассмотренный здесь, соответствует схеме Хоара (создателя данного алгоритма).</p><h3>Время выполнения</h3><p>В среднем время выполнения быстрой сортировки составляет O(n log n).</p><p>Обратите внимание, что алгоритм быстрой сортировки будет работать медленно, если опорный элемент равен наименьшему или наибольшему элементам списка. При таких условиях, в отличие от сортировок кучей и слиянием, обе из которых имеют в худшем случае время сортировки O(n log n), быстрая сортировка в худшем случае будет выполняться O(n²).</p><h2>Встроенные функции сортировки на Python</h2><p>Иногда полезно знать перечисленные выше алгоритмы, но в большинстве случаев разработчик, скорее всего, будет использовать функции сортировки, уже предоставленные в языке программирования.</p><p>Отсортировать содержимое списка можно с помощью стандартного метода sort():</p><p>Или можно использовать функцию sorted() для создания нового отсортированного списка, оставив входной список нетронутым:</p><p>Оба эти метода сортируют в порядке возрастания, но можно изменить порядок, установив для флага reverse значение True:</p><p>В отличие от других алгоритмов, обе функции в Python могут сортировать также списки кортежей и классов. Функция sorted() может сортировать любую последовательность, которая включает списки, строки, кортежи, словари, наборы и пользовательские итераторы, которые вы можете создать.</p><p>Функции в Python реализуют алгоритм <a href="https://ru.wikipedia.org/wiki/Timsort">Tim Sort</a>, основанный на сортировке слиянием и сортировке вставкой.</p><h2>Сравнение скоростей сортировок</h2><p>Для сравнения сгенерируем массив из 5000 чисел от 0 до 1000. Затем определим время, необходимое для завершения каждого алгоритма. Повторим каждый метод 10 раз, чтобы можно было более точно установить, насколько каждый из них производителен.</p><p><a href="https://media.tproger.ru/uploads/2019/05/sravnenie_algoritmov_sortirovki.png"></a></p><p>Пузырьковая сортировка — самый медленный из всех алгоритмов. Возможно, он будет полезен как введение в тему алгоритмов сортировки, но не подходит для практического использования.<br />Быстрая сортировка хорошо оправдывает свое название, почти в два раза быстрее, чем сортировка слиянием, и не требуется дополнительное место для результирующего массива.<br />Сортировка вставками выполняет меньше сравнений, чем сортировка выборкой и в реальности должна быть производительнее, но в данном эксперименте она выполняется немного медленней. Сортировка вставками делает гораздо больше обменов элементами. Если эти обмены занимают намного больше времени, чем сравнение самих элементов, то такой результат вполне закономерен.</p><p>Вы познакомились с шестью различными алгоритмами сортировок и их реализациями на Python. Масштаб сравнения и количество перестановок, которые выполняет алгоритм вместе со средой выполнения кода, будут определяющими факторами в производительности. В реальных приложениях Python рекомендуется использовать встроенные функции сортировки, поскольку они реализованы именно для удобства разработчика.</p><p>Предлагаем также ознакомиться с <a href="https://tproger.ru/articles/algoritmy-sortirovki-na-java-s-primerami/">алгоритмами сортировки на Java</a>.</p><h2>Часто задаваемые вопросы</h2><h3>Какой алгоритм сортировки самый быстрый?</h3><p>Для большинства практических задач быстрая сортировка (Quick Sort) показывает лучшую производительность со средним временем O(n log n). Однако в худшем случае она деградирует до O(n²). Если важна гарантированная производительность, лучше выбрать сортировку слиянием или пирамидальную сортировку — обе работают за O(n log n) даже в худшем случае.</p><h3>Когда использовать встроенную сортировку Python?</h3><p>Практически всегда. Встроенные sort() и sorted() используют алгоритм Timsort, оптимизированный для реальных данных. Он сочетает преимущества сортировки слиянием и вставками, эффективно обрабатывает частично отсортированные массивы и написан на C, что дает значительный выигрыш в скорости по сравнению с Python-реализациями.</p><h3>Чем отличается sort() от sorted() в Python?</h3><p>Метод sort() сортирует список на месте (in-place) и возвращает None — он изменяет исходный список. Функция sorted() создает и возвращает новый отсортированный список, оставляя исходный без изменений. sorted() работает с любыми итерируемыми объектами (строки, кортежи, словари), а sort() — только со списками.</p><h3>Какой алгоритм лучше для почти отсортированных данных?</h3><p>Для почти отсортированных массивов лучше всего подходит сортировка вставками — она работает за O(n) на уже упорядоченных данных. Именно поэтому Timsort (встроенный алгоритм Python) использует сортировку вставками для небольших подмассивов, а сортировку слиянием — для объединения крупных блоков.</p>]]></content:encoded>
    </item>
    <item>
      <title>Задача: годовой баланс</title>
      <link>https://tproger.ru/problems/annual-balance</link>
      <comments>https://tproger.ru/problems/annual-balance?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Никита Прияцелюк]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/problems/annual-balance</guid>
      <description><![CDATA[<p>Практическая задача для программистов: найдите максимальную разность a-b перестановкой цифр. Учтите знаки и ведущий ноль.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/problems/annual-balance">Задача: годовой баланс</a>»</p>]]></description>
      <category><![CDATA[Задачи умеренной сложности]]></category>
      <category><![CDATA[Алгоритмы и структуры данных]]></category>
      <category><![CDATA[Сортировка и поиск]]></category>
      <category><![CDATA[Задачки]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sat, 19 May 2018 12:30:50 GMT</pubDate>
      <content:encoded><![CDATA[<p>В конторе «Рога и Копыта» подходит время подведения годового баланса. В бухгалтерию поступили сведения о том, что, согласно документам, суммарный расход составил а рублей, a суммарный приход – b рублей. Поскольку с реальным положением дел эти цифры все равно не имеют ничего общего, бухгалтер решил реализовать следующую свою идею. Как известно, при наборе чисел на компьютере люди часто ошибаются и вводят цифры в неправильном порядке (например, если надо ввести 150, могут ввести 105). Поэтому бухгалтер хочет найти такой способ переставить цифры в числах a и b, чтобы в результате разность a−b (и, соответственно, количество денег, которые он положит к себе в карман), была максимальна, а в случае чего можно будет сослаться на ошибку секретаря. При этом нельзя забывать о знаке чисел и о том, что ноль не может быть первой цифрой числа, отличного от ноля. Напишите программу, которая поможет бухгалтеру.</p><p>Входные данные:</p><p>Входной файл INPUT.TXT содержит два целых числа a и b (-109 &lt; a,b &lt; 109).</p><p>Выходные данные:</p><p>В выходной файл OUTPUT.TXT выведите одно целое число – наибольшую разность чисел, первое из которых может быть получено перестановкой цифр a, а второе – перестановкой цифр b.</p><p>Примеры:</p><ol><li>Входные данные: 18 и 10; выходные: 71;</li><li>Входные данные: 1 и -23; выходные: 33.</li></ol><h3>Решение</h3><p>Для того, чтобы значение a−b было максимально, необходимо из a получить максимально возможное число, а из b, наоборот, определить наименьшее. Если число неотрицательно, то для получения минимума цифры сортируются в порядке возрастания, а при вычислении максимума, соответственно, в порядке убывания. Для отрицательных чисел ситуация с сортировкой цифр меняется с точностью до наоборот. Причем, нужно заметить, что при сортировке цифр по возрастанию нужно избежать момента, где пришлось бы поставить 0 на первое место (этого можно достичь, например, при сортировке пузырьком, если при сравнении первых двух соседних элементов не менять их в том случае, когда второй — это ноль).</p><p>Сортировку цифр в числе проще проводить, если преобразовать само число в строку, и работать с обычным массивом символов. Причем, знак  - не обязательно включать в этот массив. Отсортировав его, например пузырьком, можно сделать обратное преобразование строки в число. После нахождения максимального a и минимального b останется просто вывести значение a−b.</p><p>Для хранения чисел можно использовать обычный 4-байтовый целый тип (long или longint например), т.к. результат вычислений не может превзойти значения 1999999998 по абсолютной величине. Если бы ограничения на a и b были не до миллиарда, а до двух миллиардов, то итоговая разница могла бы достигать значения, большего 19 миллиардов, где пришлось бы использовать такие 8-байтовые целые типы как int64 или __int64.</p><p>Другие интересные задачи для программистов (и не только) вы можете посмотреть у нас <a href="https://tproger.ru/problems/">на сайте</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Визуализации алгоритмов сортировки</title>
      <link>https://tproger.ru/digest/sorting-algorithms-visualized</link>
      <comments>https://tproger.ru/digest/sorting-algorithms-visualized?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Евгений Туренко]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/digest/sorting-algorithms-visualized</guid>
      <description><![CDATA[<p>Визуализация показывает, как работают алгоритмы сортировки, включая Insertion sort для почти упорядоченных данных и Bubble sort для небольших массивов.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/digest/sorting-algorithms-visualized">Визуализации алгоритмов сортировки</a>»</p>]]></description>
      <category><![CDATA[Алгоритмы и структуры данных]]></category>
      <category><![CDATA[Сортировка и поиск]]></category>
      <category><![CDATA[Визуализация]]></category>
      <category><![CDATA[Подборки]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 26 Sep 2017 18:04:12 GMT</pubDate>
      <content:encoded><![CDATA[<p><a href="https://goo.gl/k2PPpm">Алгоритмы сортировки</a> упорядочивают элементы по определённому критерию. В день появления первых компьютерных вычислений появился и повод для споров между исследователями. Причиной разногласий послужил поиск эффективных способов решения не только для общих задач, но и для сложных проблем. К таким задачам и проблемам также относится тема сортировки элементов по определённому критерию.</p><p>Визуализация алгоритмов сортировки служит для того, чтобы понять, как работают одни из самых известных алгоритмов сортировки.</p><h2>Сортировка вставками (Insertion sort)</h2><p>Несмотря на то что этот алгоритм сортировки имеет довольно большую <a href="https://tproger.ru/translations/algorithms-and-data-structures/">вычислительную сложность</a>, он остаётся полезным, когда данные почти полностью отсортированы или размер данных не очень велик.</p><p>В алгоритме Insertion sort элементы входной последовательности просматриваются по одному, и каждый новый поступивший элемент размещается в подходящее место среди ранее упорядоченных элементов.</p><p>Временная сложность алгоритма — O(n2).</p><p>Пример реализации:</p><figure><img src="https://media.tproger.ru/uploads/2017/09/InsertionSort.gif" alt="" /></figure><h2>Сортировка пузырьком (Bubble sort)</h2><p>Для понимания и реализации этот алгоритм — простейший, но эффективен он лишь для небольших массивов. Алгоритм считается учебным и практически не применяется вне учебной литературы, вместо него на практике применяются более эффективные алгоритмы сортировки.</p><p>В то же время метод сортировки обменами лежит в основе некоторых более совершенных алгоритмов, таких как сортировка перемешиванием, пирамидальная сортировка и быстрая сортировка.</p><p>Пример реализации:</p><figure><img src="https://media.tproger.ru/uploads/2017/09/BubbleSort.gif" alt="" /></figure><h2>Сортировка выбором (Selection sort)</h2><p>Сортировка выбором — это некий гибрид между пузырьковой и сортировкой вставками. Как и сортировка пузырьком, этот алгоритм проходит по массиву раз за разом, перемещая одно значение на правильную позицию. Однако, в отличие от пузырьковой сортировки, он выбирает наименьшее неотсортированное значение вместо наибольшего. Как и при сортировке вставками, упорядоченная часть массива расположена в начале, в то время как в пузырьковой сортировке она находится в конце.</p><p>Пример реализации:</p><h2>Сортировка Шелла (Shell Sort)</h2><p>Алгоритм сортировки, являющийся усовершенствованным вариантом сортировки вставками. Идея метода Шелла состоит в сравнении элементов, стоящих не только рядом, но и на определённом расстоянии друг от друга. Иными словами — это сортировка вставками с предварительными «грубыми» проходами.</p><p>Невзирая на то, что сортировка Шелла во многих случаях медленнее, чем быстрая сортировка, она имеет ряд преимуществ:</p><ul><li>отсутствие потребности в памяти под стек;</li><li>отсутствие деградации при неудачных наборах данных — быстрая сортировка легко деградирует до O(n²), что хуже, чем худшее гарантированное время для сортировки Шелла.</li></ul><p>Пример реализации:</p><figure><img src="https://media.tproger.ru/uploads/2017/09/Shell-sort.gif" alt="" /></figure><h2>Сортировка слиянием (Merge sort)</h2><p>Алгоритм сортировки упорядочивает списки (или другие структуры данных, доступ к элементам которых можно получать только последовательно, например — потоки) в определённом порядке. Эта сортировка — хороший пример использования принципа «разделяй и властвуй». Сначала задача разбивается на несколько подзадач меньшего размера. Затем эти задачи решаются с помощью рекурсивного вызова или непосредственно, если их размер достаточно мал. Наконец, их решения комбинируются, и получается решение исходной задачи.</p><p>Пример реализации:</p><figure><img src="https://media.tproger.ru/uploads/2017/09/MergeSort.gif" alt="" /></figure><h2>Быстрая сортировка (Quick Sort)</h2><p>Этот широко известный алгоритм сортировки был разработан английским информатиком <a href="https://ru.wikipedia.org/wiki/%D0%A5%D0%BE%D0%B0%D1%80,_%D0%A7%D0%B0%D1%80%D0%BB%D1%8C%D0%B7_%D0%AD%D0%BD%D1%82%D0%BE%D0%BD%D0%B8_%D0%A0%D0%B8%D1%87%D0%B0%D1%80%D0%B4">Чарльзом Хоаром</a> во время его работы в МГУ в советские годы.</p><p><a href="https://ru.wikipedia.org/wiki/%D0%A2%D0%B5%D0%BE%D1%80%D0%B8%D1%8F_%D1%81%D0%BB%D0%BE%D0%B6%D0%BD%D0%BE%D1%81%D1%82%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B9">Один из самых быстрых</a> известных универсальных алгоритмов сортировки массивов: в среднем O(n log n) обменов при упорядочении n-элементов; из-за наличия ряда недостатков на практике обычно используется с некоторыми доработками.</p><p>Быстрая сортировка относится к алгоритмам «разделяй и властвуй».</p><p>Алгоритм состоит из трёх шагов:</p><ol><li>Выбор опорного элемента из массива.</li><li>Перераспределение элементов в массиве таким образом, что элементы меньше опорного помещаются перед ним, а больше или равные — после.</li><li>Рекурсивное применение первых двух шагов к двум подмассивам слева и справа от опорного элемента. Рекурсия не применяется к массиву, в котором только один или отсутствуют элементы.</li></ol><p>Примеры кода быстрой и пирамидальной сортировки на Python вы можете найти в статье «<a href="https://tproger.ru/translations/sorting-algorithms-in-python/">Объяснение алгоритмов сортировки с примерами на Python</a>».<a href="https://media.tproger.ru/uploads/2017/09/ezgif.com-video-to-gif-17.gif"></a></p><h2>Пирамидальная сортировка (Heapsort)</h2><p>Heapsort — алгоритм, в основе которого лежит сравнение.</p><p>Алгоритм пирамидальной сортировки можно рассматривать как улучшенную версию алгоритма сортировки выбором: он делит входные данные на отсортированную и несортированную области, а затем последовательно уменьшает несортированную область, извлекая самый большой элемент и перемещая его в сортированную область. Улучшение состоит в том, что используется бинарная куча, а не алгоритм линейного поиска, чтобы найти наибольшее значение.</p><p>Пирамидальная сортировка является одним из методов, быстродействие которых оценивается как O(n log n).</p><figure><img src="https://media.tproger.ru/uploads/2017/09/Heap-Sort.gif" alt="" /></figure>]]></content:encoded>
    </item>
    <item>
      <title>StackSort: сортировка массива через Stack Overflow</title>
      <link>https://tproger.ru/articles/stacksort</link>
      <comments>https://tproger.ru/articles/stacksort?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Типичный программист]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/stacksort</guid>
      <description><![CDATA[<p>Шуточный StackSort ищет на Stack Overflow ответы по запросу «sort a list», запускает найденный код и продолжает поиск до правильного результата.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/stacksort">StackSort: сортировка массива через Stack Overflow</a>»</p>]]></description>
      <category><![CDATA[Сортировка и поиск]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 29 Aug 2017 16:58:34 GMT</pubDate>
      <content:encoded><![CDATA[<p>В 2013 году на xkcd появился <a href="https://xkcd.com/1185/">комикс</a> про неэффективные методы сортировки. В теге alt к картинке (текст при наведении) рассказывалось об ещё одном интересном способе — StackSort. Суть в том, чтобы поискать на Stack Overflow ответы по запросу «sort a list» (отсортировать список), а затем поочерёдно запускать их, пока не получится правильный ответ.</p><p>И <a href="http://gkoberger.net/">один программист</a>, ранее работавший в Mozilla, <a href="https://gkoberger.github.io/stacksort/">реализовал</a> StackSort на самом деле!</p><p>Скрипт ищет вопросы, помеченые тегами «javascript», «arrays» и «sorting», затем извлекает из текста принятого ответа блок с кодом и пытается его выполнить. Если это удаётся без ошибок, то выводит результат. Если нет, то поиск продолжается. В качестве входных данных может быть массив из чисел, строк, просто строка или же json.</p><p>Автор специально использует только ответы, которые опубликованы до появления комикса, чтобы в алгоритм не подсунули нежелательный код, на котором выполнится eval() для вычисления результата. Так что можете даже не пытаться всё сломать 😉</p>]]></content:encoded>
    </item>
    <item>
      <title>123 задачи с IT-собеседований с разбором решений</title>
      <link>https://tproger.ru/articles/problems</link>
      <comments>https://tproger.ru/articles/problems?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Картофельный Повелитель]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/problems</guid>
      <description><![CDATA[<p>Подборка из 123 задач с IT-собеседований с разбором решений. Логика, алгоритмы, программирование.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/problems">123 задачи с IT-собеседований с разбором решений</a>»</p>]]></description>
      <category><![CDATA[Алгоритмы и структуры данных]]></category>
      <category><![CDATA[Стеки и очереди]]></category>
      <category><![CDATA[Поразрядная обработка]]></category>
      <category><![CDATA[Сортировка и поиск]]></category>
      <category><![CDATA[C++]]></category>
      <category><![CDATA[Рекурсия и динамика]]></category>
      <category><![CDATA[Головоломки]]></category>
      <category><![CDATA[Математика и теория вероятностей]]></category>
      <category><![CDATA[Задачи умеренной сложности]]></category>
      <category><![CDATA[Задачи повышенной сложности]]></category>
      <category><![CDATA[Оптимизация]]></category>
      <category><![CDATA[Собеседование]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 20 Oct 2015 12:45:48 GMT</pubDate>
      <content:encoded><![CDATA[<p>При приеме сотрудника в офис на должность программиста, работодатель испытывает кандидата не только вопросами о навыках, но и всевозможными логическими задачами, IT-кейсами и заданиями по разработке для профессиональных программистов. Как правило, список этих задач у работодателей совпадает, а значит, мы можем подготовиться к любому собеседованию!</p><p><b>Ключевые выводы</b>
• На IT-собеседованиях встречаются логические, алгоритмические задачи, вопросы по языкам и Fermi-задачи
• Ключ к успеху — умение рассуждать вслух
• Важно практиковаться на разных типах задач
• Задачи давались в Google, Amazon, Apple и Twitter</p><p>В нашей <a href="https://tproger.ru/problems/">рубрике c заданиями</a> уже больше 100 вопросов с подробным разбором решений. Мы решили собрать воедино все самые интересные и популярные задачи для программистов, которые могут встретиться вам на собеседовании.</p><h2>Задачи на структуры данных</h2><p>Есть однонаправленный список из структур. В нём random указывает на какой-то еще элемент этого же списка. Требуется написать функцию, которая копирует этот список с сохранением структуры (т.е. если в старом списке random первой ноды указывал на 4-ю, в новом списке должно быть то же самое – рандом первой ноды указывает на 4-ю ноду нового списка). O(n), константная дополнительная память + память под элементы нового списка. Нельзя сразу выделить память под все данные одник куском т.е. список должен быть честным, разбросанным по частям, а не единым блоком, как массив.</p><p>Ответ Вариант реализации</p><p>Классическая задачка с собеседований в Google. На доске записаны числа, вам нужно ответить на вопрос: какое число идёт дальше?</p><p>Ответ</p><p>Допустим, вы летите из Москвы во Владивосток, а затем обратно, при полном безветрии. Затем вы совершаете точно такой же перелёт, но на этот раз на протяжении всего перелёта дует постоянный западный ветер: в одну сторону попутный, в обратную — лобовой.</p><p>Ответ</p><p>Что не так в этом отрывке кода на С++?</p><p>Ответ</p><p>Задача, которая была популярна в своё время на собеседованиях в Amazon. Мы русифицировали её, но смысл остался тот же. Вам нужно продолжить последовательность.</p><p>Ответ автора с обзором вариантов ответов подписчиков</p><p>Как это вычислить, не пользуясь калькулятором? Можете дать приблизительный ответ?</p><p>Ответ</p><p>«Вас уменьшили до размеров 5-центовой монеты и бросили в блендер. Ваш вес уменьшился так, что плотность вашего тела осталась прежней. Лезвия начнут вращаться через 60 секунд. Ваши действия?»</p><p>Это классическая google-задачка, хороший разбор которой в рунете не так-то просто найти. Мы подготовили его для вас. Абсолютного правильного ответа нет, но есть те, которые явно лучше остальных.</p><p>Разбор вариантов ответа</p><p>Вопрос по С++. Что за ошибка «pure virtual function call»? В какой ситуации она может быть сгенерирована? Предоставьте минимальный код, приводящий к ней.</p><p>Ответ</p><p>В вашем распоряжении 10 тысяч серверов в дата-центре с возможностью удалённого управления и один день, чтобы получить миллион долларов. Что вы для этого сделаете?</p><p>Ответ</p><p>У вас есть аналоговые часы с секундной стрелкой. Сколько раз в день все три стрелки часов накладываются друг на друга?</p><p>Ответ</p><p>В чём разница между string и String в C#?</p><p>Ответ</p><p>Вы играете в футбол на пустынном острове и хотите подбросить монетку, чтобы решить, какой команде достанется мяч. Единственная монета, что у вас есть, является гнутой, и поэтому вносит явные искажения в результат при подбрасывании. Как вы тем не менее можете использовать такую монету, чтобы принять справедливое решение?</p><p>Ответ</p><p>Cколько мячей для гольфа войдет в школьный автобус?</p><p>Для справки: в Национальных стандартах транспотрных средств для школ в США на 1995 год указаны максимальные размеры школьного автобуса и равны 40 футам в длину и 8.5 футам в ширину. Стандартный диаметр мяча для гольфа — 1.69 дюйма с допуском 0.005 дюймов.</p><p>Ответ</p><p>Представьте себе вращающийся диск, например DVD. У вас есть в распоряжении черная (Ч) и белая (Б) краски. На краю диска установлен небольшой датчик, который определяет цвет под ним и выдает результат в виде сигнала. Как бы вы раскрасили диск, чтобы было возможно определить направление вращения по показаниям датчика?</p><p>Дадим небольшое пояснение к задаче. Первое, что нужно иметь ввиду, это то, что нельзя наблюдать за самим диском. Например, вы сидите в офисе, а диск вращается в закрытой лаборатории. Единственная возможность определить направление вращения — использовать оцифрованные показания датчика, и ничего больше.</p><p>Датчик фиксирует цвет точки в непосредственном месте установки в последовательные моменты времени. Показания представляются в виде «ЧЧЧББ…». Задача сводится к такой раскраске диска, где последовательность показаний отличается при вращении в прямую и в противоположную стороны.</p><p>Ответ</p><p>У вас есть исходный код приложения на языке С, которое аварийно завершается после запуска. После десяти запусков в отладчике вы обнаруживаете, что каждый раз программа падает в разных местах. Приложение однопоточное и использует только стандартную библиотеку С. Какие ошибки могут вызвать падение приложения? Как вы проверите каждую?</p><p>Ответ</p><p>Найдите ошибки в следующем коде.</p><p>Ответ</p><p>Объясните, что делает этот код.</p><p>((n &amp; (n – 1)) == 0)</p><p>Ответ</p><h2>Задачи на логику и математику</h2><p>Дано 100-этажное здание. Если яйцо сбросить с высоты N-го этажа (или с большей высоты), оно разобьется. Если его бросить с любого меньшего этажа, оно не разобьется. У вас есть два яйца. Найдите N за минимальное количество бросков.</p><p>Ответ</p><p>Продолжаем задачки по С/С++. Что означает ключевое слово volatile и в каких ситуация оно может быть применено? Если даже помните формальное значение, попробуйте привести пример ситуации, где volatile на самом деле будет полезно.</p><p>Ответ</p><p>У вас есть отсортированная матрица размера MxN. Предложите алгоритм поиска в ней произвольного элемента. Под отсортированной матрицей будем понимать такую матрицу, строки и столбцы которой отсортированы (см. пример).</p><p>Ответ</p><p>Напишите метод, находящий максимальное из двух чисел, не используя операторы if-else или любые другие операторы сравнения.</p><p>Ответ</p><p>На пустынном шоссе вероятность появления автомобиля за 30-минутный период составляет 0.95. Какова вероятность его появления за 10 минут?</p><p>Ответ</p><p>Напишите функцию суммирования двух целых чисел без использования «+» и других арифметических операторов.</p><p>Ответ</p><p>У вас есть парк из 50 грузовиков. Каждый из них полностью заправлен и может проехать 100 км. Как далеко с их помощью вы можете доставить определенный груз? Что будет, если в вашем распоряжении N грузовиков?</p><p>Не все понимают сразу о чем речь: территориально это место, где нет никаких заправочных станций. Единственное место, где можно здесь найти горючее – это топливные баки грузовиков. Пересесть из грузовика в гибридный легковой автомобиль Prius нельзя. Бросить грузовик без топлива, где бы это ни случилось, и без водителя – в порядке вещей. И единственное, что здесь важно, – доставить как можно дальше ценный груз.</p><p>Ответ</p><p>Опишите алгоритм для нахождения миллиона наименьших чисел в наборе из миллиарда чисел. Память компьютера позволяет хранить весь миллиард чисел. Если придумали какое-либо решение, то оцените его эффективность по времени. Есть ли более эффективное решение?</p><p>Ответ</p><p>Напишите метод, который будет подсчитывать количество цифр «2», используемых в десятичной записи целых чисел от 0 до n (включительно). Картинка дана в качестве подсказки к одному из возможных решений.</p><p>Ответ</p><p>Где вы будете плыть быстрее — в воде или сиропе?</p><p>Это классическая задача с долгой историей, которую обсуждал в своё время еще Исаак Ньютон. Когда-то она использовалась и на IT-собеседованиях в Google (сейчас — <a href="http://habrahabr.ru/post/184008/">нет</a>). Тем не менее предлагаем вам порассуждать над решением.</p><p>Ответ</p><p>Напишите методы для умножения, вычитания и деления целых чисел, используя из арифметических операций только оператор суммирования. Язык реализации не важен, об оптимизации скорости работы и использования памяти также можете не особо беспокоиться. Главное, что можно использовать только сложение. В подобных задачах полезно вспомнить суть математических операций.</p><p>Ответ</p><p>Допустим, вы пишете конвейер, в котором 2 потока, используя общий буфер, обрабатывают данные. Поток-producer эти данные создает, а поток-consumer их обрабатывает (Producer–consumer problem). Следующий код представляет собой самую простую модель: с помощью std::thread мы порождаем поток-consumer, a создавать данные мы будем в главном потоке.</p><p>Опустим механизмы синхронизации двух потоков, и обратим внимание на функцию main(). Попробуйте догадаться, что с этим кодом не так, и как его исправить?</p><p>Ответ</p><p>Дано 20 баночек с таблетками. В 19 из них лежат таблетки весом 1 г, а в одной – весом 1.1 г. Даны весы, показывающие точный вес. Как за одно взвешивание найти банку с тяжелыми таблетками?</p><p>Ответ</p><p>Дана шахматная доска размером 8×8, из которой были вырезаны два противоположных по диагонали угла, и 31 кость домино; каждая кость домино может закрыть два квадратика на поле. Можно ли вымостить костями всю доску? Дайте обоснование своему ответу.</p><p>Ответ</p><p>Дан входной файл, содержащий четыре миллиарда целых 32-битных чисел. Предложите алгоритм, генерирующий число, отсутствующее в файле. Имеется 1 Гбайт памяти для этой задачи. Дополнительно: а что если у вас всего 10 Мбайт? Количество проходов по файлу должно быть минимальным.</p><p>Ответ</p><p>Предложите алгоритм, генерирующий все корректные комбинации пар круглых скобок. Под корректными комбинациями пар будем понимать правильно открытые и закрытые скобки. На вход подаётся число пар скобок, на выходе должны быть все возможные их комбинации в виде набора строк.</p><p>Ответ</p><p>Вы поставили стакан воды на диск проигрывателя виниловых пластинок и медленно увеличиваете скорость вращения. Что произойдет раньше: стакан сползет в сторону, стакан опрокинется, вода расплескается?</p><p>Этот вопрос задавали ранее на собеседованиях в Apple. При ответе рассмотрите возможные варианты и укажите, от чего зависит ответ, если их несколько.</p><p>Ответ</p><p>Короткая задачка по С++ в виде вопроса для новичков. Почему деструктор полиморфного базового класса должен объявляться виртуальным? Полиморфным считаем класс, в котором есть хотя бы одна виртуальная функция.</p><p>Ответ</p><p>Напишите функцию, меняющую местами значения переменных, не используя временные переменные. Предложите как можно больше вариантов.</p><p>Ответ</p><h2>Задачи на алгоритмы</h2><p>Предложите алгоритм поиска в односвязном списке k-го элемента с конца. Список реализован вручную, есть только операция получения следующего элемента и указатель на первый элемент. Алгоритм, по возможности, должен быть оптимален по времени и памяти.</p><p>Ответ</p><p>Напишите функцию, определяющую количество битов, которые необходимо изменить, чтобы из целого числа А получить целое число B. Числа, допустим, 32-битные, язык любой.</p><p>Это одна из типичных задач на работу с битами, которые любят давать на собеседовании. Если вы никогда с ними не сталкивались, вам будет сложно сразу решить задачу с учётом стрессовой ситуации, поэтому запомните использованные при решении трюки.</p><p>Ответ</p><p>В книге N страниц, пронумерованных как обычно от 1 до N. Если сложить количество цифр, содержащихся в каждом номере страницы, будет 1095. Сколько страниц в книге?</p><p>Ответ</p><p>Задачка по С++, которая, тем не менее, будет полезна и для других языков. Сопоставьте хэш-таблицу и mар из стандартной библиотеки шаблонов (STL). Как организована хэш-таблица? Какая структура данных будет оптимальной для небольших объемов данных?</p><p>Ответ</p><p>Разработайте класс, обеспечивающий блокировку так, чтобы предотвратить возникновение <a href="https://ru.wikipedia.org/wiki/%D0%92%D0%B7%D0%B0%D0%B8%D0%BC%D0%BD%D0%B0%D1%8F_%D0%B1%D0%BB%D0%BE%D0%BA%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0">мертвой блокировки</a>.</p><p>Ответ</p><p>Напишите функцию на С++, выводящую в стандартный поток вывода K последних строк файла. При этом файл очень большой, допустим 50 ГБ, длина каждой строки не превышает 256 символов, а число K &lt; 1000.</p><p>Ответ</p><p>Дан кусок сыра в форме куба и нож. Какое минимальное количество разрезов потребуется сделать, чтобы разделить этот кусок на 27 одинаковых кубиков? А на 64 кубика? После каждого разреза части можно компоновать как угодно.</p><p>Такую задачку раньше часто давали на собеседованиях, а придумана она была ещё в 1950 году.</p><p>Ответ</p><p>Реализуйте метод, определяющий, является ли одна строка перестановкой другой. Под перестановкой понимаем любое изменение порядка символов. Регистр учитывается, пробелы являются существенными.</p><p>Ответ</p><p>В тёмной комнате вам вручают колоду карт, в которой известное количество карт N лежат рубашкой вверх, а остальные — вниз. Вы не можете видеть карты, но можете их переворачивать. Как вы разделите колоду на две стопки, чтобы в каждой из них было одинаковое число карт, лежащих рубашкой вверх?</p><p>Эта головоломка в своё время была популярна в JP Morgan Chase. Понятное дело, оказавшись в темноте, вы просто достанете сотовый телефон и воспользуетесь экраном как фонариком. Однако эта задачка появилась до эпохи сотовых телефонов, и её можно решить, даже не видя карт.</p><p>Ответ</p><p>Реализуйте вручную стек со стандартными функциями push/pop и дополнительной функцией min, возвращающей минимальный элемент стека. Все эти функции должны работать за O(1). Решение оптимизируйте по использованию памяти.</p><p>Ответ</p><p>У скольких целых чисел, лежащих в диапазоне от 1 до 1000, есть цифра 3? Посчитать нужно без использования компьютера, приведя свои рассуждения в комментариях.</p><p>Ответ</p><p>У вас есть много URL-адресов, порядка 10 миллиардов. Как бы вы организовали эффективный поиск дубликатов, учитывая, что все они, конечно же, не поместятся в памяти?</p><p>Ответ</p><p>Вы должны выбрать одну из двух ставок. При первом варианте вы должны забросить баскетбольный мяч в корзину за один бросок. Если попадёте, то получите 50 тыс. рублей. Во втором варианте вам надо попасть два раза из трёх бросков, и тогда вы также получите те же 50 тыс. рублей. Какой из этих вариантов вы предпочтёте? Будет ли ваше умение забрасывать мячи влиять на выбор?</p><p>Ответ</p><p>Представьте себе треугольник, составленный из чисел. Одно число расположено в вершине. Ниже размещено два числа, затем три, и так до нижней грани. Вы начинаете на вершине, и нужно спуститься к основанию треугольника. За каждый ход вы можете спуститься на один уровень и выбрать между двумя числами под текущей позицией. По ходу движения вы «собираете» и суммируете числа, которые проходите. Ваша цель — найти максимальную сумму, которую можно получить из различных маршрутов.</p><p>Какой алгоритм вы предложите? Какая у него будет сложность и можно ли предложить лучший вариант?</p><p>Ответ</p><p>Даны два слова или фразы, и ваша задача — проверить, являются ли они анаграммами.</p><p>Анаграмма — это игра со словами, когда в результате перестановки букв слова или фразы получаем другое слово или фразу. Два слова являются анаграммами, если мы можем получить одно из другого переставляя буквы местами.</p><p>Ответ</p><p>Предложите алгоритм, который обнуляет столбец N и строку M матрицы, если элемент в ячейке (N, M) нулевой. Конечно же, нужно минимизировать затраты памяти и время работы.</p><p>Ответ</p><p>Разработайте алгоритм, обнаруживающий в массиве все пары целых чисел, сумма которых равна заданному значению.</p><p>Ответ</p><p>Предположим, вам нужно разработать алгоритм, демонстрирующий круг знакомств человека для социальных сетей. Как бы вы это сделали, при условии, что база очень большая?</p><p>Под большой базой подразумевается порядка миллиарда зарегистрированных пользователей и не менее 100 миллиардов «дружеских» связей между ними.</p><p>Ответ</p><h2>Задачи на графы и списки</h2><p>Допустим, у вас есть однонаправленный список с петлёй. Его «последний» элемент содержит указатель на один из элементов этого же списка, причём не обязательно на первый. Ваша задача — найти начальный узел петли.</p><p>Элементы списка менять нельзя, память можно использовать только константную.</p><p>Ответ</p><p>На острове существует правило — голубоглазые люди не могут там находиться. Самолет улетает с острова каждый вечер в 20:00. Все жители собираются за круглым столом ежедневно, каждый человек может видеть цвет глаз других людей, но не знает цвет собственных. Никто не имеет права сказать человеку, какой у него цвет глаз. На острове находится не менее одного голубоглазого человека. Сколько дней потребуется, чтобы все голубоглазые уехали?</p><p>Ответ</p><p>Напишите код, удаляющий дубликаты из несортированного связного списка. Можно использовать только константную память.</p><p><a></a></p><p>Ответ</p><p>Напишите метод, тасующий карточную колоду. Колода должна быть идеально перемешана т.е. перестановки карт должны быть равновероятными. Вы можете использовать идеальный генератор случайных чисел.</p><p>Ответ</p><p>Допустим, вам поручили задачу по разработке поискового робота — программы, которая, грубо говоря, посещает страницы в Интернете, индексирует, выделяет из них ссылки, переходит по ним и повторяет процесс. Вопрос: как избежать зацикливания?</p><p>Ответ</p><p>У вас есть стеклянный кувшин, в котором лежат небольшие шарики, и вы в любое время можете определить их количество. Вы со своим другом играете в следующую игру: каждый из вас по очереди забирает из кувшина 1 или 2 шарика. Игрок, который забирает последний шарик, выигрывает. Какая самая лучшая стратегия в этой игре? Можете ли вы в самом начале предсказать, кто выиграет?</p><p>Ответ</p><p>Имеется N компаний, и вы хотите, чтобы они слились и образовали одну крупную компанию. Сколько разных способов вы можете использовать для этого? Поглощение можно считать частным случаем слияния, когда А поглощает Б и Б полгощает А — два разных способа. Равнозначные слияния тоже возможны.</p><p>Ответ</p><p>Какой минимальный комплект монет необходим для того, чтобы выдать любую сдачу от 1 до 99 центов? Доступные номиналы монет: 1, 5, 10, 25, 50 центов и 1 доллар.</p><p>Ответ</p><p>У вас есть 25 лошадей. Сколько забегов вам нужно устроить, чтобы определить трех самых быстрых из них? Вы не можете пользоваться секундомером. В каждом заезде могут участвовать только пять лошадей.</p><p>Ответ</p><p>Короткая задачка на сообразительность. По результатам исследования известно, что 70% людей любят кофе, в то же время 80% любят чай. Каковы верхние и нижние границы доли людей, которые одновременно любят кофе и чай?</p><p>Ответ</p><p>Задачка, которую нужно решать без калькулятора и компьютера, имея под рукой только карандаш и бумагу. Сколько нулей в конце факториала 100?</p><p>Ответ</p><p>Предложите алгоритм нахождения самой большой суммы непрерывной последовательности из массива целых чисел, как положительных, так и отрицательных.</p><p>Ответ</p><p>Напишите программу расчета значения медианы в потоке чисел, динамически отслеживающую новые поступающие числа, получаемые рандомом.</p><p>Ответ</p><p>Идет дождь, а вам надо добраться до вашей машины, которая стоит в самом дальнем конце парковки. Побежите ли вы к ней или нет, если ваша цель — как можно меньше промокнуть? Как вы будете себя вести, если у вас есть зонтик?</p><p>Ответ</p><p>Представьте, что существует квадратная матрица, каждый пиксель которой может быть черным или белым. Разработайте алгоритм поиска максимального субквадрата, у которого все стороны черные.</p><p>Разбор <a href="https://tproger.ru/problems/max-black-bordered-submatrix/">двух вариантов решения</a> за O(N^4) и O(N^3). Можете ли вы найти другие варианты?</p><p>Ответ</p><p>Предположим, в некоторый бар ходят только необщительные посетители. Вдоль барной стойки расположены 25 мест. Всякий раз, когда входит новый посетитель, он обязательно садится на самое дальнее, насколько это возможно, место от остальных гостей. Ни один не сядет рядом с кем-то другим: если посетитель входит и видит, что «свободных» мест нет, он тут же разворачивается и уходит из бара. Бармену, естественно, хочется, чтобы за стойкой сидело как можно больше клиентов. Если ему разрешено усадить первого посетителя на любое место, куда выгоднее его посадить с точки зрения бармена?</p><p>Ответ</p><p>Опишите, как можно использовать один одномерный массив для реализации трех стеков.</p><p>Ответ</p><p>У вас есть неограниченное количество монет достоинством 25, 10, 5 и 1 цент. Напишите код, определяющий количество способов представления n центов.</p><p>Ответ</p><p>Напишите код, который позволяет найти минимальное расстояние (выражаемое количеством слов) между любыми двумя словами в файле. Порядок не важен.</p><p>Достаточно ли будет линейного времени?<br />Сколько памяти понадобится для решения?</p><p>Ответ</p><p>Смоделируйте использование игральной кости с семью гранями, если в вашем распоряжении имеется только кость с пятью гранями.</p><p>Иными словами, как получить случайное число в диапазоне от 1 до 7, используя генератор случайных целых чисел от 1 до 5?</p><p>Ответ</p><h2>Задачи на строки и массивы</h2><p>Напишите код, разбивающий связный список вокруг некоторого значения так, чтобы все меньшие узлы оказались перед узлами, большими или равными этому значению.</p><p>Ответ</p><p>Напишите метод, генерирующий случайную последовательность m целых чисел из массива размером n. Все элементы выбираются с одинаковой вероятностью.</p><p>Первое, что приходит в голову, — выбрать случайные элементы из массива и поместить их в новый массив. Но что если мы выберем один и тот же элемент дважды?</p><p>Ответ</p><p>Представьте себе робота, находящегося в левом верхнем углу сетки с координатами (X, Y). Робот может перемещаться в двух направлениях: вправо и вниз. Сколько существует маршрутов, проходящих от точки (0, 0) до точки (X, Y)?</p><p>Дополнительно предположите, что на сетке существуют области, которые робот не может пересекать. Разработайте алгоритм построения маршрута от левого верхнего до правого нижнего угла.</p><p>Ответ</p><p>Реализуйте метод сжатия строки на основе счетчика повторяющихся символов. Например, строка aabcccccaaa должна превратиться в а2b1с5аЗ. Если «сжатая» строка оказывается длиннее исходной, метод должен вернуть исходную строку.</p><p>Ответ</p><p>Вы находитесь в автомобиле, где к полу веревочкой привязан шар, наполненный гелием. Окна закрыты. Вы нажимаете на педаль газа. Что произойдет с шаром: переместится он вперед, назад или останется в прежнем положении?</p><p><a></a></p><p>Ответ</p><p>Задачка, на примере который можно кратко ознакомиться с основами RSA-криптографии.</p><p>Допустим, вы хотите удостовериться, что у вашего друга Пети есть номер вашего телефона. Но вы не можете спросить его об этом прямо. Вам придется написать ему сообщение на карточке и отдать карточку Кате, которая будет выступать в качестве посредника. Катя отнесет карточку Пете, он напишет свое сообщение и отдаст его Кате, которая передаст его вам. Вы не хотите, чтобы Катя узнала ваш номер телефона. Как в таких обстоятельствах следует сформулировать свой вопрос Пете?</p><p>Даже не зная ничего про RSA можно попробовать придумать ответ.</p><p>Ответ</p><p>Задача на знание конкретных языков. Объясните разницу между шаблонами в C++ и дженериками в Java.</p><p>Многие программисты полагают, что шаблоны C++ и дженерики (например в Java) — это одно и то же, ведь их синтаксис похож: в обоих случаях можно написать что-то вроде List&lt;T&gt;. Но различия на самом деле есть.</p><p>Ответ</p><p>Реализуйте вручную «умный» указатель с автоматическим управлением памятью на C++.</p><p>Умный (интеллектуальный) указатель — это тот же обычный указатель, обеспечивающий безопасность благодаря автоматическому управлению памятью. Такой указатель помогает избежать множества проблем: «висячие» указатели, «утечки» памяти и отказы в выделении памяти. Интеллектуальный указатель должен подсчитывать количество ссылок на указанный объект.</p><p>На первый взгляд эта задача кажется довольно сложной, особенно если вы не эксперт в C++.</p><p>Ответ</p><p>Эта головоломка, в которой вас пытаются запутать, предложив поменять свое решение, известна также под именем «Парадокс Монти Холла». Монти Холл был первым ведущим телевизионной игры-шоу «<a href="https://en.wikipedia.org/wiki/Let%27s_Make_a_Deal">Давайте заключим сделку</a>»</p><p>Перед вами три коробки, в одной из которых находится ценный приз, в двух других ничего нет. Вы можете выбрать любую коробку, но вам по-прежнему неизвестно, в какой именно приз. Одну из двух не выбранных вами коробок открывают и показывают, что она пустая. Теперь вы можете или оставить коробку, которую вы первоначально выбрали (оставить), или поменять ее на другую, неоткрытую (заменить). Что вы предпочтете сделать (оставить или заменить)?</p><p>Ответ</p><p>У вас есть пустое помещение и группа людей снаружи. За один ход вы можете либо позволить одному человеку войти в помещение, либо выпустить из него одного человека. Можете ли вы предложить серию ходов, при которой каждая возможная комбинация людей находится в помещении только один раз?</p><p>Нужно время, чтобы понять, чего именно хочет от вас интервьюер. Разобраться в этом помогает простой пример. Скажем, за порогом находятся два человека, Ларри и Сергей. Возможны четыре комбинации их присутствия в комнате, учитывая тот случай, когда в комнате вообще никого нет.</p><p>Вот они:</p><ul><li>В помещении никого нет.</li><li>В помещении только Ларри.</li><li>В помещении только Сергей.</li><li>В помещении Ларри и Сергей.</li></ul><p>Вопрос заключается в том, можем ли мы начать с того, что в комнате никого нет, а затем пройти указанную последовательность шагов?</p><p>Иными словами, как сгенерировать неповторяющиеся комбинации, меняя только один элемент за раз?</p><p>Ответ</p><p>Напишите код поиска субматрицы с максимально возможной суммой в матрице N*N, содержащей положительные и отрицательные числа.</p><p>Ответ</p><p>Сложная задача, требующая умения придумывать алгоритмы.</p><p>По условию требуется разработать алгоритм, позволяющий найти k-e число из упорядоченного числового ряда, в разложении элементов которого на простые множители присутствуют только 3, 5 и 7.</p><p>Решение с примерами кода на Java есть у нас на сайте.</p><p>Решение с примерами кода</p><p>Дан список из миллиона слов. Разработайте алгоритм, создающий максимально возможный прямоугольник из букв так, чтобы каждая строка и каждый столбец образовывали слово (при чтении слева направо и сверху вниз). Слова могут выбираться в любом порядке, строки должны быть одинаковой длины, а столбцы — одинаковой высоты.</p><p>Ответ</p><p>Дан массив с числами типа Integer. Вам нужно написать функцию, которая на входе получит исходный массив, а на выходе вернет массив, в котором каждое значение получено путем произведения всех значений исходного массива с отличным от текущего индексом.</p><p>Для ясности приведем пример. Допустим, исходный массив имеет вид:</p><p>Тогда функция должна вернуть:</p><p>Расчет значений происходит следующим образом:</p><p>Дополнительные условия:</p><ul><li>Нельзя использовать деление.</li><li>Функция должна быть с наименьшими затратами памяти и времени выполнения.</li></ul><p>Ответ</p><h2>Задачи на рассуждение</h2><p>Задача на умение рассуждать. Конкретный ответ не важен, важно показать как вы мыслите. Представьте, что вам необходимо добраться из точки A в точку B, но вы не знаете, как. Как вы будете действовать?</p><p>Ответ</p><p>Представьте, что вам дали задание разработать план эвакуации большого города (в классическом варианте — Сан-Франциско). С чего вы начнете?</p><p>Ответ</p><p>Задача, которую предлагали на собеседованиях в Apple: у вас есть массив с целыми числами, в том числе и отрицательными, вам нужно найти самое большое произведение 3 чисел из этого массива.</p><p>Например: у вас есть массив list_of_ints, содержащий числа -10, -10, 1, 3, 2. Функция, которая обрабатывает этот массив, должна вернуть 300, так как -10 * -10 * 3 = 300. Задание нужно выполнить максимально эффективно, не забывая учесть отрицательные числа.</p><p>Ответ</p><p>Представьте страну, где все родители хотят иметь мальчика. Каждая семья продолжает рожать детей до тех пор, пока у них не появляется мальчик, а затем останавливается. Каково соотношение мальчиков и девочек в этой стране?</p><p>Игнорируйте ситуации, когда рождаются двойняшки, тройняшки и так далее, пары, не имеющие детей, и пары, умершие до того, как у них появится мальчик.</p><p>Как обычно, предлагаем порассуждать над решением в комментариях. Проверить свой ответ можно на сайте по прикреплённой ссылке, там мы даём наш вариант решения.</p><p>Ответ</p><p>Задачи на прикидку, то есть подразумевающие приближенное решение — популярный класс задач, которые предлагают на собеседованиях в IT компании. Предлагаем вам несколько таких задач, а также <a href="https://tproger.ru/problems/fermi/">рассказ</a> об общих методах их решения и <a href="https://tproger.ru/problems/fermi/#cheats">конкретные советы</a> для собеседований.</p><p>Сколько флаконов шампуня производится в мире за год? Ответ</p><p>Сколько насечек на ребре четвертака — монеты в 25 центов? Ответ</p><p>Сколько будет 2 в 64 степени? Ответ</p><p>Сколько туалетной бумаги потребуется, чтобы покрыть ею весь штат? Ответ</p><p>Сколько атомов резины стираются с шины автомобильного колеса при каждом его обороте? Ответ</p><p>Cколько денег понадобится на мытье всех окон в Сиэтле? Ответ</p><p>Также смотрите <a href="https://tproger.ru/problems/fermi/#problems">примеры других задач</a> для самостоятельного решения.</p><p>Задача, которую давали на собеседованиях в Apple. От вас требуется написать функцию, которая возвращает максимальную прибыль от одной сделки с одной акцией (сначала покупка, потом продажа). Исходные данные — массив вчерашних котировок stock_prices_yesterday с ценами акций Apple.<br />Информация о массиве:</p><ul><li>Индекс равен количеству минут с начала торговой сессии (9:30 утра).</li><li>Значение в массиве равно стоимости акции в это время.</li></ul><p>Например: если акция в 10:00 утра стоила 20 долларов, то<br />stock_prices_yesterday[30] = 20.</p><p>Допустим, имеем некоторые условия:</p><p>Массив может быть любым, хоть за весь день. Нужно написать функцию get_max_profit как можно эффективнее — с наименьшими затратами времени выполнения и памяти.</p><p>Ответ</p><p>Задача про слияние промежутков в календаре.</p><p>Предположим, компания, в которой вы работаете, разрабатывает электронный календарь. В календаре есть функция, показывающая, когда различные команды программистов будут заняты на какой-либо встрече.</p><p>Те периоды, когда команда занята, на календаре отмечены как диапазоны времени, например, с 10:00 до 12:30 или с 12:30 до 13:00. В разрабатываемой программе промежуток времени представлен в виде <a href="https://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D1%80%D1%82%D0%B5%D0%B6_(%D0%B8%D0%BD%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%82%D0%B8%D0%BA%D0%B0)">кортежей</a> из двух целых чисел. Число означает номер 30-минутного блока, который идет после 9:00 утра. Например, кортеж (2, 4) означает диапазон с 10:00 до 11:00, а (0, 1) — это промежуток 9:00-9:30.</p><p>Вам нужно написать функцию, которая должна упростить вывод информации таким образом, что если команда занята в промежутках с 10:00 до 12:30 и с 12:30 до 13:00, то это отображалось как 10:00‒13:00. Например: на входе вашей функции неупорядоченный массив из кортежей [(0, 1), (3, 5), (4, 8), (10, 12), (9, 10)], а на выходе вы должны получить упорядоченный массив [(0, 1), (3, 8), (9, 12)].</p><p>В будущем планируется внести изменения в программу, где вместо 30-минутных блоков будут минутные, как это реализовано в представлении <a href="https://ru.wikipedia.org/wiki/UNIX-%D0%B2%D1%80%D0%B5%D0%BC%D1%8F">Unix-времени</a>. С учетом этого изменения нужно, чтобы ваша функция уже сейчас могла работать с большими числами. Еще не забудьте, что кортеж — это такой тип данных, в котором содержимое переменной невозможно изменять после ее создания.</p><p>Ответ</p><p>Задача, которую давали на собеседованиях в Apple. Представьте, что вы получили работу кассира в магазине. Ваш босс случайно выяснил, что вы обладаете навыками программиста, и захотел, чтобы вы помогли ему написать программу.</p><p>Входные данные:</p><ol><li>Указанная сумма денег.</li><li>Массив со всеми доступными номиналами монет.</li></ol><p>Нужно написать функцию, которая на выходе выдаст количество всех возможных способов получить указанную сумму денег при помощи различных доступных номиналов монет. Например, если вам нужно получить 4 цента из монет номиналами 1, 2 и 3 цента, то функция вернет 4 — именно столько есть возможных комбинаций из чисел 1, 2 и 3, чтобы получить в сумме 4:</p><ol><li>1, 1, 1, 1.</li><li>1, 1, 2.</li><li>1, 3.</li><li>2, 2.</li></ol><p>Ответ</p><p>Эту задачу когда-то давали в Google.</p><p>Вам нужно подняться по лестнице. За один раз можно подняться на одну или две ступеньки. Сколько существует способов добраться до N-й ступеньки?</p><p>Ответ</p><p>Эту задачу <a href="https://web.archive.org/web/20160402060709/https://medium.com/@bearsandsharks/i-failed-a-twitter-interview-52062fbb534b">задавали</a> на собеседовании в Twitter.<br />Рассмотрим следующую картинку:</p><figure><img src="https://media.tproger.ru/uploads/2016/05/1-9BE6dgt1cTDOHZSON7mlzQ.jpeg" alt="" /></figure><p>На этой картинке изображены стены различной высоты в некотором плоском мире. Картинка представлена массивом целых чисел, где индекс — это точка на оси X, а значение каждого индекса — это высота стены (значение по оси Y). Картинке выше соответствует массив [2, 5, 1, 2, 3, 4, 7, 7, 6].</p><p>Теперь представьте, что начался дождь, который не прекращается и поливает стены сверху равномерным потоком. Сколько воды соберется в «лужах» между стенами?</p><figure><img src="https://media.tproger.ru/uploads/2016/05/1-MKQZbWOdLPK-DD10Y48fkQ.jpeg" alt="" /></figure><p>задача про стены и дождь, собеседование в Twitter</p><p>Единицей объема воды считаем квадратный блок 1×1. На картинке выше всё, что расположено слева от точки 1, выплескивается. Вода справа от точки 7 также прольется. У нас остается лужа между 1 и 6 — таким образом, получившийся объем воды равен 10.</p><p>Ответ</p><h2>Задачи на нестандартное мышление</h2><p>Задача про бесконечный поезд.</p><p>Представьте себе замкнутую по окружности железную дорогу. По ней едет поезд, последний вагон которого скреплён с первым так, что внутри можно свободно перемещаться между вагонами. Вы оказались в одном случайном вагоне и ваша задача — подсчитать их общее количество. В каждом вагоне можно включать или выключать свет, но начальное положение переключателей случайное и заранее неизвестно.</p><p>Все вагоны внутри выглядят строго одинаково, окна закрыты так, что невозможно посмотреть наружу, движение поезда равномерное. Помечать вагоны как-либо, кроме включения или выключения света, нельзя. Количество вагонов конечно (не верьте названию задачи).</p><p>Ответ</p><p>Вы стоите перед закрытой комнатой, в которой есть три лампочки. На стене перед вами три переключателя: каждый из которых включает или выключает одну из лампочек. Вам нужно узнать, какой переключатель к какой лампочке относится, при условии, что зайти в комнату вы можете только один раз.</p><p>Расположение переключателей случайное, порядок подключения заранее неизвестен. Зайдя в комнату, можно делать с лампочками всё, что угодно, но уже нельзя вернуться к переключателям. Изначально все лампы выключены.</p><p>Если вы хотите решить задачу самостоятельно, но в голову ничего не приходит, можете воспользоваться нашей подсказкой.</p><p>Или смотрите сразу ответ</p><p>Классическая задача. Найдите в данной вам строке максимальную по длине подстроку, которая является палиндромом (то есть читается слева направо и справа налево одинаково). Предложите как можно более эффективный алгоритм.</p><p>Ответ</p><p>Реализуйте функцию извлечения квадратного корня, не пользуясь встроенными в язык средствами нахождения корня и возведения в степень.</p><p>Ответ</p><p>В этой задаче вам необходимо реализовать функцию, которая бы проверяла число на четность, используя только битовые операции AND, OR, NOT.</p><p>Ответ</p><p>На прямой даны N отрезков (в реальной жизни это могут быть промежутки времени, например), которые заданы координатами их левого и правого конца. Для каждого данного отрезка необходимо узнать, сколько из данных отрезков полностью находятся в нем. Один отрезок полностью содержится во втором, если левый конец первого отрезка находится правее левого конца второго отрезка, а правый конец первого находится левее правого конца второго. Предложите как можно более эффективный способ решения этой задачи. Гарантируется, что все концы данных отрезков различны.</p><p>Если вы придумали решение, то написать и проверить его вы можете <a href="http://codeforces.com/contest/652/problem/D">здесь</a>, на codeforces.</p><p>Сможете ли вы решить эффективно данную задачу в случае, если концы отрезков могут совпадать?</p><p>Ответ</p><p>Придумать алгоритм, определяющий, все ли символы в строке встречаются один раз.<br />При выполнении этого задания нельзя использовать дополнительные структуры данных.<br />Ответ</p><p>В массиве случайных чисел A[0…n-1] задан один «волшебный» индекс: такой, что A[i] = i. Значения элементов в массиве повторяться не могут. Учитывая, что массив отсортирован по значениям в порядке возрастания, напишите метод, который определит этот «волшебный» индекс, если он существует в массиве A. Если элемента в массиве нет, верните любое отрицательное число.</p><p>Как изменится решение, если известно, что таких индексов в массиве несколько?</p><p>Ответ</p><p>Как можно узнать количество дней в месяце, зная его номер? Другими словами, опишите, как получить функцию f(x), которая бы давала следующий список значений:</p><p><a href="https://media.tproger.ru/uploads/2016/10/table1.png"></a></p><p>В качестве аргумента мы получаем только номер месяца, т.е. мы не учитываем високосные года, и f(2) = 28.</p><p>Ответ</p><p>Задачка для питонистов: нужно перебрать все пары символов в строке, и остановиться при нахождении двух одинаковых символов.</p><p>Решение достаточно очевидное, но возникает вопрос:</p><p>Если бы мы программировали, например, на Java, то мы могли бы воспользоваться механизмом меток:</p><p>Однако в Python такого механизма нет. Требуется предложить наиболее удобное в использовании и читаемое решение.</p><p>Ответ</p><p>Написать код, который проверяет, пересекутся ли две заданные прямые, лежащие в одной плоскости.<br />Предположим, что нам необходимо разработать структуру данных для хранения информации о прямой, и будем считать, что если две линии совпадают, то они пересекаются.</p><p>Ответ</p><p>Классическая задача: посчитать N-е число последовательности, в которой каждый элемент равен сумме двух предыдущих. Такая последовательность называется последовательностью Фибоначчи: 1, 1, 2, 3, 5, 8…</p><p>Очень часто на разнообразных олимпиадах попадаются задачи вроде этой, которые, как думается на первый взгляд, можно решить с помощью простого перебора. Но если мы подсчитаем количество возможных вариантов, то сразу убедимся в неэффективности такого подхода: например, простая рекурсивная функция, приведенная ниже, будет потреблять существенные ресурсы уже на 30-ом числе Фибоначчи, тогда как на олимпиадах время решения часто ограничено 1-5 секундами.</p><p>Придумайте, как найти N’е число Фибоначчи за приемлемое время.</p><p>Ответ</p><p>Чтобы разобраться в теме, рекомендуем почитать нашу <a href="https://tproger.ru/articles/dinprog-starters/">статью про динамическое программирование</a> для начинающих.</p><h2>Задачи на программирование</h2><p>Одна из самых известных задач Интернета, будоражащая многие светлые умы человечества.</p><p>Самолет стоит на взлетной полосе с подвижным покрытием типа транспортера. Покрытие может двигаться против направления взлета самолета, то есть ему навстречу. Транспортер автоматически регулирует свою скорость таким образом, чтобы самолет оставался неподвижным. Вопрос: сможет ли самолет в таких условиях взлететь?</p><p><a href="https://media.tproger.ru/uploads/2016/11/x_06ad251d.jpg"></a></p><p>Ответ</p><p>Задача на перегрузку функций в C++, которая может оказаться сложнее, чем выглядит.</p><p>Предположим, у нас есть два класса:</p><p>Что выведут два следующих куска кода и почему?</p><p>Ответ</p><p>Рассмотрим ситуацию, когда три работника хотят вычислить свою среднюю зарплату при условии, что каждый знает свою зарплату, но не может сообщить ее другому напрямую. Обмен информации между людьми возможен, но передаваемые друг другу сообщения не должны содержать какую-либо конкретную информацию об уровне зарплат. Как это сделать?</p><p>Ответ</p><p>Пусть у нас есть массив положительных чисел, в котором все числа, кроме трех, встречаются по 2 раза, а эти три числа отличны от всех остальных и встречается каждое ровно по одному разу. Нужно найти эти три числа. Числа помещаются в 32-битный целочисленный тип.</p><p>Ответ</p><p>Положим, у нас есть некоторая конечная последовательность чисел и мы имеем итератор, указывающий на первый элемент. Мы можем при помощи итератора посмотреть значение текущего элемента и перейти к следующему элементу. Требуется построить такой алгоритм выбора случайного элемента из этой последовательности, чтобы каждый элемент мог оказаться выбранным с равной вероятностью.</p><p>Ограничения: мы можем использовать O(1) дополнительной памяти и не можем создавать новый итератор. Можно пользоваться функцией генерации случайного числа от [0;1).</p><p>Ответ</p><p>Известная задача с IT-собеседований с несколькими вариантами решения: как правильно реализовать обмен значений переменных?</p><p>Ответ</p><p>На одной стороне реки находятся три человека и три льва. Все они должны оказаться на другом берегу реки. Есть лишь одна лодка, в которой могут поместиться лишь два живых существа одновременно (человека или льва). Вы не можете оставлять на том или другом берегу реки больше львов, чем людей, так как в этом случае животные съедят людей, оставшихся в меньшинстве. Как вы переправите всех через реку?</p><p>Ответ</p><p>Если бы вы получили стопку монет достоинством в один пенс каждая и высотой с Эмпайр-стейт-билдинг, поместились бы все эти деньги в одном помещении?</p><p>Сперва может показаться, что это одна из тех головоломок, в которых предполагается оценить какое-то абсурдное число. Но на самом деле это не так, подумайте хорошенько.</p><p>Ответ</p><h2>Часто задаваемые вопросы</h2><h3>Какие задачи дают на IT-собеседованиях?</h3><p>Чаще всего дают алгоритмические задачи, задачи на структуры данных и логические головоломки.</p><h3>Как подготовиться к интервью?</h3><p>Повторите алгоритмы, решайте задачи на LeetCode, практикуйтесь объяснять решение вслух.</p><h3>На каком языке решать задачи?</h3><p>Python популярен благодаря краткому синтаксису. Java и C++ тоже часто используются.</p><p>Также рекомендуем по теме:</p><ul><li><a href="https://tproger.ru/digest/competitive-programming-practice/">28 cайтов с задачами по программированию</a></li><li><a href="https://tproger.ru/translations/top-ten-interview-preparation-mistakes/">Десять наиболее частых ошибок программистов при подготовке к собеседованию</a></li><li><a href="https://tproger.ru/problems/string-algorithms/">Подборка полезных алгоритмов для собеседований: задачи на строки</a></li><li><a href="https://tproger.ru/problems/technocup-problems-2017/">14 алгоритмических задач с разбором решений по итогам «Технокубка» 2017</a></li><li><a href="https://tproger.ru/problems/technocup-final-solutions/">Олимпиада «Технокубок»: разбор задач финального раунда</a></li><li><a href="https://tproger.ru/problems/russian-code-cup-2017/">Разбираем решения задач предварительного тура Russian Code Cup</a></li></ul>]]></content:encoded>
    </item>
  </channel>
</rss>