《趣学算法》阅读笔记(二)

简介: 《趣学算法》阅读笔记(二)

14天阅读挑战赛

话不多说,我们接着上篇文章 《趣学算法》阅读笔记(一),继续总结学习

1. 第一章 算法之美

1.3 哥德巴赫猜想的证明

哥德巴赫猜想:任一大于2的偶数,都可表示成两个素数之和。
验证:2000以内大于2的偶数都能够分解为两个素数之和。

class Main {
    public static void main(String[] args) {
        System.out.println(isPass(2000));
    }

    /**
     * 哥德巴赫猜想:任一大于2的偶数,都可表示成两个素数之和。
     * 
     * @Title: isPass
     * @Description:验证:2000以内大于2的偶数都能够分解为两个素数之和。
     * @author: itbird
     * @date 2022年10月19日 下午8:42:52
     * @param n
     * @return boolean 时间复杂度: O((n^2)logn) 空间复杂度: O(N)
     */
    public static boolean isPass(int n) {
        if (n <= 3) {
            return false;
        }
        // 4为第一个大于2的偶数
        for (int i = 4; i <= n; i = i + 2) {
            if (!isDecomposeForTwoPrime(i)) {
                return false;
            }
        }
        return true;
    }

    /**
     * 是否可以分解为两个素数只和
     * 
     * @Title: isDecomposeForTwoPrime
     * @Description:
     * @author: itbird
     * @date 2022年10月20日 上午9:19:42
     * @param i
     * @return boolean 时间复杂度: O(nlogn) 空间复杂度: O(1)
     */
    private static boolean isDecomposeForTwoPrime(int i) {
        for (int j = 2; j < i; j++) {
            if (isPrime(j) && isPrime(i - j)) {
//                System.out.println(j + "  " + (i - j));
                return true;
            }
        }
        return false;
    }

    /**
     * 是否为一个素数 ,1和本身
     * 
     * @Title: isPrime
     * @Description:
     * @author: itbird
     * @date 2022年10月20日 上午9:23:01
     * @param j
     * @return boolean 时间复杂度: O(logn) 空间复杂度: O(1)
     */
    private static boolean isPrime(int j) {
        for (int i = 2; i <= Math.sqrt(j); i++) {
            if (j % i == 0) {
                return false;
            }
        }
        return true;
    }
}

1.4 时间复杂度如何求取?

求解算法的时间复杂度的具体步骤是:

  • 找出算法中的基本语句:即算法中执行次数最多的那条语句,通常是最内层循环的循环体。
  • 计算基本语句的执行次数的数量级;
  • 用大Ο记号表示算法的时间性能。

例子1:O(1) 算法
此代码只需要执行一次,时间复杂度为O(1)。

int i = 1;
print("i = %d \n", i);

例子2:O(n) 算法
循环求和算法, 这个算法需要执行n次O(1)的打印操作,因此
在这里插入图片描述

for(int i=0; i<N; i++){
   printf("i = %d \n", i);
}

例子3: O(n^2)算法
嵌套循环求和算法,这个算法需要执行N*N此O(1)的打印操作,因此
在这里插入图片描述

for(int i=0; i<N; i++){
   for(int j=0; j<N; j++){
      printf("i = %d, j = %d \n", i, j);
   }
}

例子4: O(logN)算法
在while循环里面,每次都将 i 乘以 2,乘完之后,i 距离 n 就越来越近了。假设循环x次之后,i 就大于 n 了,此时这个循环就退出了,也就是说 2 的 x 次方等于 n,那么 x = log2n,也就是说当循环 log2n 次以后,这个代码就结束了。因此这个代码的时间复杂度为:O(logn)。

int i = 1;
while(i<n)
{
    i = i * 2;
}
目录
相关文章
|
6天前
|
算法 搜索推荐 Java
数据结构与算法(Java篇)笔记--希尔排序
数据结构与算法(Java篇)笔记--希尔排序
|
6天前
|
机器学习/深度学习 存储 算法
【算法沉淀】刷题笔记:并查集 带权并查集+实战讲解
【算法沉淀】刷题笔记:并查集 带权并查集+实战讲解
|
6天前
|
搜索推荐
排序算法笔记
排序算法笔记
26 0
|
6天前
|
算法 搜索推荐 Java
数据结构与算法(Java篇)笔记--快速排序
数据结构与算法(Java篇)笔记--快速排序
|
6天前
|
机器学习/深度学习 算法 搜索推荐
数据结构与算法(Java篇)笔记--归并排序
数据结构与算法(Java篇)笔记--归并排序
|
6天前
|
算法 搜索推荐 Java
数据结构与算法(Java篇)笔记--选择排序
数据结构与算法(Java篇)笔记--选择排序
|
6天前
|
存储 搜索推荐 算法
【排序】软考笔记:简要回顾下常见的几种排序算法
【排序】软考笔记:简要回顾下常见的几种排序算法
52 0
【排序】软考笔记:简要回顾下常见的几种排序算法
|
6天前
|
存储 算法 Java
数据结构与算法笔记(一)
数据结构与算法笔记(一)
105 0
|
6天前
|
算法
链表算法笔记
链表算法笔记
26 0
|
6天前
|
XML 算法 前端开发
北大陈斌Python算法笔记(二)
北大陈斌Python算法笔记(二)
39 0