Content
10 Lessons • 0 Quizzes • 0 Challenges
复杂度度量简介
- 1
比较算法
- 2
示例 1:测量单循环算法的时间复杂度
- 3
示例 2:包含嵌套循环的算法的时间复杂度
- 4
渐近分析与大O表示法简介
- 5
其他常见的渐近符号及其为何大O符号占据主导地位
- 6
实用公式
- 7
常见的时间复杂度情况
- 8
挑战 1:包含加法的嵌套循环的 Big (O) 表示
- 9
解题回顾:嵌套循环加法的时间复杂度(Big O)
- 10
挑战 2:包含减法的嵌套循环的 Big (O) 表示
- 11
解决方案回顾:嵌套循环中带减法操作的时间复杂度
- 12
挑战 3:包含乘法的嵌套循环的 Big (O) 表示法
- 13
解决方案回顾:嵌套循环与乘法的时间复杂度(Big O)
- 14
挑战 4:嵌套循环与乘法(基础)
- 15
解决方案回顾:嵌套循环与乘法(基础)
- 16
挑战 5:嵌套循环与乘法(中级)
- 17
解决方案回顾:嵌套循环与乘法(中级)
- 18
挑战6:嵌套循环与乘法(进阶)
- 19
解决方案回顾:嵌套循环与乘法(进阶)
- 20
挑战 7:嵌套循环与乘法(专业版)
- 21
解决方案回顾:嵌套循环与乘法(专业版)
- 22
复杂度测验:检验你对复杂度的理解
数组简介
- 1
什么是数组?
- 2
多维数组
- 3
挑战 1:从数组中移除偶数整数
- 4
解题回顾:从数组中移除偶数整数
- 5
挑战 2:合并两个有序数组
- 6
解题回顾:合并两个有序数组
- 7
挑战3:找出两个相加等于给定值的数
- 8
解题回顾:找出两个相加等于给定值的数
- 9
挑战 4:数组中所有元素的乘积
- 10
解题回顾:数组中所有元素的乘积
- 11
挑战 5:在数组中查找最小值
- 12
解决方案回顾:在数组中查找最小值
- 13
挑战6:在数组中查找第一个唯一整数
- 14
解决方案回顾:在数组中查找第一个唯一整数
- 15
挑战7:在数组中寻找第二大的值
- 16
解决方案回顾:在数组中查找第二大的值
- 17
挑战8:将数组向右旋转一位
- 18
解决方案回顾:将数组向右旋转一位
- 19
挑战 9:重新排列正负数值
- 20
解题回顾:重新排列正负数值
- 21
挑战 10:将已排序数组重新排列为最大/最小形式
- 22
解题回顾:将已排序数组重新排列为最大/最小形式
- 23
挑战 11:最大和子数组
- 24
解决方案回顾:最大子数组和
- 25
数组测验:检验你对数组的理解
链表简介
- 1
单链表(SLL)
- 2
基本链表操作
- 3
单链表插入
- 4
挑战 1:尾部插入
- 5
解决方案回顾:尾部插入
- 6
挑战 2:在单链表中搜索
- 7
解决方案回顾:在单向链表中搜索
- 8
单链表中的删除操作
- 9
挑战 3:按值删除
- 10
解决方案回顾:按值删除
- 11
链表与数组
- 12
挑战 4:查找链表的长度
- 13
解题回顾:查找链表的长度
- 14
挑战 5:反转链表
- 15
解决方案回顾:反转链表
- 16
挑战6:检测链表中的环
- 17
解决方案回顾:检测链表中的环
- 18
挑战7:寻找链表的中间节点
- 19
解题回顾:查找链表的中间节点
- 20
挑战8:从链表中删除重复项
- 21
解题回顾:从链表中删除重复项
- 22
挑战9:链表的并集与交集
- 23
解决方案回顾:链表的并集与交集
- 24
挑战 10:返回倒数第 N 个节点
- 25
解题回顾:返回倒数第 N 个节点
- 26
双向链表(DLL)
- 27
单向链表与双向链表
- 28
链表测验:检验你对链表的理解
栈与队列简介
- 1
栈(LIFO)简介
- 2
栈(实现)
- 3
队列(FIFO)简介
- 4
队列(实现)
- 5
挑战 1:使用队列生成从 1 到 N 的二进制数
- 6
解决方案回顾:使用队列生成从 1 到 N 的二进制数
- 7
挑战 2:使用一个数组实现两个栈
- 8
解决方案回顾:使用一个数组实现两个栈
- 9
挑战 3:反转队列的前 k 个元素
- 10
解决方案回顾:反转队列中前 k 个元素
- 11
挑战4:使用栈实现队列
- 12
解决方案回顾:使用栈实现队列
- 13
挑战 5:对栈中的值进行排序
- 14
解决方案回顾:对栈中的值进行排序
- 15
挑战6:使用栈计算后缀表达式
- 16
解题回顾:使用栈计算后缀表达式
- 17
挑战 7:使用栈寻找下一个更大元素
- 18
解决方案回顾:使用栈寻找下一个更大元素
- 19
挑战8:使用栈检查括号是否匹配
- 20
解题回顾:使用栈检查括号是否平衡
- 21
挑战 9:使用栈实现 min() 函数
- 22
解决方案回顾:使用栈实现 min() 函数
- 23
栈/队列测验:检验你对栈/队列的理解
图论入门
- 1
图的基本概念与结构
- 2
图的类型
- 3
图的表示
- 4
图的实现
- 5
图操作的复杂度
- 6
什么是二分图?
- 7
图遍历算法
- 8
挑战 1:实现广度优先搜索
- 9
解决方案回顾:实现广度优先搜索
- 10
挑战 2:实现深度优先搜索
- 11
解决方案回顾:实现深度优先搜索
- 12
挑战 3:检测图中的环
- 13
解决方案回顾:检测图中的环
- 14
挑战4:在图中找到一个“母顶点”
- 15
解题回顾:在图中寻找“母顶点”
- 16
挑战 5:计算无向图中的边数
- 17
解决方案回顾:计算无向图中的边数
- 18
挑战6:检查两点之间是否存在路径
- 19
解决方案回顾:检查两点之间是否存在路径
- 20
挑战 7:判断一个无向图是否为树
- 21
解决方案回顾:判断一个无向图是否为树
- 22
挑战8:查找两个顶点之间的最短路径
- 23
解决方案回顾:查找两个顶点之间的最短路径
- 24
挑战 9:移除边
- 25
解决方案回顾:删除边
- 26
图论测验:检验你对图的理解
树结构简介
- 1
树的基本概念与基本性质介绍
- 2
什么是二叉树?
- 3
什么是平衡树?
- 4
关于完全二叉树的更多内容
- 5
倾斜二叉树
- 6
二叉搜索树(BST)
- 7
在 C# 中实现二叉搜索树
- 8
二叉搜索树插入
- 9
二叉搜索树插入(实现)
- 10
在二叉搜索树中进行搜索(实现)
- 11
二叉搜索树中的删除操作
- 12
二叉搜索树中的删除操作(实现)
- 13
前序遍历
- 14
后序遍历
- 15
中序遍历
- 16
AVL 树
- 17
AVL 插入
- 18
AVL 删除
- 19
红黑树是一种自平衡的二叉搜索树,它通过在每个节点上添加一个存储位来表示颜色(红色或黑色),并遵循一组特定的规则来确保树的平衡。这些规则保证了树的高度始终保持在对数级别,从而使得查找、插入和删除操作的时间复杂度为 O(log n)。 红黑树的主要性质包括: 1. 每个节点要么是红色,要么是黑色。 2. 根节点是黑色。 3. 所有叶子节点(空节点)都是黑色。 4. 如果一个节点是红色,则它的两个子节点都必须是黑色(即不能有两个连续的红色节点)。 5. 从任一节点到其所有后代叶子节点的路径上,黑色节点的数量相同(即每条路径上的黑色节点数量相等)。 这些性质共同作用,确保了红黑树在进行插入和删除操作后仍能保持近似平衡,避免了退化为链表的情况。因此,红黑树广泛应用于需要高效动态数据结构的场景中,例如在标准库中实现关联容器(如 C++ 的 std::map 和 std::set)。
- 20
红黑树插入
- 21
红黑树删除
- 22
2-3 树
- 23
2-3 插入
- 24
2-3 树删除操作(情况 #1)
- 25
2-3 树删除操作(情况 #2)
- 26
2-3-4 树
- 27
树结构概述
- 28
挑战 1:在二叉搜索树中查找最小值
- 29
解决方案回顾:在二叉搜索树中查找最小值
- 30
挑战 2:在二叉搜索树中查找第 k 大的值
- 31
解决方案回顾:在二叉搜索树中查找第 K 大的值
- 32
挑战3:在二叉搜索树中查找指定节点的祖先
- 33
解决方案回顾:在二叉搜索树中查找指定节点的祖先节点
- 34
挑战4:查找二叉树的高度
- 35
解决方案回顾:查找二叉树的高度
- 36
挑战 5:查找距离根节点为“k”的节点
- 37
解答回顾:查找距离根节点为“k”的节点
- 38
树结构测验:检验你对树的理解
Trie
- 1
什么是Trie?
- 2
Trie 的结构
- 3
在字典树中插入
- 4
在字典树中搜索
- 5
Trie 中的删除操作
- 6
挑战 1:Trie 中的总单词数
- 7
解决方案回顾:Trie 中的总单词数
- 8
挑战 2:查找字典树中存储的所有单词
- 9
解决方案回顾:在字典树中查找所有存储的单词
- 10
挑战 3:使用字典树进行列表排序
- 11
解决方案回顾:使用字典树进行列表排序
- 12
挑战4:使用字典树从向量中构造单词
- 13
解决方案回顾:使用字典树进行词的生成
- 14
Trie测验:检验你对Trie的理解
堆简介
- 1
简介
- 2
最大堆:简介
- 3
最大堆(实现)
- 4
最小堆:简介
- 5
最小堆(实现)
- 6
挑战 1:将最大堆转换为最小堆
- 7
解题回顾:将最大堆转换为最小堆
- 8
挑战 2:在数组中查找“k”个最小元素
- 9
解决方案回顾:在数组中查找“K”个最小元素
- 10
挑战3:在数组中查找“K”个最大的元素
- 11
解题回顾:在数组中查找“K”个最大的元素
- 12
堆测验:检验你对堆的理解
哈希简介
- 1
哈希与哈希表简介
- 2
哈希函数
- 3
哈希表中的冲突
- 4
从零开始构建哈希表
- 5
哈希表的添加/删除与查找(实现)
- 6
哈希表快速概览
- 7
Trie 与哈希表
- 8
哈希表(HashTable)、字典(Dictionary)和集合(HashSet)都是用于存储键值对或唯一元素的数据结构,它们在功能和性能上各有特点。以下是它们的对比: 1. **HashTable** - 是 .NET Framework 中较早的哈希表实现,属于 System.Collections 命名空间。 - 支持任意类型的键和值(即 `object` 类型),因此需要频繁的装箱和拆箱操作,影响性能。 - 线程不安全,多个线程同时访问时需手动加锁。 - 不推荐在新代码中使用,已被 Dictionary<T, T> 取代。 2. **Dictionary<TKey, TValue>** - 是 .NET Framework 2.0 引入的泛型版本,位于 System.Collections.Generic 命名空间。 - 支持类型安全,键和值类型在编译时确定,避免了装箱/拆箱。 - 性能优于 HashTable,是现代 C# 编程中处理键值对的首选。 - 线程不安全,多线程环境下需额外同步机制。 3. **HashSet<T>** - 用于存储唯一元素的集合,不包含键值对,只关心元素是否存在。 - 内部基于哈希表实现,提供 O(1) 的平均查找、插入和删除时间复杂度。 - 适用于需要快速判断元素是否存在的场景,如去重、集合运算(并集、交集等)。 - 同样线程不安全,多线程使用时需外部同步。 总结: - 若需存储键值对,优先使用 **Dictionary<TKey, TValue>**。 - 若仅需存储唯一元素,应选择 **HashSet<T>**。 - **HashTable** 已过时,除非维护旧代码,否则不应再使用。
- 9
挑战 1:一个数组作为另一个数组的子集
- 10
解决方案回顾:一个数组是否为另一个数组的子集
- 11
挑战 2:检查数组是否互不相交
- 12
解决方案回顾:检查数组是否互不相交
- 13
挑战 3:在数组中查找对称数对
- 14
解决方案回顾:在数组中查找对称数对
- 15
挑战 4:追踪旅程的完整路径
- 16
解决方案回顾:追踪旅程的完整路径
- 17
挑战 5:在数组中找出两对元素,使其和相等
- 18
解题回顾:在数组中找出两对元素,使其和相等
- 19
挑战6:和为0的子数组
- 20
解题回顾:和为 0 的子数组
- 21
挑战7:在数组中查找第一个唯一整数
- 22
解决方案回顾:在数组中查找第一个唯一整数
- 23
挑战 8:使用哈希表从链表中删除重复项
- 24
解题回顾:使用哈希表去除链表中的重复节点
- 25
挑战9:使用哈希技术实现链表的并集与交集
- 26
解决方案回顾:使用哈希表实现列表的并集与交集
- 27
挑战 10:找出两个相加等于“目标值”的数
- 28
解决方案回顾:找出两个相加等于“目标值”的数
- 29
哈希测验:检验你对哈希的理解
数据结构概述
- 1
线性与非线性数据结构概述
- 2
结论
Certificate of Completion
Showcase your accomplishment by sharing your certificate of completion.
Course Author:Anonymous User