Code Monkey home page Code Monkey logo

yadro-containers-and-balls-problem's Introduction

Тестовое задание на позицию «Инженер-стажёр по разработке ПО для систем хранения данных на Go»

Содержание

  1. Алгоритм решения
  2. Доказательство решения
    1. Инвариант
    2. Условия отсортированных шаров
    3. Условие (4)
    4. Доказательство

Алгоритм решения

Всё очень просто.

  1. Из входных данных сформируем два массива. Массив в котором хранится количество шаров для каждого цвета (под i-ым индексом лежит количество шаров i+1-ого цвета). И массив в котором хранится количество шаров для каждого контейнера (под i-ым индексом лежит количество шаров в i+1-ом контейнере).

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

  3. Проверим, что сопоставленные в массивах значения равны.

Если это выполняется, то шары можно отсортировать. Иначе нет (не выполняется условие (4)).

Доказательство решения

Инвариант


Количество шаров в любом контейнере не изменяется при выполнении операции swap

Условия отсортированных шаров


  1. В каждом контейнере лежат лишь шары одинакового цвета
  2. Каждый цвет лежит лишь в одном контейнере

Из условия (1) следует, что каждому контейнеру соответствует цвет шара. Из условия (2) следует, что каждому цвету соответствует контейнеру.

Таким образом можно построить взаимно однозначное соответствие между цветом шара и контейнером. (3)

Из инварианта и (3) легко увидеть, что количество шаров одного цвета должно быть равно количеству шаров в соответствующем цвету контейнере. Или же для любого цвета существует контейнер количество шаров в котором равно количеству шаров выбранного цвета. (4)

Можно доказать, что при выполнении условия (4) мы всегда можем отсортировать шары так, чтобы выполнялись условия (1) и (2).

Доказывать будем по принципу математической индукции: где n - количество контейнеров, а m - количество шаров (m >= n)

База индукции n = 1, 2


1 контейнер(1 цвет)


Очевидно, что шары отсортированы.

2 контейнера (2 цвета).-


Пусть шары в контейнерах лежат в перемешку (иначе шары отсортированы). Из условия (4) нам известно, что есть контейнер в котором лежат шары, количество которых равно количеству шаров (например) 1-ого цвета. В таком случае просто перемещаем в этот контейнер все шары 1-ого цвета. Очевидно, что это можно сделать. Шары отсортированы. База доказана

Предположение индукции


Мы можем отсортировать все m >= n шаров в n контейнерах.

Шаг индукции. Контейнеров n+1 (n+1 цветов)


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

Также, очевидно, что условие (4) всегда будет выполнятся в отсортированном контейнере.

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

yadro-containers-and-balls-problem's People

Contributors

gerogegol avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.