avva: (Default)
[personal profile] avva
Эта запись будет интересна в основном программистам.

Красивая задачка, которую подкинули во внутренней рассылке:

Отсортируйте пять чисел, используя не более семи сравнений.

(комментарии оставлю скрытыми до завтра)

Update: уточнение условий: складывать/умножать числа не разрешается. Вообще разрешается только сравнивать их друг с другом, а больше никакой информации о них не дано. "Сравнивать", определенности ради, означает применять операцию "<" или ">", на выбор.

Update: открываю все комментарии. Довольно много правильных ответов, найденных с помощью "перебора" в определенном смысле. В этом нет ничего зазорного (и я тоже так решил), но если вы нашли решение таким способом, могу порекомендовать в качестве дополнительного упражнения - найти способ "объяснить" это уже найденное решение более кратким и понятным образом. Такие "простые" решения в комментах тоже есть, но всего два-три.
Page 1 of 4 << [1] [2] [3] [4] >>

Date: 2008-07-16 06:23 pm (UTC)
From: [identity profile] snorapp.livejournal.com
кроме сравнений - любые действия?

Date: 2008-07-16 06:23 pm (UTC)
From: [identity profile] snorapp.livejournal.com
математические, i mean

(no subject)

From: [identity profile] avva.livejournal.com - Date: 2008-07-16 06:28 pm (UTC) - Expand

Date: 2008-07-16 06:46 pm (UTC)
From: [identity profile] torquelimach.livejournal.com
*удивленно* Простите, а что в этом такого? Вы точно уверены, что она будет интересна кому-то старше учеников средней школы?

Сортируем четыре числа, за три сравнения вставляем между ними пятое.

Date: 2008-07-16 07:21 pm (UTC)
From: [identity profile] avva.livejournal.com
А теперь посчитайте, сколько нужно сравнений для сортировки четырех чисел в худшем случае, и сложите.

(no subject)

From: [identity profile] torquelimach.livejournal.com - Date: 2008-07-16 07:40 pm (UTC) - Expand

(no subject)

From: [identity profile] avva.livejournal.com - Date: 2008-07-16 08:23 pm (UTC) - Expand

(no subject)

From: [identity profile] torquelimach.livejournal.com - Date: 2008-07-16 09:25 pm (UTC) - Expand

(no subject)

From: [identity profile] avva.livejournal.com - Date: 2008-07-16 09:35 pm (UTC) - Expand

(no subject)

From: [identity profile] torquelimach.livejournal.com - Date: 2008-07-16 09:45 pm (UTC) - Expand

(no subject)

From: [identity profile] torquelimach.livejournal.com - Date: 2008-07-16 11:07 pm (UTC) - Expand

ой ли?

From: [identity profile] voiza.livejournal.com - Date: 2008-07-17 11:10 am (UTC) - Expand

Re: ой ли?

From: [identity profile] torquelimach.livejournal.com - Date: 2008-07-17 09:39 pm (UTC) - Expand

Re: ой ли?

From: [identity profile] voiza.livejournal.com - Date: 2008-07-18 08:10 am (UTC) - Expand

Date: 2008-07-16 07:03 pm (UTC)
alexeybobkov: (Default)
From: [personal profile] alexeybobkov
Что понимать под сравнением?
Скажем, процессорная команда cmp позволяет получить больше информации, чем простая операция "<".

Date: 2008-07-16 07:23 pm (UTC)
From: [identity profile] avva.livejournal.com
Это, кажется, мелочи, но давайте определенности ради скажем, что это одна из двух операций: < или >, на выбор.

(no subject)

From: [identity profile] amigofriend.livejournal.com - Date: 2008-07-16 07:49 pm (UTC) - Expand

(no subject)

From: [identity profile] avva.livejournal.com - Date: 2008-07-16 08:27 pm (UTC) - Expand

(no subject)

From: [identity profile] ivan-gandhi.livejournal.com - Date: 2008-07-16 11:45 pm (UTC) - Expand

Date: 2008-07-16 07:12 pm (UTC)
From: [identity profile] pierser.livejournal.com
Словами сложно :) проще так:

Пусть есть массив a[5] одного из числовых типов и переменная b того же типа. тогда:

{
if ( a[0] > a[1] )
{
b = a[0];
a[0] = a[1];
a[1] = b;
}

if ( a[2] > a[3] )
{
b = a[2];
a[2] = a[3];
a[3] = b;
}

if ( a[1] > a[3] )
{
b = a[0];
a[0] = a[2];
a[2] = b;
b = a[1];
a[1] = a[3];
a[3] = b;
}

if ( a[1] > a[4] )
{
if ( a[0] > a[4] )
{
if ( a[0] > a[2] )
{
if ( a[4] > a[2] )
{
b = a[0];
a[0] = a[2];
a[2] = b;
b = a[1];
a[1] = a[4];
a[4] = a[3];
a[3] = b;
}
else
{
b = a[0];
a[0] = a[4];
a[4] = a[3];
a[3] = a[1];
a[1] = a[2];
a[2] = b;
}
}
else
{
if ( a[1] >= a[2] )
{
b = a[0];
a[0] = a[4];
a[4] = a[3];
a[3] = a[1];
a[1] = b;
}
else
{
b = a[0];
a[0] = a[4];
a[4] = a[3];
a[3] = a[2];
a[2] = a[1];
a[1] = b;
}
}
}
else
{
if ( a[4] > a[2] )
{
if ( a[0] > a[2] )
{
b = a[0];
a[0] = a[2];
a[2] = a[4];
a[4] = a[3];
a[3] = a[1];
a[1] = b;
}
else
{
b = a[1];
a[1] = a[2];
a[2] = a[4];
a[4] = a[3];
a[3] = b;
}
}
else
{
if ( a[1] >= a[2] )
{
b = a[1];
a[1] = a[4];
a[4] = a[3];
a[3] = b;
}
else
{
b = a[1];
a[1] = a[4];
a[4] = a[3];
a[3] = a[2];
a[2] = b;
}
}
}
}
else
{
if ( a[3] > a[4] )
{
if ( a[1] > a[2] )
{
b = a[3];
a[3] = a[4];
a[4] = b;
if ( a[0] > a[2] )
{
b = a[0];
a[0] = a[2];
a[2] = a[1];
a[1] = b;
}
else
{
b = a[1];
a[1] = a[2];
a[2] = b;
}
}
else
{
if ( a[4] >= a[2] )
{
b = a[3];
a[3] = a[4];
a[4] = b;
}
else
{
b = a[2];
a[2] = a[4];
a[4] = a[3];
a[3] = b;
}
}
}
else
{
if ( a[1] > a[2] )
{
if ( a[0] > a[2] )
{
b = a[0];
a[0] = a[2];
a[2] = a[1];
a[1] = b;
}
else
{
b = a[1];
a[1] = a[2];
a[2] = b;
}
}
}
}
}

Проверить легко, если есть любой компилятор :)

Date: 2008-07-17 07:37 pm (UTC)
From: [identity profile] avva.livejournal.com
Да, кажется, верно, хотя все подробности лень проверять - и если верно, то ваше решение первое :)
Можно еще придумать, как то же описать проще (см. апдейт).

Date: 2008-07-16 07:21 pm (UTC)
From: [identity profile] ivan-gandhi.livejournal.com
Милай мой. Это тест на знание источников.

(Кстати, я одно время задавал эту задачку на интервью; знание источников также приветствовалось, но, к сожалению, ни один интервьюируемый его не проявил.)

Date: 2008-07-17 07:38 pm (UTC)
From: [identity profile] avva.livejournal.com
Да ну, те источники, которые это тестирует, уже давно никто не читает (хорошо это или плохо - но факт). Я, например, этот том не читал, а задачу решил сам.

(no subject)

From: [identity profile] oblomov-jerusal.livejournal.com - Date: 2008-07-17 08:02 pm (UTC) - Expand

(no subject)

From: [identity profile] avva.livejournal.com - Date: 2008-07-17 08:44 pm (UTC) - Expand

Date: 2008-07-16 07:38 pm (UTC)
From: [identity profile] mapux-f.livejournal.com
эммм я не программист, но вот так работает

числа: а, б, в, г, д

а = о
а + б < в
б + в = г
г < д

Date: 2008-07-17 07:38 pm (UTC)
From: [identity profile] avva.livejournal.com
Нет :)

Date: 2008-07-16 07:40 pm (UTC)
From: [identity profile] gianthare.livejournal.com
А можно ли с ними что-нибудь еще делать, типа складывать/вычитать?

Date: 2008-07-16 08:31 pm (UTC)
From: [identity profile] avva.livejournal.com
Нет, см. апдейт.

Date: 2008-07-16 07:41 pm (UTC)
From: [identity profile] cmm.livejournal.com
а на количество умножений и сложений ограничения есть?

Date: 2008-07-16 08:28 pm (UTC)
From: [identity profile] avva.livejournal.com
См. апдейт.

Date: 2008-07-16 07:42 pm (UTC)
From: [identity profile] jerom.livejournal.com
Должно быть семь сравнений в блок-схеме или по ходу выполнения алгоритма просто должно быть выполнено не более семи?

Date: 2008-07-16 08:28 pm (UTC)
From: [identity profile] avva.livejournal.com
Второе.

Date: 2008-07-16 07:43 pm (UTC)
From: [identity profile] adventurism.livejournal.com
Прикольная задачка, пришлось даже Excel открыть, чтобы не в голове цифры крутить :)
Пять цифр - A, B, C, D, E
1.Если A>B - меняем значения местами (A=B, B=A)
2.Если B>C - меняем значения местами
3.Если C>D - меняем значения местами
4.Если D>E - меняем значения местами
5.Если C>D - меняем значения местами
6.Если B>C - меняем значения местами
7.Если A>B - меняем значения местами
Т.е. пробегаем снизу вверх и обратно. Уверен, что есть и другие способы.

Date: 2008-07-16 08:29 pm (UTC)
From: [identity profile] avva.livejournal.com
Это не работает - у вас неявное предположение слишком хороших раскладок исходных чисел.

(no subject)

From: [identity profile] adventurism.livejournal.com - Date: 2008-07-16 08:32 pm (UTC) - Expand

(no subject)

From: [identity profile] avva.livejournal.com - Date: 2008-07-16 08:37 pm (UTC) - Expand

(no subject)

From: [identity profile] adventurism.livejournal.com - Date: 2008-07-17 05:31 am (UTC) - Expand

(no subject)

From: [identity profile] ivan-gandhi.livejournal.com - Date: 2008-07-16 11:50 pm (UTC) - Expand

(no subject)

From: [identity profile] crazy-blu.livejournal.com - Date: 2008-07-17 06:40 am (UTC) - Expand
(deleted comment)

Date: 2008-07-16 08:30 pm (UTC)
From: [identity profile] avva.livejournal.com
У вас слишком оптимистичное представление о самом неприятном случае :)

Date: 2008-07-16 08:13 pm (UTC)
From: [identity profile] angerona.livejournal.com
явно их надо складывать (попарно)? и сравнивать/перемещать пары, а потом уже сами числа, но теперь же надо еще придумать, в каком порядке и как, чтоб всегда результат давало...

Date: 2008-07-16 08:38 pm (UTC)
From: [identity profile] avva.livejournal.com
нет (см. апдейт).

(no subject)

From: [identity profile] angerona.livejournal.com - Date: 2008-07-16 08:59 pm (UTC) - Expand

(no subject)

From: [identity profile] avva.livejournal.com - Date: 2008-07-16 09:17 pm (UTC) - Expand

(no subject)

From: [identity profile] angerona.livejournal.com - Date: 2008-07-16 11:53 pm (UTC) - Expand

Date: 2008-07-16 08:18 pm (UTC)
From: [identity profile] bealex.livejournal.com
Цифровая сортировка позволяет сортировать числа с фиксированной точкой вообще без сравнений.

Но задачка интересная, да. Очень спасибо. :)

Date: 2008-07-17 07:39 pm (UTC)
From: [identity profile] avva.livejournal.com
Очень пожалуйста :)

Date: 2008-07-16 08:22 pm (UTC)
From: [identity profile] malaya-zemlya.livejournal.com
Я тебе по внутреннему емейлу шибко развернутый ответ послал. Там я накатал программу, которая берет множество всех перестановок из 5 чисел и делит его надвое при помощи результата одного сравнения. Сравнение выбирается так, чтоб две части были максимально близки по размеру. Потом каждая из частей тоже делится пополам итп.

А потом я прикинул и понял, что простой merge sort тоже подойдет.

Делишь числа на группу из двух и группу из трех. Сортируешь их по отдельности. (3 числа сортируется за 1 сравнение, 3 числа - за 3). Потом обе группы сливаются в одну. Это еще максимум 3 сравнения. Итого как раз 7.

Date: 2008-07-16 08:49 pm (UTC)
From: [identity profile] avva.livejournal.com
Послушай, твое второе решение не может работать из-за принципов, которые ты верно изложил в своем первом решении. Разве нет?

Конкретно если, то последняя часть второго решения несколько кавалеристски описана, и мне не вполне понятно, как это сработает.

(no subject)

From: [identity profile] malaya-zemlya.livejournal.com - Date: 2008-07-16 09:07 pm (UTC) - Expand

Date: 2008-07-16 08:23 pm (UTC)
From: [identity profile] nenujomojo.livejournal.com
а логарифм чисел можно брать?

Date: 2008-07-16 08:31 pm (UTC)
From: [identity profile] avva.livejournal.com
Нет.

Date: 2008-07-16 08:26 pm (UTC)
From: [identity profile] grur.livejournal.com
Бинарный поиск среди 5! перестановок.

Date: 2008-07-17 07:40 pm (UTC)
From: [identity profile] avva.livejournal.com
Какой это на 5! перестановках есть полный порядок, по которому ты делаешь бинарный поиск? :)

(no subject)

From: [identity profile] grur.livejournal.com - Date: 2008-07-17 08:17 pm (UTC) - Expand

(no subject)

From: [identity profile] avva.livejournal.com - Date: 2008-07-17 08:44 pm (UTC) - Expand

(no subject)

From: [identity profile] grur.livejournal.com - Date: 2008-07-17 09:48 pm (UTC) - Expand

(no subject)

From: [identity profile] avva.livejournal.com - Date: 2008-07-17 09:49 pm (UTC) - Expand
From: (Anonymous)
И решать ее проще именно в терминах есть весы и 5 гирек разных по весу. Задача простая, IMHO.
From: [identity profile] avva.livejournal.com
Верно, я не знал о варианте с весами, но явно можно так сформулировать.

Date: 2008-07-16 08:34 pm (UTC)
From: [identity profile] strangeraven.livejournal.com
Для начала: 5 чисел могут лечь в ряд 5! = 120 вариантами.
7 взвешиваний рассекают 2^7 = 128 вариантов
Должны успеть.

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

Поехали:
A, B, C, D, E

1. A ? B
A < B

2. C ? D
A < B
C < D

3. B ? D
A   <   B
      < 
C < D

4.a. D ? E

A   <   B
      <
C < D
E <

5.a. C ? E

        A < B
          <
C < E < D

далее A за два сравнения доставляем в ряд C,E,D,B

4.b. D ? E

    A < B
      <
C < D < E

5.b. B ? E

        A <
C < D < E < B

или
    A <
C < D < B < E

в любом случае доставляем A за два сравнения

(no subject)

From: (Anonymous) - Date: 2008-07-18 12:37 am (UTC) - Expand

(no subject)

From: [identity profile] strangeraven.livejournal.com - Date: 2008-07-18 08:54 pm (UTC) - Expand

Date: 2008-07-16 08:42 pm (UTC)
From: [identity profile] deni-ok.livejournal.com
Выбираем две пары 1 и 2. Упорядочиваем каждую за 2 сравнения: m1<M1, m2<M2.
Сравниваем M1 и M2 (3ье сравнение). Без ограничения общности можно считать, что M2 больше:
m1 < M1
     ^
m2 < M2
Сравниваем теперь оставшееся ещё неиспользованным пятое число (x) с M1. Возможны 2 варианта:
(1)
m1 < M1 < x
     ^
m2 < M2
(2)
     x
     ^
m1 < M1
     ^
m2 < M2
Легко видеть, что оставшихся трех сравнений достаточно, чтобы сделать эти частичные порядки полными.

Date: 2008-07-17 07:44 pm (UTC)
From: [identity profile] avva.livejournal.com
Все верно (хотя "легко видеть" наверное не всем :))

Date: 2008-07-16 08:50 pm (UTC)
From: [identity profile] nenujomojo.livejournal.com
отсоротровать 3 числа (3 сравнения), оставшиеся 2 (одно). сравнить минимум из двух с максимумом трех (одно). если больше - все. если меньше - сравнить максимум двух с минимумо трех (одно). если меньше - все. если больше - сравнить два со средним их трех (два).

Date: 2008-07-17 07:44 pm (UTC)
From: [identity profile] avva.livejournal.com
Нет, увы, так в худшем случае не сработает.

(no subject)

From: [identity profile] nenujomojo.livejournal.com - Date: 2008-07-17 08:07 pm (UTC) - Expand

Date: 2008-07-16 08:53 pm (UTC)
From: [identity profile] dfayruzov.livejournal.com
Разделим 5 чисел на группы:
A,B - группа1, C, D - группа 2, Е - группа 3

Далее, предположим, что "победитель" группы - который больше. Тогда максимум можно выбрать за 4 сравнения:
А,B -> Win1
-> Win3
C,D -> Win2
-> Win4
E

И вот здесь вопрос: могу ли я проверить, что Win4 "is" Win3?

Date: 2008-07-17 07:45 pm (UTC)
From: [identity profile] avva.livejournal.com
простите, но ваш метод я кажется совсем не понял :)

Date: 2008-07-16 08:53 pm (UTC)
From: [identity profile] talash.livejournal.com
i understand that swapping places etc is allowed?

Date: 2008-07-16 09:11 pm (UTC)
From: [identity profile] avva.livejournal.com
Ага.

Date: 2008-07-16 08:55 pm (UTC)
From: [identity profile] azot.livejournal.com
AB, DE, BD, BC, CD , AB, DE.

Date: 2008-07-17 07:45 pm (UTC)
From: [identity profile] avva.livejournal.com
Нет, это не сработает в худшем случае.

Date: 2008-07-16 09:10 pm (UTC)
From: (Anonymous)
Метод вставки

Date: 2008-07-16 09:14 pm (UTC)
From: (Anonymous)
Метод вставки дает 9, сорри
Page 1 of 4 << [1] [2] [3] [4] >>

December 2025

S M T W T F S
  123 4 56
78 9 10 11 1213
1415 1617181920
21 22 23 24 2526 27
28293031   

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Dec. 29th, 2025 05:17 am
Powered by Dreamwidth Studios