Re[8]: Почему преждевременная оптимизация - корень всех зол?
От: minorlogic Украина  
Дата: 21.08.08 21:35
Оценка:
Здравствуйте, skeptik_, Вы писали:

_>ЗЫ У меня получился за 3 минуты почти один в один std::max_element.


Интереснее было бы если бы вы привели тут итоговый код
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Ищу работу, 3D, SLAM, computer graphics/vision.
Re[7]: Почему преждевременная оптимизация - корень всех зол?
От: Сергей  
Дата: 21.08.08 21:50
Оценка:
Здравствуйте, minorlogic, Вы писали:

M>Хотите проверить ? попробуйте сразу после прочтения поста написать за 5 минут такую функцию.


int
array_max(int *array, size_t size) {
  int r;
  size_t i;

  assert(array != NULL);
  assert(size != 0);

  r = array[0];
  for (i = 1; i < size; i++) {
    if (array[i] > r) {
      r = array[i];
    }
  }
  return r;
}


Ну как?
Re[9]: Почему преждевременная оптимизация - корень всех зол?
От: skeptik_  
Дата: 21.08.08 21:57
Оценка:
Здравствуйте, minorlogic, Вы писали:

M>Здравствуйте, skeptik_, Вы писали:


_>>ЗЫ У меня получился за 3 минуты почти один в один std::max_element.


M>Интереснее было бы если бы вы привели тут итоговый код


Да пожалуйста. Разница с msvc 9.0 в том, что у них условие заключает в себя цикл, а у меня стоит в начале (это я уже потом посмотрел)
template< typename ForwardIterator >
ForwardIterator max( ForwardIterator first, ForwardIterator last )
{
    if ( first == last )
        return first;

    ForwardIterator result = first;
    while( ++first != last )
        if ( *result < *first )
            result = first;
    return result;
}

А можно всё таки огласить архитектурную ошибку?
Re[10]: Почему преждевременная оптимизация - корень всех зол
От: minorlogic Украина  
Дата: 22.08.08 04:49
Оценка:
Здравствуйте, skeptik_, Вы писали:

_>А можно всё таки огласить архитектурную ошибку?


Инициализация первого значения чемнить вроде MIN_INT
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Ищу работу, 3D, SLAM, computer graphics/vision.
Re[8]: Почему преждевременная оптимизация - корень всех зол?
От: minorlogic Украина  
Дата: 22.08.08 04:52
Оценка:
Здравствуйте, Сергей, Вы писали:


С>Ну как?


Всего 2 ошибки из 3 , зато стоит асерт на нулевой размер что уже лучше чем ничего.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Ищу работу, 3D, SLAM, computer graphics/vision.
Re[9]: Почему преждевременная оптимизация - корень всех зол?
От: ironwit Украина  
Дата: 22.08.08 05:38
Оценка:
minorlogic wrote:
>
> С>Ну как?
>
> Всего 2 ошибки из 3 , зато стоит асерт на нулевой размер что уже лучше
> чем ничего.

ты не выделывайся ты свой покажи.
Posted via RSDN NNTP Server 2.1 beta
Я не умею быть злым, и не хочу быть добрым.
Re[7]: Почему преждевременная оптимизация - корень всех зол?
От: Privalov  
Дата: 22.08.08 07:38
Оценка:
Здравствуйте, minorlogic, Вы писали:

M>А если подумать это очень несложный алгоритм, по сравнению с сортировкой просто дет сад. Хотите проверить ? попробуйте сразу после прочтения поста написать за 5 минут такую функцию.


Вот как-то так, наверное. Под рукой сейчас только Eclipse.

    static int find(int[] a) throws Exception
    {
        if (a == null)
            throw new NullPointerException("Array is empty");
        
        if (a.length == 0)
            throw new IndexOutOfBoundsException("length is 0");
        
        if (a.length == 1)
            return a[0];
        
        int max = a[0];
        for (int i = 1; i < a.length; i++)
        {
            if (a[i] > max)
                max = a[i];
        }
        return max;
    }
Re[9]: Почему преждевременная оптимизация - корень всех зол?
От: Сергей  
Дата: 22.08.08 11:43
Оценка:
Здравствуйте, minorlogic, Вы писали:

M>Всего 2 ошибки из 3 , зато стоит асерт на нулевой размер что уже лучше чем ничего.


Какие ошибки-то?
Re[6]: Почему преждевременная оптимизация - корень всех зол?
От: Константин Л. Франция  
Дата: 22.08.08 12:05
Оценка:
Здравствуйте, _FRED_, Вы писали:

ну с сетами и мапами неинтересно.
Re[7]: Почему преждевременная оптимизация - корень всех зол?
От: nikov США http://www.linkedin.com/in/nikov
Дата: 22.08.08 12:31
Оценка:
Здравствуйте, Константин Л., Вы писали:

КЛ>Здравствуйте, _FRED_, Вы писали:


КЛ>ну с сетами и мапами неинтересно.


Почему?

Кстати, предварительная сортировка коллекций и то даст лучший результат, чем вложенные циклы.
Re[8]: Почему преждевременная оптимизация - корень всех зол?
От: minorlogic Украина  
Дата: 22.08.08 12:32
Оценка:
Здравствуйте, Privalov, Вы писали:

P>
P>    static int find(int[] a) throws Exception
P>    {
P>        if (a == null)
P>            throw new NullPointerException("Array is empty");
        
P>        if (a.length == 0)
P>            throw new IndexOutOfBoundsException("length is 0");
        
P>        if (a.length == 1)
P>            return a[0];
        
P>        int max = a[0];
P>        for (int i = 1; i < a.length; i++)
P>        {
P>            if (a[i] > max)
P>                max = a[i];
P>        }
P>        return max;
P>    }

P>


Явку знаю плохо , поэтому прокоментируй плиз.

P> if (a == null)

P> throw new NullPointerException("Array is empty");

А разве такое поведенеи не будет если проверки не делать ? при первом же обращении вроде как выкинет NullPointerException ?

P> if (a.length == 0)

P> throw new IndexOutOfBoundsException("length is 0");

почему именно IndexOutOfBoundsException ?

P> if (a.length == 1)

P> return a[0];

Лишний код , лишняя проверка ?

P> if (a[i] > max)

P> max = a[i];

рекомендовал бы max = max(max, a[i])


Спасибо за потреченное время , было интересно.
Ищу работу, 3D, SLAM, computer graphics/vision.
Re[10]: Почему преждевременная оптимизация - корень всех зол
От: minorlogic Украина  
Дата: 22.08.08 12:42
Оценка: -1
Здравствуйте, Сергей, Вы писали:

С>Какие ошибки-то?


Думаю что вы не согласитесь что это ошибки но я считаю это ошибками.

1. Нет обработки случая нулевого массива. ассерт это не наш метод потому что находится в теле функции , в документации к функции нет прекондишенов. Фактически если у меня только заголовок перед глазами , я не вижу причин вызвать функцию с ненулевой длиной.

2. при массиве нулевой длины может быть большой бабах при обращении к несуществующему элементу .
Ищу работу, 3D, SLAM, computer graphics/vision.
Re[9]: Почему преждевременная оптимизация - корень всех зол?
От: skeptik_  
Дата: 22.08.08 12:56
Оценка: +1
Здравствуйте, minorlogic, Вы писали:

P>> if (a[i] > max)

P>> max = a[i];

M>рекомендовал бы max = max(max, a[i])


Я бы сказал, что это будет лишнее присвоение.
Re[11]: Почему преждевременная оптимизация - корень всех зол
От: CreatorCray  
Дата: 22.08.08 12:56
Оценка:
Здравствуйте, minorlogic, Вы писали:

M>1. Нет обработки случая нулевого массива. ассерт это не наш метод потому что находится в теле функции , в документации к функции нет прекондишенов. Фактически если у меня только заголовок перед глазами , я не вижу причин вызвать функцию с ненулевой длиной.

Кстати как по вашему должна реагировать эта функция на нулевой массив? Exception?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Re[12]: Почему преждевременная оптимизация - корень всех зол
От: skeptik_  
Дата: 22.08.08 13:05
Оценка: +2
Здравствуйте, CreatorCray, Вы писали:

CC>Здравствуйте, minorlogic, Вы писали:


M>>1. Нет обработки случая нулевого массива. ассерт это не наш метод потому что находится в теле функции , в документации к функции нет прекондишенов. Фактически если у меня только заголовок перед глазами , я не вижу причин вызвать функцию с ненулевой длиной.

CC>Кстати как по вашему должна реагировать эта функция на нулевой массив? Exception?
Так, как это делает моя — возвращая итератор end. На мой взгляд это архитектурная ошибка — работать напрямую со значениями.
Re[12]: Почему преждевременная оптимизация - корень всех зол
От: minorlogic Украина  
Дата: 22.08.08 13:36
Оценка:
Здравствуйте, CreatorCray, Вы писали:

CC>Кстати как по вашему должна реагировать эта функция на нулевой массив? Exception?


Нет , я бы ексепшен не использовал , флажок какойнить например ... Но в любом случае функция может в интерфейсе сообщить пользователю о возможности возникновения вот такой вот ситуации.

Но ексепшен тоже неплохо, намного лучше чем просто упасть.
Ищу работу, 3D, SLAM, computer graphics/vision.
Re[12]: Почему преждевременная оптимизация - корень всех зол
От: minorlogic Украина  
Дата: 22.08.08 13:44
Оценка: :)
Т.е. конечно тут std::max_element это красивый дизайн и имплементация , максимально эфективно , ничего лишнего.
Ищу работу, 3D, SLAM, computer graphics/vision.
Re[13]: Почему преждевременная оптимизация - корень всех зол
От: CreatorCray  
Дата: 22.08.08 14:07
Оценка: +2
Здравствуйте, skeptik_, Вы писали:

M>>>1. Нет обработки случая нулевого массива. ассерт это не наш метод потому что находится в теле функции , в документации к функции нет прекондишенов. Фактически если у меня только заголовок перед глазами , я не вижу причин вызвать функцию с ненулевой длиной.

CC>>Кстати как по вашему должна реагировать эта функция на нулевой массив? Exception?
_>Так, как это делает моя — возвращая итератор end. На мой взгляд это архитектурная ошибка — работать напрямую со значениями.
Кстати из исходного условия "написать функцию нахождения максимального элемента в массиве целых чисел" не совсем ясно что требуется: само значение, или какая то ссылка (указатель/итератор) на элемент с максимальным значением.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Re[9]: Почему преждевременная оптимизация - корень всех зол?
От: Privalov  
Дата: 22.08.08 14:14
Оценка:
Здравствуйте, minorlogic, Вы писали:

M>Явку знаю плохо , поэтому прокоментируй плиз.


P>> if (a == null)

P>> throw new NullPointerException("Array is empty");

M>А разве такое поведенеи не будет если проверки не делать ? при первом же обращении вроде как выкинет NullPointerException ?


Будет, разумеется. Но ты бы тогда спросил, где обработка входных параметров? Вот я и выписал.


P>> if (a.length == 0)

P>> throw new IndexOutOfBoundsException("length is 0");

M>почему именно IndexOutOfBoundsException ?


Это можно было тоже не писать. Если сделать так в вызывающем коде:

{
   a = new int[0];
   max = find(a)
}


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

P>> if (a.length == 1)

P>> return a[0];

M>Лишний код , лишняя проверка ?


Это, разумеется, можно было не писать.

P>> if (a[i] > max)

P>> max = a[i];

M>рекомендовал бы max = max(max, a[i])


Зачем? Разве max не реализует тот же самый if?

M>Спасибо за потреченное время , было интересно.


P.S. Я не противник использования в приложениях стандартных средств. Когда работа идет в нормальном режиме, тогда времени хватает на все: найти в документации описания, набросать пару методов, чтобы посмотреть, как работает, и т. п. Но в клинических, повторю, случаях, приходится превращаться в "чукчу-писателя". Думаю, не только я с подобным сталкиваюсь. Сейчас, првада, все реже.

P.P.S Велосипед для двоичного поиска я бы писать, пожалуй, не стал.
Re[14]: Почему преждевременная оптимизация - корень всех зол
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 22.08.08 14:21
Оценка: +1
Здравствуйте, CreatorCray, Вы писали:

CC>>>Кстати как по вашему должна реагировать эта функция на нулевой массив? Exception?

_>>Так, как это делает моя — возвращая итератор end. На мой взгляд это архитектурная ошибка — работать напрямую со значениями.
CC>Кстати из исходного условия "написать функцию нахождения максимального элемента в массиве целых чисел" не совсем ясно что требуется: само значение, или какая то ссылка (указатель/итератор) на элемент с максимальным значением.

Из исходного условия так же не понятно, требовалась ли максимально безопасная (с проверками параметров) или максимально быстрая версия. Применительно к C++, имхо, логичнее было бы предполагать максимально быструю версию (максимум, что в ней может быть еще -- это набор ассертов).

А подход с итераторами ничем не лучше простого возврата значения из наивной реализации max_element, ведь никто не запрещает программисту написать так:
std::cout << "max element: " << *max_element(a.begin(), a.end()) << std::endl;

а потом получить крах приложения из-за разыменования итератора end().

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


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.