Массив с нулём

Все, что вы хотели знать о программизме, но боялись спросить.
Ответить
Аватара пользователя
aissp
Маньяк
Сообщения: 2710
Зарегистрирован: 07 ноя 2005, 09:51

Сообщение aissp »

size is even :)

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

bool func(int* qq, size_t size) {
unsigned int i=0;
for(; (qq+i) & (qq+i+1) ; i+=2);
}
если программа бросает корку в массиве нулей нет
Последний раз редактировалось aissp 23 мар 2007, 11:05, всего редактировалось 1 раз.
tiasur
Маньяк
Сообщения: 1510
Зарегистрирован: 26 фев 2006, 10:00
Откуда: offline

Сообщение tiasur »

папа Карло писал(а):
как вариант, создай класс SmartArray который имеет одно дополнительное проперти есть ли в массиве 0. тогда читать будет быстро, но "перебор" будет на этапе вставки. эсли это допустимо, то все пучком.
Перебор и сравнение переносится в класс? Тогда это не решение и не оптимизация.
Аватара пользователя
папа Карло
Шарманщик
Сообщения: 8565
Зарегистрирован: 17 фев 2003, 15:04
Откуда: НН -> BC -> WA -> UT -> CA

Сообщение папа Карло »

tiasur писал(а):
папа Карло писал(а):
как вариант, создай класс SmartArray который имеет одно дополнительное проперти есть ли в массиве 0. тогда читать будет быстро, но "перебор" будет на этапе вставки. эсли это допустимо, то все пучком.
Перебор и сравнение переносится в класс? Тогда это не решение и не оптимизация.
чудес не бывает. ты где то должен потратить время на проверку... либо при вставке, либо при чтении. :) если при чтении то без перебора не обойдешься как не крути. как в сказке: и рыбку съесть и на.... сесть :)
tiasur
Маньяк
Сообщения: 1510
Зарегистрирован: 26 фев 2006, 10:00
Откуда: offline

Сообщение tiasur »

ajkj3em писал(а):
просто если там int, то написать что либо быстрее

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

rep scasb/scasw/scasd 
в терминах интелловского ассемблера вряд ли получитcя, а
вто собственно memchr & co. из стандартной библиотеки
Поцессор может быть другим.
Аватара пользователя
dima
Житель
Сообщения: 690
Зарегистрирован: 19 фев 2003, 19:26
Откуда: Хабаровск->Toronto

Re: Массив с нулём

Сообщение dima »

tiasur писал(а):Как проверить массив на наличие там нуля не перебирая его члены?
никак - надо перебирать.
tiasur
Маньяк
Сообщения: 1510
Зарегистрирован: 26 фев 2006, 10:00
Откуда: offline

Сообщение tiasur »

никак - надо перебирать.
Когда ставится вопрос, то подразумевается, что решение существует.
Да и переберать можно, но сравнение должно быть одно, и полученный вариан должен быть оптимизированный по отношению к тривиальному.
Аватара пользователя
ajkj3em
Маньяк
Сообщения: 2063
Зарегистрирован: 12 ноя 2006, 06:53

Сообщение ajkj3em »

tiasur писал(а):
ajkj3em писал(а):
просто если там int, то написать что либо быстрее

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

rep scasb/scasw/scasd 
в терминах интелловского ассемблера вряд ли получитcя, а
вто собственно memchr & co. из стандартной библиотеки
Поцессор может быть другим.
охотно верю. но (опять же) оптимизировать под абстрактную
платформу - смысла нет.

чтобы понять если ли ноль, надо что-то сделать с каждым
елементом (и может быть что-то еще дополнительно). вопрос состоит
в том будет ли вто что-то быстрее или медленнее операции
сравнения.

твои пример с &&= прекрасное тому подтверждение - в зависимости
от платформы операция приведения int'a к 0 или 1 может быть
имплементирована сильно по-разному, и в результате такой метод
может оказаться как быстрее так и медленнее тривиального.
Аватара пользователя
ajkj3em
Маньяк
Сообщения: 2063
Зарегистрирован: 12 ноя 2006, 06:53

Сообщение ajkj3em »

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

* перевод с транслита
Аватара пользователя
папа Карло
Шарманщик
Сообщения: 8565
Зарегистрирован: 17 фев 2003, 15:04
Откуда: НН -> BC -> WA -> UT -> CA

Сообщение папа Карло »

tiasur писал(а):
никак - надо перебирать.
Когда ставится вопрос, то подразумевается, что решение существует.
Да и переберать можно, но сравнение должно быть одно, и полученный вариан должен быть оптимизированный по отношению к тривиальному.
я подразумеваю что ты подразумеваешь не верно. ;) можешь объяснить почему ты считаешь, что существует решение которое не поребирает массив и делает это за одно сравнение (итерацию)? можешь поделиться дополнительной информацией которая заставляет тебя так думать?
Аватара пользователя
ajkj3em
Маньяк
Сообщения: 2063
Зарегистрирован: 12 ноя 2006, 06:53

Сообщение ajkj3em »

папа Карло писал(а):.. решение которое не поребирает массив
перебирать можно http://forum.kamorka.com/viewtopic.php?p=147557#147557
Аватара пользователя
sz
Маньяк
Сообщения: 1266
Зарегистрирован: 17 фев 2003, 19:34

Сообщение sz »

Ну, например, вот так:

bool HasZeroes( const unsigned* array, unsigned size )
{
unsigned result = 1;
for( ; size != 0; --size,++array ) result &= *array-1^*array;
return result == 0;
}

Компилировать и запускать не пытался, так что больно не драться, если что. Просто демонстрирует идею.
Аватара пользователя
папа Карло
Шарманщик
Сообщения: 8565
Зарегистрирован: 17 фев 2003, 15:04
Откуда: НН -> BC -> WA -> UT -> CA

Сообщение папа Карло »

ajkj3em писал(а):
папа Карло писал(а):.. решение которое не поребирает массив
перебирать можно http://forum.kamorka.com/viewtopic.php?p=147557#147557
хмм.... ок. :) тогда встает вопрос об оптимизации под определенный процессор я так понимаю....
tiasur
Маньяк
Сообщения: 1510
Зарегистрирован: 26 фев 2006, 10:00
Откуда: offline

Сообщение tiasur »

ajkj3em, если задачу предлагают решить на С, то не стоит вникать в тип процессора и особенностей его асемблера.

папа Карло, я уже признал свою ошибку в формулировки задачи. Правильно так:

Определить есть ли ноль в массиве не сравнивая каждый член этого массива с нулем. Можно использовать другие математические операции. Сравнение с нулём может быть произведено только один раз. Код должен получиться в результате оптимизированным. Язык С.
Аватара пользователя
Аман Ванкуверский
Маньяк
Сообщения: 2759
Зарегистрирован: 18 окт 2005, 01:10

Сообщение Аман Ванкуверский »

tiasur писал(а): Определить есть ли ноль в массиве не сравнивая каждый член этого массива с нулем. Можно использовать другие математические операции. Сравнение с нулём может быть произведено только один раз. Код должен получиться в результате оптимизированным. Язык С.
Оптимизированным по сравнению с каким алгоритмом?
Аватара пользователя
dima
Житель
Сообщения: 690
Зарегистрирован: 19 фев 2003, 19:26
Откуда: Хабаровск->Toronto

Сообщение dima »

sz писал(а):Ну, например, вот так:

bool HasZeroes( const unsigned* array, unsigned size )
{
unsigned result = 1;
for( ; size != 0; --size,++array ) result &= *array-1^*array;
return result == 0;
}

Компилировать и запускать не пытался, так что больно не драться, если что. Просто демонстрирует идею.
я чего по всему массиву идти - нашел первый ноль и выходи.

bool HasZeroes( const unsigned* array, unsigned size )
{
for( ; size != 0; size--,array++ )
{
if(*array == 0)
return true
}
return false;
}
Ответить