前段时间因为准备考试,学习了数据结构与算法,现在整理下笔记,并对其进行补充,确实,考试考的和工作中实际中用到的还是有很大区别,
为什么学习数据结构与算法
众所周知 程序=数据结构+算法,尽管这段时间被力扣折磨的生不如死,还是昧着良心说:算法是一个项目中最美丽的风景。
为什么要学算法?
- 找工作面试的时候算法是必考的
- 熟练掌握数据结构和算法知识更帮助我们在日常开发中写出更好的代码
- 能锻炼逻辑思维能力
什么是算法?什么是数据结构?
算法,是一种解决问题的思路和方法。形象一点说,算法是解决问题的方式,而数据结构是解决问题的工具。例如,我们要拧一颗螺丝,那么我们可以选择用扳手拧,也可以选择用钳子拧,区别很明显,用扳手拧更省力吧
我们常用的基本数据结构有:线性结构和非线性结构;
常见的线性结构有 数组、链表、栈、队列
非线性结构:树,图,
常用的算法也有许多,我目前只学了二分。后面再来补充
如何衡量算法的优劣
算法的优劣主要是通过时间复杂度和空间复杂度来进行衡量的
时间复杂度
例如实现同样的功能,使用不同的数据结构和算法 假设:
代码A 需要执行100ms,占用100MB空间
代码B 需要执行1000ms,占用1000MB空间
显然,代码A更好,但是我们在日常开发中又不能通过运行代码的方式来计算所需要的时间和空间,所以我们只能通过预估代码的执行次数来计算大致的时间复杂度;
例如下面这段代码的打印语句需要执行n次,因为是受n的影响
public static void main(String[] args) {
int n=100;
int[] nums=new int[n];
for(int i=0;i<n;i++){
nums[i]=i;
}
}
所以用大O表示法 计为O(n)
下面这个代码的复杂度是n*n
int n=100;
int[][] nums=new int[n][n];
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
nums[i][j]=i*j;
}
}
那么就计为O(n平方)
常见的复杂度并不多,从低阶到高阶有: O(1)、 O(logn)、 O(n)、 O(nlogn)、 O(n平方 )。
空间复杂度
在运行一段程序的时候,我们不仅要进行各种计算,还有根据需要暂存一些中间数据,这些中间数据暂存消耗的内存就是空间复杂度
空间复杂度又分为以下几种:
常量空间
public static void main(String[] args) {
int n=1;
int n=2;
}
线性空间
public static void main(String[] args) {
int[] list=new int[10];
}
二维空间
public static void main(String[] args) {
int[][] list=new int[10][10];
}
递归空间
void fn(int n){
if(n<=1){
return;
}
fn(n-1);
}
时间复杂度与空间复杂度的取舍
按照目前的计算机系统来说,内存越来越大,也越来越不值钱,所以我们一般都选择用空间换时间。当然具体情况具体分析,我们一般在做题的时候,二者都要兼顾,寻找最优解才是最终目标;