什么是数据结构?
首先了解一下数据结构,拆开来看,结构就是一个架子,类似于盖房子,三室一厅两卫或者两室一厅一卫。数据就是这个结构内填充的材料。放在计算机来说,就是 计算机存储或者组织数据的方式。 数据是往前存,还是往后存,还是存在中间。
什么是算法?
算法就是解决问题的方式,一种思路。 比如一套房子,如何堆放材料,最方便,最省空间,利用率最高。这个思路就是算法。 比如说玩游戏的时候,游戏里有地图,这个地图就是数据结构,行走的线路,策略,就是算法。 每一次闯关都是对策略的一次优化,没有固定的套路。 所以算法是一个不断提升的过程,不断的优化,才能把事情做得更好更合理。
时间复杂度
1.是什么?
时间复杂度就是 执行当前算法花费的时间,这个时间是一个大概的预估。
//第一段
const a = '12345';
//第二段
for(i=0;i<10;i++){
......
}
一看两段代码就知道哪段运行的快,哪段运行的慢。第二段肯定比第一段花费的时间要长。
2.有什么作用?
在写代码的过程中,可以大概知道代码运行的时长,快与慢。 在写同一段功能时,有n种不同的算法,开发者可以知道哪种算法花费的时间短,运行效率快,占用的空间少,更合理。
3.怎么表示时间复杂度?
大欧表示法: O(n)
出自《解析数论》
o有很多表示方法: o(1), o(n), o(n^2), o(logn)......
o(1) 指的是 只操作一次,规模为1
// 这段代码的时间复杂度就是o(1), 他只操作一次,并且执行花费的时间不受某个变量的增长而影响的
const a = 1;
const b = 2;
o(n) 指的是 一段代码被操作n次,规模为n,比如一个for循环
// o(n)
let n =100;
for(let i =0; i<n;i++){
console.log('循环的次数',i)
}
o(n^2) 指的是 一段代码被操作n*n次,规模为n的平方,比如两个嵌套的for循环
// o(n^2)
let n =10;
for(let i = 0; i<n;i++){
for(let j =0; j<n;j++){
console.log('乘法表', j + '*' + i + '='+ j * i )
}
}
o(logn)指的是 该算法表示一段代码的操作次数只增加一 但是规模会翻倍。 比如 1+2+4+8+16+32+64...... 所以这是一个非常非常低的时间复杂度。比起o(n)它更接近 o(1)
// o(logn)
let i = 0;
const n = 100;
while(i<n){
i=i*2
}
总结: 时间复杂度越低,运行越快,效率越高。
空间复杂度
1.是什么?
执行当前算法需要占用多少内存空间。
2.怎么表示空间复杂度?
和时间复杂度差不多,使用大欧表示法: o(1), o(n), o(n^2), o(logn)......
o(1) 只占用一块内存空间,不会被其他变量影响。
// o(1)
let a =1;
a++
o(n)
let n =100;
let arr =[];
for(let i =0; i<n;i++){
arr.push(1);
}
o(n^2)
// o(n^2)
let n =10;
let arr = [];
for(let i = 0; i<n;i++){
arr.push([])
for(let j =0; j<n;j++){
arr[i].push('a')
}
}
总结: 时间复杂度和空间复杂度是相辅相成的,时间越短,占用空间越少,代码的运行效率就越高。