Hi, ChengYu!

You got to put the past behind you before you can move on.

  • 海上月是天上月,眼前人是心上人。

    随笔分类 -  算法

    摘要:基数排序 基数排序(radix sort)的核心思想与计数排序一致,也通过统计个数来实现排序。计数排序适用于数据量n较大但数据范围m比较小的情况。假设我们需要对n=106个学号进行排序,而学号是一个8位数字,这意味着数据范围m=108非常大,使用计数排序需要分配大量内存空间,而基数排序可以避免这种情 阅读全文
    posted @ 2024-11-05 17:07 风陵南 阅读(37) 评论(0) 推荐(1) 编辑
    摘要:计数排序 计数排序(counting sort)通过统计元素数量来实现排序,通常应用于整数数组。 简单实现 给定一个长度为n的数组nums,其中的元素都是“非负整数”,计数排序的整体流程如下: 遍历数组,找出其中最大的数组,记为m,然后创建一个长度为 m+1 的辅助数组counter。 借助coun 阅读全文
    posted @ 2024-10-29 10:09 风陵南 阅读(78) 评论(0) 推荐(0) 编辑
    摘要:桶排序 前面的快速排序、归并排序、堆排序等都是属于“基于比较的排序算法”,它们通过比较元素间的大小来实现排序。此类排序算法的时间复杂度无法超越O(nlogn)。下面介绍几种“非比较排序算法”,它们的时间复杂度可以达到线性阶。 桶排序(bucket sort)是分治策略的一个典型应用。它通过设置一些具 阅读全文
    posted @ 2024-10-18 10:13 风陵南 阅读(52) 评论(0) 推荐(0) 编辑
    摘要:堆排序 堆排序(heap sort)是一种基于堆数据结构实现的高效排序算法。我们可以利用已经学过的“建堆操作”和“元素出堆操作”实现堆排序。 输入数组并建立小顶堆,此时最小元素位于堆顶。 不断执行出堆操作,依次记录出堆元素,即可得到从小到大排序的序列。 以上方法虽然可行,但需借助一个额外数组来保存弹 阅读全文
    posted @ 2024-10-17 10:43 风陵南 阅读(148) 评论(0) 推荐(0) 编辑
    摘要:求最大公因数 求两数的最大公因数通常的做法是对两个数因式分解,找出共同的素数,然后求出最大公因数(GCD)。但是当数字越大时,因式分解就越困难,此时,使用欧几里得算法就能高效求出其最大公因数。 欧几里得算法 欧几里得算法(又称辗转相除法)用于计算两个数的最大公因数,被称为是世界上最古老的算法。 基本 阅读全文
    posted @ 2024-10-16 14:17 风陵南 阅读(114) 评论(0) 推荐(0) 编辑
    摘要:归并排序 归并排序(merge sort)是一种基于分治策略的排序算法,包含下图所示的“划分”和“合并”阶段。 划分阶段:通过递归不断地将数组从中点处分开,将长数组的排序问题转换为短数组的排序问题。 合并阶段:当子数组长度为1时终止划分,开始合并,持续地讲左右两个较短的有序数组合并为一个较长的有序数 阅读全文
    posted @ 2024-09-27 13:35 风陵南 阅读(242) 评论(0) 推荐(0) 编辑
    摘要:快速排序 快速排序(quick sort)是一种基于分治策略的排序算法,运行高效,应用广泛。 快速排序的核心操作是“哨兵划分”,其目标是::选择数组中的某个元素作为“基准数”,将所有小于基准数的元素移到其左侧,而大于基准数的元素移到其右侧。具体流程如下: 选取数组最左端元素作为基准数,初始化两个指针 阅读全文
    posted @ 2024-09-26 16:33 风陵南 阅读(67) 评论(0) 推荐(0) 编辑
    摘要:简单排序算法 时间复杂度均为O(n2) 选择排序 选择排序(selection sort)的工作原理非常简单:开启一个循环,每轮从未排序区间选择最小的元素,将其放到已排序的区间的末尾。 算法流程 设数组长度为n,选择排序的算法流程如下。 初识状态下,所有元素未排序,即未排序(索引)区间为[1, n- 阅读全文
    posted @ 2024-09-26 10:35 风陵南 阅读(191) 评论(0) 推荐(0) 编辑
    摘要:哈希优化策略 在算法题中,我们通常通过线性查找替换为哈希查找来降低算法的时间复杂度。我们借助一个算法题来加深理解。 Question 给定一个整数数组nums和一个目标元素target,请在数组中搜索“和”为target的两个元素,并返回他们的数组索引。返回任意一个即可。 线性查找: 以时间换空间 阅读全文
    posted @ 2024-09-17 20:26 风陵南 阅读(55) 评论(0) 推荐(0) 编辑
    摘要:二分查找插入点 二分查找不仅可用于搜索目标元素,还可以解决许多变种问题,比如搜索目标元素的插入位置。 无重复元素情况 Question 给定一个长度为n的有序数组nums和一个元素target,数组不存在重复元素。现将target插入数组nums中,并保持其有序性。若数组中已存在元素target,则 阅读全文
    posted @ 2024-09-12 13:56 风陵南 阅读(55) 评论(0) 推荐(0) 编辑
    摘要:二分查找 二分查找(binary search)是一种基于分治策略的高效搜索算法。它利用数据的有序性,每轮缩小一半搜索范围,直至找到目标元素或搜索区间为空为止。 Qustion: 给定一个长度为n的数组nums,元素按从小到大的顺序排列且不重复。请查找并返回元素target在该数组中的索引。若数组不 阅读全文
    posted @ 2024-09-12 09:57 风陵南 阅读(161) 评论(0) 推荐(0) 编辑
    摘要:图的实现 基于邻接矩阵的实现 给定一个顶点数量为n的无向图: 初始化:传入n个顶点,初始化长度为n的顶点列表vertices,使用O(n)时间;初始化 n * n 大小的邻接矩阵adjMat,使用O(n2)时间。 添加或删除边:直接在邻接矩阵中修改指定的边即可,使用O(1)时间。而由于是无向图,因此 阅读全文
    posted @ 2024-09-11 14:51 风陵南 阅读(170) 评论(0) 推荐(0) 编辑
    摘要:图 图(graph)是一种非线性数据结构,由顶点(vertex)和边(edge)组成。我们可以将图G抽象地表示为一组顶点V和一组边E的集合。以下示例展示了一个包含5个顶点和7条边的图。 如果将顶点看做节点,将边看做连接各个节点的引用(指针),我们就可以将图看作一种从链表拓展而来的数据结构。如下图,相 阅读全文
    posted @ 2024-09-09 15:02 风陵南 阅读(29) 评论(0) 推荐(0) 编辑
    摘要:堆 堆(heap)是一种满足特定条件的完全二叉树,主要分为两种类型: 小顶堆(min heap):任意节点的值 ≤ 其子节点的值 大顶堆(max heap):任意节点的值 ≥ 其子节点的值 堆作为完全二叉树的一个特例,具有以下特性: 最底层节点靠左填充,其他层的节点都被填满 我们将二叉树的根节点称为 阅读全文
    posted @ 2024-09-09 10:47 风陵南 阅读(80) 评论(0) 推荐(0) 编辑
    摘要:AVL树 在“二叉搜索树”章节提到,在多次插入和删除操作后,二叉搜索树可能退化为链表。在这种情况下,所有操作的时间复杂度将从O(logn)劣化为O(n)。 如下图,经过两次删除节点操作,这棵二叉搜索树便会退化为链表 再例如,下图所示的完美二叉树中插入两个节点后,树将严重向左倾斜,查找操作的时间复杂度 阅读全文
    posted @ 2024-09-04 16:24 风陵南 阅读(240) 评论(0) 推荐(0) 编辑
    摘要:二叉搜索树 二叉搜索树(binary search tree)满足以下条件: 对于根节点,左子树中所有节点的值 < 根节点的值 < 右子树中所有节点的值。 对于任意节点的左、右子树也是二叉搜索树,同样满足上一条件。 二叉搜索树的操作 我们将二叉搜索树封装为一个类BinarySearchTree,并声 阅读全文
    posted @ 2024-09-03 16:34 风陵南 阅读(61) 评论(0) 推荐(0) 编辑
    摘要:二叉树数组表示 在链表表示下,二叉树的存储单元为节点TreeNode,节点之间通过指针相连接。同前面的队列或栈,二叉树同样可以使用数组来表示。 表示完美二叉树 给定一棵完美二叉树,我们将所有节点按照层序遍历的顺序存储在一个数组中,则每个节点都对应唯一的数组索引。 按照层序遍历的特性,我们可以推导处父 阅读全文
    posted @ 2024-09-03 11:04 风陵南 阅读(246) 评论(0) 推荐(0) 编辑
    摘要:二叉树 二叉树(binary tree)是一种非线性数据结构,代表“祖先”与“后代”之间的派生关系,体现了“一分为二”的分治逻辑。与链表类似,二叉树的基本单元是节点,每个节点包含值、左子节点引用和右子节点引用。 struct TreeNode{ int val; // 节点值 TreeNode *l 阅读全文
    posted @ 2024-09-02 17:29 风陵南 阅读(117) 评论(0) 推荐(0) 编辑
    摘要:哈希算法 前面介绍了哈希表的工作原理和哈希冲突的处理方法。然而无论是开放寻址还是链式地址,它们只能保证可以在发生冲突时正常工作,而无法减少哈希冲突的发生。 如果哈希冲突过于频繁,哈希表的性能则会急剧劣化。如下图所示,对于链式哈希表,理想情况下键值对均匀分布在各个桶中,达到最佳查询效率;最差情况所有键 阅读全文
    posted @ 2024-08-28 17:29 风陵南 阅读(143) 评论(0) 推荐(0) 编辑
    摘要:哈希冲突 通常情况下哈希函数那点输入空间远大于输出空间,因此理论上哈希冲突是不可避免的。比如输入空间为全体整数,输出空间为数组容量大小,则必然有多个整数映射至同一个桶索引。 哈希冲突会导致查询结果错误,严重影响哈希表的可用性。为了解决该问题,每当遇到哈希冲突时,我们就进行哈希表扩容,直至冲突消失。此 阅读全文
    posted @ 2024-08-28 15:29 风陵南 阅读(66) 评论(0) 推荐(0) 编辑

    点击右上角即可分享
    微信分享提示