数据结构与算法入门基础
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/ 对算法特别热爱的可以关注下

浙公网安备 33010602011771号