【学习笔记】在刷题前--数据结构和操作
数据结构和操作
复杂度
1.算法的时间复杂度
大O表示法,常数的就不要了,主要是去看循环,看循环体循环了多少次。其实就是主要去关注控制循环结束的条件,for里对应很多的n,n^2; while里循环条件如果有涉及到了循环体,有很多是logN;
2.算法的空间复杂度
主要去关注变量,尤其是数组;然后去关注递归;
数据结构
1.数组Array
连续的; 相同类型的; -> 读多写少;
1.1 复杂度
访问 access:根据索引找元素:O(1);
搜索 search:在整个数组里去找元素:O(N);
插入 insert:O(N);
删除 delete:O(N);
1.2 java中数组常用操作
1.3 python中数组常用操作
1.4 常见注意
- 1、数组中经常有一类题型:往往和字符串结合起来比如找出某某子数组或者子串,其和为多少等等,这时候常用前缀和去解,即 连续子数组+和 --> 前缀和;连续子串+最值 --> 滑动窗口
- 2、如果看到要在有序数组中找某个值,那就用二分查找去解,即有序数组+搜索 --> 二分查找;
2.链表Linked List
不连续的; 相同类型的; -> 写多读少;
2.1 复杂度
访问 access:根据索引找元素:O(N);
搜索 search:在整个数组里去找元素:O(N);
插入 insert:O(1);
删除 delete:O(1);
2.2 java中链表常用操作
2.3 python中链表常用操作
3.队列Queue/Deque
排队 -> 先到先得,先进先出
3.1 复杂度
访问 access:根据索引找元素:O(N);
搜索 search:在整个数组里去找元素:O(N);
插入 insert:O(1);
删除 delete:O(1);
3.2 java中队列常见操作
3.3 python中队列常用操作
4.栈stack
箱子 -> 先进后出
4.1 复杂度
访问 access:只访问栈顶:O(1);
搜索 search:在整个数组里去找元素:O(N);
插入 insert:O(1);
删除 delete:O(1);
4.2 java中栈常用操作
4.3 python中栈常见操作
4.4 栈的常见注意
1、栈往往会用来解决那种两两匹配,两两抵消消消乐的问题,比如常见的有效括号等,就是判断后入栈的相邻元素是否有相互关系能够相互抵消,
5.哈希表HashTable
键值对 key-value
5.1 复杂度
访问 access:无;
搜索 search:O(1); 如果碰撞:O(K) K为碰撞的个数
插入 insert:O(1);
删除 delete:O(1);
5.2 java中哈希表常用操作
5.3 python中哈希表常用操作
5.4 常见注意
- 哈希表在刷题的时候常常会用在涉及到次数的问题上,比如某个数字或者某个字符出现了几次;
6.集合Set
无序、不可重复 主要作用:查看重复元素
6.1 复杂度
访问 access:无;
搜索 search:无哈希冲突O(1); 有哈希冲突:O(K)
插入 insert:无哈希冲突O(1);有哈希冲突:O(K)
删除 delete:无哈希冲突O(1);有哈希冲突:O(K)
6.2 java中集合常见操作
6.3 python中集合常见操作
6.4 常见注意
- set在刷题的时候常常会用在涉及到有无重复,独一无二,唯一等问题上,比如某个数字是否重复,是否出现过,用的都是set的不可重复性;
6.树Tree
父子关系
概念
- 节点:根节点、叶子节点(度为0的节点);
- 节点的度:一个节点含有的子节点的个数;
- 树的度:最大的节点的度;
- 二叉树:每个节点最多有两个孩子;节点的度可以为0,1,2;
- 满二叉树:除了叶子节点,每个节点都有两个孩子;并且所有叶子节点在一层;
- 完全二叉树:从上到下,从左到右,依次填满;
满二叉树的概念最小;限制最多,满二叉树一定是完全二叉树
性质
1.完全二叉树除了最后一层外,下一层节点个数是上一层两倍,
如果一颗完全二叉树的节点总数是n,那么叶子节点个数为n/2(n为偶数)或(n+1)/2(n为奇数);
遍历
- 前序遍历:根节点 -> 左子树 -> 右子树;
- 中序遍历:左子树 -> 根节点 -> 右子树;
- 后序遍历:左子树 -> 右子树 -> 根节点;
常用
- 二叉树解题的时候往往用到的是递归方法,注意千万不要陷入递归压栈过程中去,就想函数功能,终止条件,一层节点能做什么,什么时候做。
- 深度优先(DFS)与广度优先(BFS): DFS与BFS都是用来遍历的手段,在树和图里都是用这两种方法。
-
- DFS:DFS的意思就是比如说一颗树,就先到树的左节点,然后再往树的左节点,一直到最后走不了了,然后回到上一层,去右节点,再回到上一层,如此往复。对于图,就是去往开始节点的一个邻居节点,然后再去此邻居节点的邻居节点,然后到头,返回上一个,如此往复。所以只要用到DFS肯定会用到递归。
-
- BFS:BFS的意思就是比如说一棵树,到左节点,然后到右节点,然后再到左节点的下一层,右节点的下一层,这样子一层一层的往下走,直到最后一层。对于图,去往源点的邻居节点,把源点的邻居节点都走完之后,再去下一个节点,所以BFS就会用到队列的结构,在树里,把节点入队,然后每次出队,就把出队节点的左右孩子入队,这样做到一层一层遍历。在图里,把源点入队,然后把出队点的邻居节点都入队。这样往复。但是在图里为了防止重复访问,需要设置当前节点是否被访问过。(比如可以设置一个vis数组设置为true或false,或者设置一个哈希表这样)
-
- 在树里经常用DFS,在图里经常用BFS(因为树可以很方便的去递归左右子树,而图则对邻居节点比较方便);
-
- 树和图里的BFS区别:
- 1.树只有一个root,而图可以有多个源点,所有首先需要将多个源点入队。
- 2.树是有向的因此不需要设置标志是否访问过,而对于无向图而言,必须得标志是否访问过!并且为了防止某个节点多次入队,需要在入队前将其设置为已访问!
- 3.一个源点的广度优先和多个源点的广度优先:广度优先搜索
7.堆Heap
7.1 概念
- 前提:完全二叉树
- 根节点全部≥叶子节点:大根堆:堆顶元素最大;
- 根节点全部≤叶子节点:小根堆:堆顶元素最小;
7.2 复杂度
访问 access:无;
搜索 search:查看堆顶元素:O(1);
插入 insert:O(logN):每次添加的元素去和父亲节点做对比;和兄弟节点没有关系;
删除 delete:O(logN)
7.3 java中堆常用操作
7.4 python中堆常用操作
8.图Graph
邻居关系
概念
- 顶点;邻居顶点;边;
- 度(degree):每个顶点有几条边;
- 无向图;
- 有向图:
- 入度:有多少条边指向该顶点;
- 出度:有多少条边指向别的顶点;
- 权重图:
- 求最短路径;
- 贝尔曼-福特算法;
- 迪克斯特拉算法;
- 求最短路径;
总结
数组
链表
队列:先入先出;
栈:后入先出;
堆:最大堆;最小堆;
哈希表: key | value;
哈希集合:无序、不可重复;
树
图
- 知道每个结构的特性;
- 每个结构的增删改查复杂度;
关于排序好的数组;
排序好的数组有以下几种常见的处理方法:
- 1.二分查找:二分查找的使用前提就是数组必须是有序的,这样才能每次取中间值去逼近;二分查找总结
- 2.首尾双指针:首尾双指针也常常用在排序数组上,尤其是涉及到两个数之和时,因为如果和大了或者小了可以去移动首或尾指针;
关于历史信息
- if想要记录历史中的最大值或者最小值,或者是历史中的顺序问题,那总不能再次重新遍历了,往往就会用到优先队列(堆)
比如大根堆:总是维持了历史中的k个最小的,if来的比顶还大,那就直接走,if来的比堆顶小,那就把最大的(堆顶)弹出去,小的进来,这样不断更新堆,也就维持了k个最小的;
__EOF__

本文链接:https://www.cnblogs.com/Curryxin/p/16084454.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了