数据结构与算法基础认识

此博客只用于个人复习用

先上大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
}

  

posted @ 2021-12-11 17:30  纯、臻  阅读(38)  评论(0编辑  收藏  举报