Какова временная сложность следующего кода Power Of Two? - PullRequest
0 голосов
/ 02 мая 2018

Я хотел бы знать временную сложность следующего кода. Если это не постоянное время, что является лучшим решением?

static bool powerOfTwo(double number)
{
    double log = Math.Log(number, 2); 
    double pow = Math.Pow(2, Math.Round(log));
    return pow == number;
}

1 Ответ

0 голосов
/ 02 мая 2018

Это постоянное время, но это не самое быстрое решение с постоянным временем. Если мы довольны неправильными ответами на действительно малых double с (то есть субнормальных)

long bits = BitConverter.DoubleToInt64Bits(number);
return (bits & 0xfffffffffffffL == 0L) && number != 0.0;

Мы просто вытаскиваем мантиссу и проверяем, что она равна нулю (ну, на самом деле, 1, потому что есть неявная 1 на всех обычных двойных числах). Если это правда, число должно быть степенью двойки или 0. Если вы хотите, чтобы это работало для ненормальных чисел, это немного больше работы.

...