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

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

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

Сообщение tiasur »

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

Сообщение aissp »

Есть два способа

(1) обратиться к sz он конечно ето не сделает, но (ежели предскажет пральный бранч) с вероятностью 1/2 получит правильный ответ перебрав только половину членов.

(2) супер способ, выстраиваешь китайцев по количеству совпадающихс количеством чисел в массиве. Строишь их по росту и командуешь, у кого нуль за пазухой выйти из строя.

ЗЫ правдивый ответ никак 8)
tiasur
Маньяк
Сообщения: 1510
Зарегистрирован: 26 фев 2006, 10:00
Откуда: offline

Сообщение tiasur »

предлагается оптимизировать задачу до единственного сравнения. У меня есть мысль перемножить все члены, а потом сравнить их с нулём, но я дико сомневаюсь, что это будет более оптимизированный код?
tiasur
Маньяк
Сообщения: 1510
Зарегистрирован: 26 фев 2006, 10:00
Откуда: offline

Сообщение tiasur »

К примеру если сравнивать побитовое умножение (&=) всех членов?
Последний раз редактировалось tiasur 23 мар 2007, 10:39, всего редактировалось 1 раз.
Аватара пользователя
ajkj3em
Маньяк
Сообщения: 2063
Зарегистрирован: 12 ноя 2006, 06:53

Сообщение ajkj3em »

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

Сообщение tiasur »

и как вто сделать без перебора ?
Я ошибся. В задаче - сделать только одно сравнение.
Аватара пользователя
ajkj3em
Маньяк
Сообщения: 2063
Зарегистрирован: 12 ноя 2006, 06:53

Сообщение ajkj3em »

а тип елементов массива какой ?
и собственно цель какая - избежать сравнений или чтобы быстрее работало ?
Аватара пользователя
aissp
Маньяк
Сообщения: 2710
Зарегистрирован: 07 ноя 2005, 09:51

Сообщение aissp »

правильно ли я понимайт задачу?

Задача типа: написать функцию

bool func(int* qq, size_t size);

которая возвращает true если в массиве qq отсуствуют 0 и false в противном случае. При етом в теле функции отсуствуют какие либо циклы и какие либо другие виды перебора?
Аватара пользователя
Azazello
Житель
Сообщения: 769
Зарегистрирован: 16 янв 2007, 04:31

Сообщение Azazello »

Вообще-то, это тоже перебор элементов в неком роде ;). И даже больше, такой способ заведомо ВСЕ элементы массива перебирает. Простое сравнение может закончиться на первом элементе, если он 0, а Ваш способ с одним сравнением в конце обязан до конца массива умножать.
Быстрее, чем перебор, боюсь, не получится (если найдёте метод - поделитесь, пожалуйста)...
Одно сравнение - sort по модулю по возрастающей и проверить первый элемент (хотя не явно здесь сравнение тоже есть)...
Но можно вообще без сравнения ;):

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

 __try
  {
   for( int  i = 0; i < SizeOfArray; i++ )
    {
     int res = 1 / Array[ i ];
    }
  }
__except( 1 ) // compiler-specific statement to catch SE / EXCEPTION_EXECUTE_HANDLER == 1 on Windows
 {
   cout << "Gotcha, sucker..." << endl;
 }
tiasur
Маньяк
Сообщения: 1510
Зарегистрирован: 26 фев 2006, 10:00
Откуда: offline

Сообщение tiasur »

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

Сообщение ajkj3em »

Azazello писал(а):Но можно вообще без сравнения ;):
это пять :) чем-то напоминает вот это -

http://www.mailcom.com/TemplatedSQRT.html
tiasur
Маньяк
Сообщения: 1510
Зарегистрирован: 26 фев 2006, 10:00
Откуда: offline

Сообщение tiasur »

Azazello писал(а):Вообще-то, это тоже перебор элементов в неком роде ;). И даже больше, такой способ заведомо ВСЕ элементы массива перебирает. Простое сравнение может закончиться на первом элементе, если он 0, а Ваш способ с одним сравнением в конце обязан до конца массива умножать.
Быстрее, чем перебор, боюсь, не получится (если найдёте метод - поделитесь, пожалуйста)...
Одно сравнение - sort по модулю по возрастающей и проверить первый элемент (хотя не явно здесь сравнение тоже есть)...
Но можно вообще без сравнения ;):

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

 __try
  {
   for( int  i = 0; i < SizeOfArray; i++ )
    {
     int res = 1 / Array[ i ];
    }
  }
__except( 1 ) // compiler-specific statement to catch SE / EXCEPTION_EXECUTE_HANDLER == 1 on Windows
 {
   cout << "Gotcha, sucker..." << endl;
 }
Сомневаюсь что Ваше решение оптимизированное vs. с перебором и сравнением каждого члена с 0.
Аватара пользователя
ajkj3em
Маньяк
Сообщения: 2063
Зарегистрирован: 12 ноя 2006, 06:53

Сообщение ajkj3em »

tiasur писал(а):Преадлагается оптимизировать решение с перебором. На перебор ограничений не вводится. А вот сравнений должно быть только одно. Также упоминается что наличие 0 в массиве маловероятно.
типа елемента какой ? int ?
оптимизировать под абстрактный тип нельзя в принципе

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

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

rep scasb/scasw/scasd 
в терминах интелловского ассемблера вряд ли получитcя, а
вто собственно memchr & co. из стандартной библиотеки
Последний раз редактировалось ajkj3em 23 мар 2007, 11:03, всего редактировалось 2 раза.
tiasur
Маньяк
Сообщения: 1510
Зарегистрирован: 26 фев 2006, 10:00
Откуда: offline

Сообщение tiasur »

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

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

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

как вариант, создай класс SmartArray который имеет одно дополнительное проперти есть ли в массиве 0. тогда читать будет быстро, но "перебор" будет на этапе вставки. эсли это допустимо, то все пучком.
Ответить