数据结构与算法基础认识
此博客只用于个人复习用
先上大O符号所有的复杂度

时间复杂度
时间复杂度为O(1) 的例子:常量或变量的加减乘除

时间复杂度为O(n) 的例子:不嵌套的for while循环

时间复杂度为O(n^2)的例子,循环嵌套两个for
如果一个算法的时间复杂度有O(n)和O(n^2)两种方法,肯定是选时间复杂度更低的一种方法,运行时间更短
时间复杂度为O(logn)和O(nlogn)的例子
logn(二分搜索)
nlogn(排序) :array.sort()
空间复杂度
空间复杂度为O(1)的例子:创建一个变量a为1

空间复杂度为O(n)的例子:
(1)、定义一个长度为n的数组
(2)、定义一个长度为n的set,map
(3)、用for循环生成一个长度为n的链表

空间复杂度为O(n^2)的例子:
二维数组:一维数组每个元素存放一个长度为n的set或map的链表
优化的方法:

链表
单向链表 双向链表 循环链表

双向链表是每个链都有prev和next指向上一个和下一个,注意第一个的prev是null,最后一个的next是null
循环链表是某个链的next指向了前面链的某一个,造成了循环

面试题:链表和数组的区别?
答:链表删除的时候会通过.next去寻找。先找到.next.next ,再删除.next,最后拼接3
如果是数组的话,比如删除了3,后面的位置都要往前跳一位

二叉树,二叉搜索树
二叉树


二叉搜索树(binary search tree)简称BST
什么叫做二叉搜索树:左分支节点一定是小于该节点,右分支节点一定大于该节点


二分搜索

经典二叉搜索(找到target的值的索引)
var search = function (nums,target) {
let left = 0,right = nums.length - 1
while(left <= right){
let mid = left + (right - left)/2
if(nums[mid] === target){
return mid
}else if(nums[mid] < target){
left = mid + 1
}else {
right = mid - 1
}
}
return -1
}

浙公网安备 33010602011771号