Я хотел бы знать временную сложность следующего кода. Если это не постоянное время, какое решение лучше?
static bool powerOfTwo(double number)
{
double log = Math.Log(number, 2);
double pow = Math.Pow(2, Math.Round(log));
return pow == number;
}
да, это постоянное время O(k)
, где k постоянно
Это постоянное время, но это не самое быстрое решение с постоянным временем. Если нас устраивают неправильные ответы на В самом деле небольших double
(то есть субнормальных)
long bits = BitConverter.DoubleToInt64Bits(number);
return (bits & 0xfffffffffffffL == 0L) && number != 0.0;
Мы просто вытаскиваем мантиссу и проверяем, что она равна нулю (ну, на самом деле 1, потому что на всех обычных двойниках есть неявная 1). Если это правда, число должно быть степенью двойки или 0. Если вы хотите, чтобы это работало для субнормальных чисел, это немного больше работы.
Это постоянное время. О (1).