数据结构与算法入门基础

 

1、为什么要学习数据结构与算法呢?

 

思考这样一道题目:

判断一个数是否是2的N次方? 如 2 4 8 16是 6 10 不是

思路: 看这个数能不能拆成N个2相乘

/**
* 判断一个数是否是2的N次方
* @param num
* @return
*/
public static boolean isTwoToThePowerOfN(int num){
  while(num%2==0){
     num = num/2;
  }
  if(num==1){
     return true;
  }
  return false;
}

 

但这个不是最优解,我们看到2的时候,要有数据进制的感念,也就是二进制(计算机基础知识),先看下这几个数在计算机存储的形式

2:10

4:100

8:1000

16:10000

再看一组数

1:01

2:10 --》 10 & 01 == 0

3:011

4:100 --》 100 & 001 == 0

7:0111

8:1000 --》 1000& 0111 == 0

15:01111

16:10000 --》 10000 & 01111 == 0

大家发现规律没有,通过按位与运算我们可以优化成这样的代码

/**
* 判断一个数是否是2的N次方 按位与运算
* @param num
* @return
*/
public static boolean isTwoToThePowerForAndByBit(int num){
  if((num & (num-1)) == 0){
     return true;
  }
  return false;
}

所以有了数据结构与算法思想,就可以想出更高效的解决问题的思路。

回答问题1

1、不想一辈子做crud工程师

2、程序员往架构师发展,需要掌握能写出架构级、框架级、开源级代码的能力

3、大公司如bat面试都会问

4、提升自己的能力,不被行业淘汰

 

什么是数据结构?什么是算法?

数据结构就是一个能组合到一起的集合对象,如数组 链表 队列等

算法就是解决问题

 

算法的特征:

有穷性 确定性 可行性 有输入输出

设计的原则:

正确性、可读性、健壮性(少bug) :写出来的代码bug很少,而且系统比较稳定

 

高效率低存储

 

评价算法的两个重要的指标:

时间复杂度:运行一个程序所花费的时间。O()

空间复杂度:运行程序所需要的的内存。OOM

 

一、时间复杂度

1、时间复杂度的计算的意义?

接口、功能测试,压测,冒烟,需要测试环境依赖,流程很长,如果数据或者配置没对会导致测试有问题,所以我们应该根据自己的代码自己去用代码分析,也就是时间复杂度

2、时间复杂度的表示方法:大O表示法 O(n) O(logn) O(nlogn) O(1) ...... O(n的表达式)

3、时间复杂度如何分析

1)寻找for while 循环,而且是循环最大的

2)同级循环怎么算?

4、几种常见的时间复杂度分析:时间复杂度往往是计算比较大的,而且是不确定的数,如果已经确定了,那就不用计算了,也就是我们所说的常量

1)常数 O(1) 1表示常数,所有能确定的数字,我们都用O(1)表示 O(100000)=》O(1)

int a=1

for(int i=0;i<3;i++){

  a = a+1;

}

2)对数 O(logn) 二分查找

int n = xxx;

int i = 1;

while(i<=n){

  i=i*2

}

i的数是:2 4 8 16 32 =》2^0 2^1 2^2 2^3 ......2^n

2^x=n => 求出x= log2n 计算机忽略常数 => logn

 

3)线性 O(n)

int n = xxx;

for(int i=0;i<n;i++){

  a=a+1;

}

4)线性对数 O(nlogn)

int n = xxx;

int i = 1;

for(int j = 0;j<n;j++){

  while(i<=n){

    i=i*2

  }

}

这个是 nlogn

5)平方O(n^2) 冒泡排序

for(int j = 0;j<n;j++){

  for(int i = 0;i<n;i++){

    a=a+1;

  }

}

冒泡排序

for(int i= 0;i<n;i++){

  for(int j= i; j < n; j++){

    a=a+1;

  }

}

n*(n+1)/2 ==> 忽略常数 ==》 n^2 有加减法取最大的

6)N平方 O(n^n)

总结:分析程序,首先去找运行次数最多的地方

1、有循环的地方

2、有网络请求(RPC,远程调用,分布式,数据库请求)

学了时间复杂度后,我们的目标是要把代码写到最优,效率最高:

O(1)>O(logn)>O(n)>O(nlogn)>O(n^2)>O(n^x) 优化的方案是往O(1)的方向靠近

O(1)>O(logn)>O(n)>O(nlogn) 效果都是很好的

二、空间复杂度

1、空间复杂度分析的意义: 找花了内存的地方,也就是数据

2、如何找出空间复杂度:开了空间的地方,如 数组 链表 缓存对象 递归

 

某老师推荐的书:

数据结构: 1、严蔚敏版 数据结构与算法(大学时期学过,全部还给老师了) 2、大话数据结构

算法:1、基础:算法竞赛入门经典

练习网站:

力扣 https://leetcode-cn.com/leetbook/

北京大学 http://poj.org/ 对算法特别热爱的可以关注下

杭州电子科技大学 http://acm.hdu.edu.cn/ 对算法特别热爱的可以关注下

 

 

 

posted @ 2021-01-12 20:05  一只很菜的菜鸟  阅读(440)  评论(0)    收藏  举报