算法与数据结构简介(一)

算法与数据结构简介

为什么学习算法与数据结构?

  • 掌握常用的算法和数据结构,可以提升代码的运行效率
  • 功利性目的,找到更好的工作
  • 喜欢上算法,理解并运用它,在编程领域,拥有雄厚的“内功”

区块链

区块链就是算法中的树+单向链表
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

如何有效学习算法与数据结构

有一本书叫《异类—不一样的成功启示录》,作者 马尔科姆·格拉德威尔提出来:一万个小时定律,以及精通一个领域所要做的3点内容

  1. 切碎知识点
  2. 刻意练习
  3. 反馈(LeetCode\GitHub看高手的代码)
    在这里插入图片描述

算法的分类

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

切题四件套

  1. 明确题目意思
  2. 想好可能的解决方案
    (1)比较时间复杂度和空间复杂度
    (2)最佳解
  3. 多写多练
  4. 测试

时间复杂度&&空间复杂度

在这里插入图片描述

在这里插入图片描述
阶乘 >> 指数 >> 立方 >> 平方 >> 线性 >> 对数 >> 常数

O(n!)   O(2^n)   O(n^3)   O(n^2)   O(n)   O(log n)   O(1)
注意点:多种复杂度的情况,只看最高复杂度即可

O(1):

  int  n = 100;
  System.out.println("结果是:" + n);

O(1):

  int  n = 100;
  System.out.println("结果一是:" + n);
  System.out.println("结果二是:" + n);
  System.out.println("结果三是:" + n);

O(N):

  int n =100;
  for(int i = 1; i <= n; i++){
    System.out.println("结果是:" + i);
  }

O(N^2):

  int n =100;
  for(int i = 1; i <= n; i++){
     for(int j = 1; j <= n; j++){
        System.out.println("结果是:" + i + "&&" + j);
     }
   }

O(log(N)):

   int n =100;
   for(int i = 1; i < n; i * 2){
      System.out.println("结果是:" + i);
   }

O(2^N):

   int n =100;
   for(int i = 1; i <= Math.pow(2,n); i++){
       System.out.println("结果是:" + i);
   }

O(N!):

   int n =100;
   for(int i = 1; i <= factorial(n); i++){
       System.out.println("结果是:" + i);
   }

举例说明

在这里插入图片描述S(n) = 1+2+3+…+n
S(n) = n+(n-1)+…+1
推导出:2S(n) = n(n+1)
S(n) = n(n+1)/2 即等差数列S(n) = n(a1+an)/2 || Sn=n*a1+n(n-1)d/2

在这里插入图片描述斐波拉契公式,前两项和等于后一项

在这里插入图片描述

从递归推断时间复杂度:主定理公式(英语:master theorem)

常用的递归算法的时间复杂度:

二分查找:        O(log n)
二叉树遍历:       O(n)
最优排序矩阵:     O(n)
快排/归并排序:    O(n log n)
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值