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

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

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

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

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

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

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

Date: 2008-07-16 06:28 pm (UTC)
From: [identity profile] avva.livejournal.com
Нет, разрешаются только сравнения между данными числами, и более ничего.

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

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

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

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

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

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

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

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

Date: 2008-07-16 07:40 pm (UTC)
From: [identity profile] torquelimach.livejournal.com
Вот это глюк! Приношу извинения.

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

Date: 2008-07-16 07:42 pm (UTC)
From: [identity profile] jerom.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 07:49 pm (UTC)
From: [identity profile] amigofriend.livejournal.com
А == можно? Потому что если идти сверху по битам в шестнадцатиричном (или двоичном) представлении, то > < вообще не нужны будут :)

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

Date: 2008-07-16 08:18 pm (UTC)
From: [identity profile] bealex.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:23 pm (UTC)
From: [identity profile] avva.livejournal.com
Бывает :)

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

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

Date: 2008-07-16 08:27 pm (UTC)
From: [identity profile] avva.livejournal.com
К битам доступа нет, а только к операции сравнения двух чисел.

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

Date: 2008-07-16 08:28 pm (UTC)
From: [identity profile] avva.livejournal.com
Второе.
Page 1 of 10 << [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] >>

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 07:29 pm
Powered by Dreamwidth Studios