Алго для поиска непрерывных предметов в лог (N) времени

0

Кто-нибудь имеет краткий ответ для этого ниже? Я видел это на кубке. http://www.careercup.com/question?id=4860021380743168

Учитывая двоичное представление целого числа, скажем, 15 как 1111, найдите максимальную длинную непрерывную последовательность 0s. Твист - это нужно сделать в log N.

Например. 10000101 ответ должен быть 4, потому что есть 4 непрерывных нуля.

Если у вас есть ответ в c++, который был бы лучше для меня

  • 0
    Что такое N? Количество бит в целом числе? Или само целочисленное значение?
  • 0
    Я думаю, что в этом и заключается мое замешательство ... похоже, вопрос не очень хорошо сформулирован.
Показать ещё 3 комментария
Теги:
algorithm

2 ответа

5
Лучший ответ

Довольно тривиально, просто переходите через двоичную нотацию, один линейный проход. Бинарная нотация имеет длину log(N), поэтому потребуется время log(N).

  • 0
    Какая?? Пять голосов за такой супер-банальный ответ ?? У меня есть сотни других, очень трудоемких ответов, которые не получили ни одного отзыва! :-)
0

Похоже, это было задано раньше.

Однако, когда я чувствую потребность в бит-twiddling, я достигаю своей копии несравненного Hackers Delight. Как оказалось, в нем содержатся обсуждения по поиску самой длинной строки из 1 бита, включая "логарифмическую" реализацию, которая может быть использована здесь на входе бит /flipped (not):

int fmaxstr0(unsigned x, int *apos) {
   // invert bits.
   x = ~x;

   unsigned x2, x4, x8, x16, y, t;
   int s;

   if (x == 0) {*apos = 32; return 0;}
   x2 = x & (x << 1);
   if (x2 == 0) {s = 1; y = x; goto L1;}
   x4 = x2 & (x2 << 2);
   if (x4 == 0) {s = 2; y = x2; goto L2;}
   x8 = x4 & (x4 << 4);
   if (x8 == 0) {s = 4; y = x4; goto L4;}
   x16 = x8 & (x8 << 8);
   if (x16 == 0) {s = 8; y = x8; goto L8;}
   if (x == 0xFFFFFFFF) {*apos = 0; return 32;}
   s = 16; y = x16;

L16: t = y & (x8 << s);
     if (t != 0) {s = s + 8; y = t;}
L8:  t = y & (x4 << s);
     if (t != 0) {s = s + 4; y = t;}
L4:  t = y & (x2 << s);
     if (t != 0) {s = s + 2; y = t;}
L2:  t = y & (x  << s);
     if (t != 0) {s = s + 1; y = t;}
L1:  *apos = nlz(y);
   return s;
}

Повеселись!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню