随笔分类 -  算法

摘要:简单排序算法 时间复杂度均为O(n2) 选择排序 选择排序(selection sort)的工作原理非常简单:开启一个循环,每轮从未排序区间选择最小的元素,将其放到已排序的区间的末尾。 算法流程 设数组长度为n,选择排序的算法流程如下。 初识状态下,所有元素未排序,即未排序(索引)区间为[1, n- 阅读全文
posted @ 2024-09-26 10:35 风陵南 阅读(363) 评论(0) 推荐(0)
摘要:哈希优化策略 在算法题中,我们通常通过线性查找替换为哈希查找来降低算法的时间复杂度。我们借助一个算法题来加深理解。 Question 给定一个整数数组nums和一个目标元素target,请在数组中搜索“和”为target的两个元素,并返回他们的数组索引。返回任意一个即可。 线性查找: 以时间换空间 阅读全文
posted @ 2024-09-17 20:26 风陵南 阅读(126) 评论(0) 推荐(0)
摘要:二分查找插入点 二分查找不仅可用于搜索目标元素,还可以解决许多变种问题,比如搜索目标元素的插入位置。 无重复元素情况 Question 给定一个长度为n的有序数组nums和一个元素target,数组不存在重复元素。现将target插入数组nums中,并保持其有序性。若数组中已存在元素target,则 阅读全文
posted @ 2024-09-12 13:56 风陵南 阅读(126) 评论(0) 推荐(0)
摘要:二分查找 二分查找(binary search)是一种基于分治策略的高效搜索算法。它利用数据的有序性,每轮缩小一半搜索范围,直至找到目标元素或搜索区间为空为止。 Qustion: 给定一个长度为n的数组nums,元素按从小到大的顺序排列且不重复。请查找并返回元素target在该数组中的索引。若数组不 阅读全文
posted @ 2024-09-12 09:57 风陵南 阅读(299) 评论(0) 推荐(0)
摘要:图的实现 基于邻接矩阵的实现 给定一个顶点数量为n的无向图: 初始化:传入n个顶点,初始化长度为n的顶点列表vertices,使用O(n)时间;初始化 n * n 大小的邻接矩阵adjMat,使用O(n2)时间。 添加或删除边:直接在邻接矩阵中修改指定的边即可,使用O(1)时间。而由于是无向图,因此 阅读全文
posted @ 2024-09-11 14:51 风陵南 阅读(414) 评论(0) 推荐(0)
摘要:图 图(graph)是一种非线性数据结构,由顶点(vertex)和边(edge)组成。我们可以将图G抽象地表示为一组顶点V和一组边E的集合。以下示例展示了一个包含5个顶点和7条边的图。 如果将顶点看做节点,将边看做连接各个节点的引用(指针),我们就可以将图看作一种从链表拓展而来的数据结构。如下图,相 阅读全文
posted @ 2024-09-09 15:02 风陵南 阅读(55) 评论(0) 推荐(0)
摘要:堆 堆(heap)是一种满足特定条件的完全二叉树,主要分为两种类型: 小顶堆(min heap):任意节点的值 ≤ 其子节点的值 大顶堆(max heap):任意节点的值 ≥ 其子节点的值 堆作为完全二叉树的一个特例,具有以下特性: 最底层节点靠左填充,其他层的节点都被填满 我们将二叉树的根节点称为 阅读全文
posted @ 2024-09-09 10:47 风陵南 阅读(329) 评论(0) 推荐(0)
摘要:AVL树 在“二叉搜索树”章节提到,在多次插入和删除操作后,二叉搜索树可能退化为链表。在这种情况下,所有操作的时间复杂度将从O(logn)劣化为O(n)。 如下图,经过两次删除节点操作,这棵二叉搜索树便会退化为链表 再例如,下图所示的完美二叉树中插入两个节点后,树将严重向左倾斜,查找操作的时间复杂度 阅读全文
posted @ 2024-09-04 16:24 风陵南 阅读(662) 评论(0) 推荐(0)
摘要:二叉搜索树 二叉搜索树(binary search tree)满足以下条件: 对于根节点,左子树中所有节点的值 < 根节点的值 < 右子树中所有节点的值。 对于任意节点的左、右子树也是二叉搜索树,同样满足上一条件。 二叉搜索树的操作 我们将二叉搜索树封装为一个类BinarySearchTree,并声 阅读全文
posted @ 2024-09-03 16:34 风陵南 阅读(255) 评论(0) 推荐(0)
摘要:二叉树数组表示 在链表表示下,二叉树的存储单元为节点TreeNode,节点之间通过指针相连接。同前面的队列或栈,二叉树同样可以使用数组来表示。 表示完美二叉树 给定一棵完美二叉树,我们将所有节点按照层序遍历的顺序存储在一个数组中,则每个节点都对应唯一的数组索引。 按照层序遍历的特性,我们可以推导处父 阅读全文
posted @ 2024-09-03 11:04 风陵南 阅读(569) 评论(0) 推荐(0)
摘要:二叉树 二叉树(binary tree)是一种非线性数据结构,代表“祖先”与“后代”之间的派生关系,体现了“一分为二”的分治逻辑。与链表类似,二叉树的基本单元是节点,每个节点包含值、左子节点引用和右子节点引用。 struct TreeNode{ int val; // 节点值 TreeNode *l 阅读全文
posted @ 2024-09-02 17:29 风陵南 阅读(920) 评论(0) 推荐(0)
摘要:哈希算法 前面介绍了哈希表的工作原理和哈希冲突的处理方法。然而无论是开放寻址还是链式地址,它们只能保证可以在发生冲突时正常工作,而无法减少哈希冲突的发生。 如果哈希冲突过于频繁,哈希表的性能则会急剧劣化。如下图所示,对于链式哈希表,理想情况下键值对均匀分布在各个桶中,达到最佳查询效率;最差情况所有键 阅读全文
posted @ 2024-08-28 17:29 风陵南 阅读(494) 评论(0) 推荐(0)