Здравствуйте, меня зовут Сяо Хуанг, я люблю программировать, инженер-разработчик Java в компании-единороге. Спасибо за возможность встретить в огромном море людей, Как говорится: когда ваших талантов и способностей недостаточно для осуществления вашей мечты, пожалуйста, успокойтесь и учитесь. Я надеюсь, что вы, отличные специалисты, сможете учиться со мной, усердно работать вместе и воплотить в жизнь свои собственные мечты.
Введение
Сегодня в ежедневном вопросе о силовой пряжке есть заголовок:
给定一个 正整数 num ,编写一个函数,如果 num 是一个完全平方数,则返回 true ,否则返回 false 。
进阶:不要 使用任何内置的库函数,如 sqrt 。
Знаменитый квадратный корень, легендарный итерационный метод Ньютона, давайте посмотрим, как он реализован в этой статье!
2. Итерационный метод Ньютона
Итерационный метод Ньютона, также известный как метод Ньютона-Рафсона, был на самом деле независимо предложен Ньютоном и Рафсоном (еще одним парнем, которого скрывало имя Ньютона).
Идея, предложенная методом Ньютона-Рафсона, заключается в следующем.Использование касательной - это линейность кривойприблизиться к этой идее.
Ньютон и Рафсон думали, как проста тангенс, как легко его изучать, поскольку тангенс можно приблизить к кривой, я могу непосредственно изучать корень тангенса.
как показано на рисунке:
Для корней вышеуказанных функций мы знаем:x = 0
Как рассчитать с помощью метода итераций Ньютона?
- F(x) = x * x
- F'(x) = 2 * x
Во-первых, итерационный метод Ньютона найдет такую точку, какx0,отx0Проведите прямую к кривой, пересекающейся в точкеA, сделай что-нибудьAКасательная пересекается в точкеx1
В этом случае мы можем получить три балла:х1, х0, А
Пусть координаты точки А(х0, х0 * х0), координаты точки x1 равны(х1, 0)
По координатам точки А и точки х1 можно найти наклон прямой:K = (x0 * x0) / (x0 - x1)
Упрощено, чтобы получить:
- x0 - x1 = ( x0 * x0) / K
- x0 - x1 = F(x0) / F'(x0)
- x0 - x1 = x0 / 2
- x1 = x0 / 2
Проделаем ту же операцию выше с точками x1 и получим:
- x2 = x1 / 2
Мы проделаем вышеуказанные операции без ограничений, и в итоге мы получим формулу:Xn+1 = Xn / 2
Когда нет итераций, нашxзначение будет стремиться к 0
3. Квадратный корень
Как мы сказали выше, дляF(x) = x * x, окончательный результат:Xn+1 = Xn / 2
Мы думаем, для квадратного корня:x * x = num
Можете ли вы преобразовать его во что-то вроде:F(x) = x * x - num,F'(x) = 2 * x, найти пересечение этой функции
Используя метод итерации Ньютона, о котором мы упоминали выше, мы можем узнать, что:Предполагать
F1указать на(x0,x0 * x0 - num),x1указать на(x1,0)
но:
- K = (x0 * x0 - num) / (x0 - x1)
- x0 - x1 = (x0 * x0 - num) / K
- x0 - x1 = F(x0) / F'(x0)
- x0 - x1 = x0 / 2 - num / (2 * x0)
- x1 = x0 / 2 + num / (2 * x0)
Повторите две точки x1 и x2 таким же образом, чтобы получить:x2 = x1 / 2 + num / (2 * x1)
получить формулу:Xn+1 = Xn / 2 + num / 2 * Xn
Проще говоря, выберите начальное значение x, выполните бесконечную итерацию и, наконец, найдите его квадратный корень.
F(x) = x * x - numСвойства выпуклой функции, окончательный результат должен быть:x = sqrt(num)
наш первыйxможно принять непосредственно заnum,потому чтоnum >= sqrt(num)
Вообще говоря, можно судить, меньше ли разница между результатами двух соседних итераций очень малого неотрицательного числа, которое обычно можно принять как1e-6или1e-7
В-четвертых, реализация кода
public boolean isPerfectSquare(int num) {
if(num == 1){
return true;
}
double ans = num;
double dir = num;
while(ans * ans - dir >= 1e-6){
ans = ans / 2 + dir / (2 * ans);
}
int x = (int)ans;
return x * x == num;
}
V. Резюме
Проще говоря, итерационный метод Ньютона постепенно приближается к определенному целевому значению посредством непрерывной итерации.
Тема первая:367. Эффективные идеальные квадраты
Заинтересованные друзья могут это сделать.квадратный кореньВопрос, который больше всего хочет услышать интервьюер:牛顿迭代法, наотмашь, чтобы дать ему волну процесса рассуждения, и прямо увлечь интервьюера.
Для тех, кто интересуется исходным кодом, вы можете следить爱敲代码的小黄Публичный аккаунт, ответ:Исходный код алгоритмаИсходный код алгоритма можно получить
Содержание этого выпуска находится здесь, а в следующем выпуске будетМинимальное остовное дерево (Prim, Kruskal)алгоритм.
Я Java-разработчик в компании-единороге. Надеюсь на ваше внимание. Если у вас есть какие-либо вопросы, вы можете оставить сообщение или личное сообщение и добавить меня в WeChat. До встречи в следующем выпуске!