Задачка про локальные максимумы

и задачки для интервью.
Izh
Уже с Приветом
Сообщения: 172
Зарегистрирован: Сб фев 15, 2003 10:57 am
Откуда: Moscow

Задачка про локальные максимумы

Сообщение Izh »

... хорошо дает понять, каково отношение к программированию
у соискателя.

Итак:

Написать функцию, которая имеет массив целых чисел на
входе и возвращает количество локальных экстремумов
(максимумов) в данном массиве. Возможный прототип на
C:

Код: Выделить всё

unsigned int num_local_maximums( const int array[], size_t size );
Аватара пользователя
KP580BE51
Уже с Приветом
Сообщения: 15007
Зарегистрирован: Вт июн 14, 2005 6:50 am
Откуда: Ukraine

Re: Задачка про локальные максимумы

Сообщение KP580BE51 »

Izh писал(а):... хорошо дает понять, каково отношение к программированию
у соискателя.

Итак:

Написать функцию, которая имеет массив целых чисел на
входе и возвращает количество локальных экстремумов
(максимумов) в данном массиве. Возможный прототип на
C:

Код: Выделить всё

unsigned int num_local_maximums( const int array[], size_t size );


n += ((array[i-1] < array[i]) && (array[i] > array[i+1])) ? 1 : 0;

Ы?
Izh
Уже с Приветом
Сообщения: 172
Зарегистрирован: Сб фев 15, 2003 10:57 am
Откуда: Moscow

Re: Задачка про локальные максимумы

Сообщение Izh »

KP580BE51 писал(а):
Izh писал(а):... хорошо дает понять, каково отношение к программированию
у соискателя.

Итак:

Написать функцию, которая имеет массив целых чисел на
входе и возвращает количество локальных экстремумов
(максимумов) в данном массиве. Возможный прототип на
C:

Код: Выделить всё

unsigned int num_local_maximums( const int array[], size_t size );


n += ((array[i-1] < array[i]) && (array[i] > array[i+1])) ? 1 : 0;

Ы?


Задание понято неверно -- была просьба написать
функцию, которая возвращает количество локальных
максимумов. Не могли бы вы написать полное решение?
Аватара пользователя
KP580BE51
Уже с Приветом
Сообщения: 15007
Зарегистрирован: Вт июн 14, 2005 6:50 am
Откуда: Ukraine

Re: Задачка про локальные максимумы

Сообщение KP580BE51 »

Izh писал(а):Задание понято неверно -- была просьба написать
функцию, которая возвращает количество локальных
максимумов. Не могли бы вы написать полное решение?

В Москве все такие зануды? :)

unsigned int num_local_maximums( const int array[], size_t size )
{
unsigned int n=0,i;
for(i=1;i<size-1;i++) n += ((array[i-1] < array[i]) && (array[i] > array[i+1])) ? 1 : 0;
return n;
}
Izh
Уже с Приветом
Сообщения: 172
Зарегистрирован: Сб фев 15, 2003 10:57 am
Откуда: Moscow

Re: Задачка про локальные максимумы

Сообщение Izh »

KP580BE51 писал(а):В Москве все такие зануды? :)

unsigned int num_local_maximums( const int array[], size_t size )
{
unsigned int n=0,i;
for(i=1;i<size-1;i++) n += ((array[i-1] < array[i]) && (array[i] > array[i+1])) ? 1 : 0;
return n;
}


Ваша функция не работает для массива, длина которого
равна 0 (в этом случае последствия катастрофичны), 1 или 2.
Аватара пользователя
kostia00
Уже с Приветом
Сообщения: 448
Зарегистрирован: Вт июн 11, 2002 9:09 pm
Откуда: Moscow, RU - Chicago, IL - Greenwich, CT

Сообщение kostia00 »

Зависит от определения локального максимума. Работает, imho.
I am about to develop an attitude
Аватара пользователя
KP580BE51
Уже с Приветом
Сообщения: 15007
Зарегистрирован: Вт июн 14, 2005 6:50 am
Откуда: Ukraine

Re: Задачка про локальные максимумы

Сообщение KP580BE51 »

Izh писал(а):
KP580BE51 писал(а):В Москве все такие зануды? :)

unsigned int num_local_maximums( const int array[], size_t size )
{
unsigned int n=0,i;
for(i=1;i<size-1;i++) n += ((array[i-1] < array[i]) && (array[i] > array[i+1])) ? 1 : 0;
return n;
}


Ваша функция не работает для массива, длина которого
равна 0 (в этом случае последствия катастрофичны), 1 или 2.

Это раздел "головоломки".
Аватара пользователя
KP580BE51
Уже с Приветом
Сообщения: 15007
Зарегистрирован: Вт июн 14, 2005 6:50 am
Откуда: Ukraine

Сообщение KP580BE51 »

kostia00 писал(а):Зависит от определения локального максимума. Работает, imho.

Имелось в виду что в функции нет обработки исключений. А вообще действительно, какие еще катастрофичные последствия? :pain1:
Izh
Уже с Приветом
Сообщения: 172
Зарегистрирован: Сб фев 15, 2003 10:57 am
Откуда: Moscow

Сообщение Izh »

kostia00 писал(а):Zavisit ot opredeleniya lokal'nogo maksimuma.


В этом-то и состоит подвох задачи. Эта задачка
на аккуратность и осознание человеком, того, что
он делает. Подразумевается, что человек попросит
определение локального максимума. Или задаст
его самостоятельно и укажет при решении.

Кроме того, при любом определении задача
решена неверно для массива нулевой длины
(очевидно почему). Кстати, вышеуказанное
решение далеко не оптимальна, поскольку
использует два сравнения, когда можно обойтись
одним. Про отстутствие форматирования вообще
говорить не хочеться.
Izh
Уже с Приветом
Сообщения: 172
Зарегистрирован: Сб фев 15, 2003 10:57 am
Откуда: Moscow

Сообщение Izh »

KP580BE51 писал(а):
kostia00 писал(а):Зависит от определения локального максимума. Работает, imho.

Имелось в виду что в функции нет обработки исключений. А вообще действительно, какие еще катастрофичные последствия? :pain1:


Кем имелось в виду, что нет обработки исключений?
Вами? Возможно, но не мной. В любом случае вы
могли задать вопрос, если были в чем-то не уверены.

О последствиях -- они очевидно вытекают из того,
факта, что тип i у вас unsigned int и параметр size
равен 0. Наводящий вопрос: что произойдет при
этом с циклом?
Izh
Уже с Приветом
Сообщения: 172
Зарегистрирован: Сб фев 15, 2003 10:57 am
Откуда: Moscow

Re: Задачка про локальные максимумы

Сообщение Izh »

KP580BE51 писал(а):Это раздел "головоломки".


И задачки для интервью, если я еще не разучился
читать.
Аватара пользователя
KP580BE51
Уже с Приветом
Сообщения: 15007
Зарегистрирован: Вт июн 14, 2005 6:50 am
Откуда: Ukraine

Сообщение KP580BE51 »

Izh писал(а):
kostia00 писал(а):Zavisit ot opredeleniya lokal'nogo maksimuma.


В этом-то и состоит подвох задачи. Эта задачка
на аккуратность и осознание человеком, того, что
он делает. Подразумевается, что человек попросит
определение локального максимума. Или задаст
его самостоятельно и укажет при решении.

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

Скажите, вы давно заглядывали в листинг? Который компилятор генерит?
А вообще, хотелосьбы посмотреть на решение задачи с одним сравнением.

Про отстутствие форматирования вообще
говорить не хочеться.

Все! Интервью завалено! Аднозначно!
Izh
Уже с Приветом
Сообщения: 172
Зарегистрирован: Сб фев 15, 2003 10:57 am
Откуда: Moscow

Сообщение Izh »

KP580BE51 писал(а):А если человек довольствуется тем, которое принято в математике, то интервью завалено? :)


Определение из какой области математики?
Сформулируйте его, пожалуйста. Например,
ваше решение совершенно игнорирует существование плоских максимумов (то есть
есть таких, которые >= своих соседей).
Например, для массива 1,1,1 ваша функия
вернет 0.

Скажите, вы давно заглядывали в листинг? Который компилятор генерит?


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

А вообще, хотелосьбы посмотреть на решение задачи с одним сравнением.


Я его опубликую в течение пары дней, если это
не сделает кто-нибудь вместо меня.

Про отстутствие форматирования вообще
говорить не хочеться.

Все! Интервью завалено! Аднозначно![/quote]

Да, но не по этой причине. Наличие
форматирования показывает, насколько
программист уважает свой труд и труд
коллег, которые вынуждены читать его
код.
Taffi
Новичок
Сообщения: 66
Зарегистрирован: Чт мар 10, 2005 2:53 pm

Сообщение Taffi »

unsigned int num_local_maximums( const int array[], size_t size )
{
BOOL bGrow = FALSE;
unsigned int n = 0, i;

for(i = 1; i < size; i++) {
if (array[i] >= array[i-1])
bGrow = TRUE;
else if (bGrow) {
n++;
bGrow = FALSE;
}
}
return n;
}
Полет - единственный достойный способ путешествия!
Братья Райт
Аватара пользователя
KP580BE51
Уже с Приветом
Сообщения: 15007
Зарегистрирован: Вт июн 14, 2005 6:50 am
Откуда: Ukraine

Сообщение KP580BE51 »

Izh писал(а):
KP580BE51 писал(а):А если человек довольствуется тем, которое принято в математике, то интервью завалено? :)


Определение из какой области математики?
Сформулируйте его, пожалуйста. Например,
ваше решение совершенно игнорирует существование плоских максимумов (то есть
есть таких, которые >= своих соседей).
Например, для массива 1,1,1 ваша функия
вернет 0.


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

Да, но не по этой причине. Наличие
форматирования показывает, насколько
программист уважает свой труд и труд
коллег, которые вынуждены читать его
код.


Определение максимума в математике достаточно однозначно - это точка в которой первая производная меняет знак. Но на практике, к примеру поиск максимума, в зашумленном сигнале, часто требует предварительной фильтрации, и введения гистерезиса. Это наверно вы приготовили на потом.

Я давно заметил что есть 2 типа интервью. На одних мне говорили (как здесь) что я бездарь, неуч, что я вообще ничего не понимаю в программировании, что к компютеру мне подходить вообще нельзя итд. Другой вариант, диаметрально противоположен. Такое ощущение, что средины просто не бывает. Я конечно, понимаю, что у каждого есть родственники, что никто не хочет принимать сильного человека, который сможет обойти по служебной лестнице, но зачем устраивать такой цирк на форуме?
Такое построение задач, далеко не уникально. И подвох тут совсем не в поиске максимума. Подвох в том, что:
Если человек сделал обработку исключенией, то можно сказать что в задаче про это не говорилось. Если не делал, то соответственно как сейчас.
Если человек сделал обработку "плоских максимумов", то можно сказать что это не нужно. Можно на ходу придумывать громадное количество "уточнений". Вот пришло уточнение про медленную память. А чего она вдруг стала медленной? Это как-то описывалось? Я вот могу сказать что задача решена абсолютно не правильно, так как на одно сравнение приходится 1 бранч, который на многих процессорах, сбарсывает pipe-line и вызывает жесточайшие тормоза. Да, постоянно идет выборка из масива. Мне сказали что это не правильно. Я могу сказать, что если у процессора есть кеш память, то эти все данные прокешируеются, а мне могут сказать что кеш памяти нету. Или сказать что данные у примеру в EEPROM находятся. Еслибы я сделал, как тут сказали в "виде последовательного потока данных", можно былобы придумать что-то про выравнивание по страницам, про страничную организацию памяти итд. (Это если интервьюирующий слышал про такие слова). Вот к примеру мне тут чего-то забыли сказать про коментарии. ЖУТЬ в программе нет коментариев, как-же ее другие будут понимать? Правда сказали что если программа из 3 строчек, то ее невозможно понять по тому что она не форматирована.
Ответить

Вернуться в «Головоломки»