迭代法笔记

使用语言:java

大体上,迭代法可以运用在以下几个方面:

  1. 求数值的精确或者近似解。典型的方法包括二分法(Bisection method)和牛顿迭代法(Newton’s method)。
  2. 在一定范围内查找目标值。典型的方法包括二分查找。
  3. 机器学习算法中的迭代。相关的算法或者模型有很多,比如 K- 均值算法(K-means clustering)、PageRank 的马尔科夫链(Markov chain)、梯度下降法(Gradient descent)等等。迭代法之所以在机器学习中有广泛的应用,是因为很多时候机器学习的过程,就是根据已知的数据和一定的假设,求一个局部最优解。而迭代法可以帮助学习算法逐步搜索,直至发现这种解。

1.求数值的精确或者近似解


public class Lesson3_2 {
 
 /**
    * @Description: 计算大于1的正整数之平方根
    * @param n-待求的数, deltaThreshold-误差的阈值, maxTry-二分查找的最大次数
    * @return double-平方根的解
    */
    public static double getSqureRoot(int n, double deltaThreshold, int maxTry) {
     
     if (n <= 1) {
      return -1.0;
     }
     
     double min = 1.0, max = (double)n;
     for (int i = 0; i < maxTry; i++) {
      double middle = (min + max) / 2;
      double square = middle * middle;
      double delta = Math.abs((square / n) - 1);
      if (delta <= deltaThreshold) {
       return middle;
      } else {
       if (square > n) {
        max = middle;
       } else {
        min = middle;
       }
      }
     }
     
     return -2.0;

    }
}

测试:

public static void main(String[] args) {
  
  int number = 10;
  double squareRoot = Lesson3_2.getSqureRoot(number, 0.000001, 10000);
  if (squareRoot == -1.0) {
   System.out.println("请输入大于1的整数");
  } else if (squareRoot == -2.0) {
   System.out.println("未能找到解");
  } else {
   System.out.println(String.format("%d的平方根是%f", number, squareRoot));
  }
  
 }

2.在一定范围内查找目标值

import java.util.Arrays;

public class Lesson3_3 {
 
 /**
    * @Description: 查找某个单词是否在字典里出现
    * @param dictionary-排序后的字典, wordToFind-待查的单词
    * @return boolean-是否发现待查的单词
    */
    public static boolean search(String[] dictionary, String wordToFind) {
     
     if (dictionary == null) {
      return false;
     }
     
     if (dictionary.length == 0) {
      return false;
     }
     
     int left = 0, right = dictionary.length - 1;
     while (left <= right) {
      int middle = (left + right) / 2;
      if (dictionary[middle].equals(wordToFind)) {
       return true;
      } else {
       if (dictionary[middle].compareTo(wordToFind) > 0) {
        right = middle - 1;
       } else {
        left = middle + 1;
       }
      }
     }
     
     return false;

    }

}

检验:

public static void main(String[] args) {
  
  
  String[] dictionary = {"i", "am", "one", "of", "the", "authors", "in", "geekbang"};
  
  Arrays.sort(dictionary);

  String wordToFind = "i";
  
  boolean found = Lesson3_3.search(dictionary, wordToFind);
  if (found) {
   System.out.println(String.format("找到了单词%s", wordToFind));
  } else {
   System.out.println(String.format("未能找到单词%s", wordToFind));
  }
  
 }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值