Страница 1 из 7

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

Добавлено: 23 мар 2007, 09:24
tiasur
Как проверить массив на наличие там нуля не перебирая его члены?

Добавлено: 23 мар 2007, 09:51
aissp
Есть два способа

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

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

ЗЫ правдивый ответ никак 8)

Добавлено: 23 мар 2007, 10:06
tiasur
предлагается оптимизировать задачу до единственного сравнения. У меня есть мысль перемножить все члены, а потом сравнить их с нулём, но я дико сомневаюсь, что это будет более оптимизированный код?

Добавлено: 23 мар 2007, 10:26
tiasur
К примеру если сравнивать побитовое умножение (&=) всех членов?

Добавлено: 23 мар 2007, 10:28
ajkj3em
tiasur писал(а):У меня есть мысль перемножить все члены
и как вто сделать без перебора ?

Добавлено: 23 мар 2007, 10:31
tiasur
и как вто сделать без перебора ?
Я ошибся. В задаче - сделать только одно сравнение.

Добавлено: 23 мар 2007, 10:45
ajkj3em
а тип елементов массива какой ?
и собственно цель какая - избежать сравнений или чтобы быстрее работало ?

Добавлено: 23 мар 2007, 10:46
aissp
правильно ли я понимайт задачу?

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

bool func(int* qq, size_t size);

которая возвращает true если в массиве qq отсуствуют 0 и false в противном случае. При етом в теле функции отсуствуют какие либо циклы и какие либо другие виды перебора?

Добавлено: 23 мар 2007, 10:47
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;
 }

Добавлено: 23 мар 2007, 10:50
tiasur
Преадлагается оптимизировать решение с перебором. На перебор ограничений не вводится. А вот сравнений должно быть только одно. Также упоминается что наличие 0 в массиве маловероятно.

Добавлено: 23 мар 2007, 10:51
ajkj3em
Azazello писал(а):Но можно вообще без сравнения ;):
это пять :) чем-то напоминает вот это -

http://www.mailcom.com/TemplatedSQRT.html

Добавлено: 23 мар 2007, 10:53
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.

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

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

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

rep scasb/scasw/scasd 
в терминах интелловского ассемблера вряд ли получитcя, а
вто собственно memchr & co. из стандартной библиотеки

Добавлено: 23 мар 2007, 10:59
tiasur
int

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

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