自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(28)
  • 收藏
  • 关注

原创 算法分析·回溯法

回溯法是一种系统性与跳跃性结合的深度优先搜索算法,适用于组合数较大的问题。它通过构造解空间树(子集树或排列树),利用约束函数和限界函数剪枝,避免无效搜索。算法框架分为递归实现的子集树和排列树结构,典型应用包括TSP问题(全排列搜索最优路径)和n皇后问题(显隐约束筛选解)。效率受解生成时间、约束条件计算等因素影响,优化策略包括调整搜索顺序、优先处理取值少的变量等。回溯法在解空间较大的组合优化问题中展现出高效的系统搜索能力。

2025-05-28 22:07:29 762

原创 最长公共子序列(LCS)问题——动态规划法

本文介绍了最长公共子序列(LCS)问题的动态规划解法。给定两个序列X和Y,LCS是指同时是两者子序列的最长序列。通过最优子结构性质分析,推导出递归关系:当末尾元素相同时,LCS长度等于子问题解+1;否则取两个子问题的最大值。采用自底向上方法构建c[m][n]矩阵存储最优解值,并用b[m][n]矩阵记录构造路径。最后通过回溯b矩阵得到LCS具体元素。算法时间复杂度为O(mn),空间复杂度O(mn)。文末以X=<A,B,C,B,D,A,B>和Y=<B,D,C,A,B,A>为例,展示了求解

2025-05-28 14:30:04 836

原创 蒙特卡罗算法

蒙特卡罗算法是一类基于随机概率的统计算法,它不一定总能给出正确结果,但可以通过多次运行提高正确概率。这类算法分为一致性和偏倚性两种,前者通过重复执行增加准确性,后者针对特定问题优化。以Frievald算法为例,它通过随机向量乘法验证矩阵乘积是否正确,时间复杂度为O(n²)。当矩阵乘积正确时算法必然输出正确结果;当错误时输出正确结果的概率不超过1/2。蒙特卡罗算法的优势在于能以较低计算成本获得高概率正确解,适用于验证复杂计算结果等场景。

2025-05-28 01:22:28 944

原创 最小生成树问题

本文介绍了最小生成树的概念及其在网络设计中的应用。最小生成树指在一个连通带权图中,包含所有顶点且边权总和最小的树结构。Prim和Kruskal是两种常用的贪心算法:Prim通过逐步扩展顶点集构造最小生成树,时间复杂度为O(E lg V);Kruskal通过按权排序边来合并连通分支,时间复杂度为O(E log E)。文章比较了两种算法的适用场景:当边数较多(|E|>|V|²)时Prim更优,反之Kruskal表现更好。这两种算法都利用了最小生成树的关键性质。

2025-05-28 00:47:19 564

原创 单源最短路径问题和Dijkstra 算法

本文介绍了Dijkstra算法解决单源最短路径问题。该算法通过贪心策略,逐步扩充已确定最短路径的顶点集合S,并维护一个记录各顶点当前最短路径长度的数组dist。算法时间复杂度为O(n²),适用于边权非负的有向图。文中给出了一个具体示例,展示了Dijkstra算法逐步求解最短路径的过程及其实现步骤。

2025-05-28 00:16:46 439

原创 矩阵链乘法问题

矩阵链乘法问题旨在寻找n个矩阵相乘的最优括号化方案,以最小化标量乘法次数。穷举法虽然直观但计算成本高,递归式为p(n)=∑p(k)p(n-k)。动态规划法通过分析最优子结构(子问题A[i:j]的最优解包含子链A[i:k]和A[k+1:j]的最优解),建立递归关系m[i][j]=min{m[i][k]+m[k+1][j]+p[i-1]p[k]p[j]},并采用自底向上填表法(三重循环)求解,时间复杂度和空间复杂度分别为O(n³)和O(n²)。实例演示了如何通过动态规划表逐步计算最优解值及断开位置k。

2025-05-26 16:25:16 846

原创 算法分析·顺序统计学

基本思想: 类似RandomizedSelect算法,通过对输入数组进行递归划分来找出所求元素,但是算法保证每次对划分是个好划分。同时寻找最大/最小 值时,我们可以成对处理元素,比较当前两个元素,把较小者与最小值比较,较大者与最大值比较。我们采用分治策略,借鉴快速排序的随机划分法,对输入数组进行递归划分,但是只处理划分的一边。如果𝑛是偶数,总共做了3𝑛/2−2次比较。平均情况:假设第𝑖小的元素总是掉在较大的子问题中。个不同值构成的集合中,选择其第。小组中位数的中位数时,只在。个元素组成的集合中,第。

2025-04-22 02:19:13 1017

原创 算法分析·堆排序

当MAX-HEAPIFY作用在一棵以结点𝑖为根的、大小为𝑛的子树上时,对以𝑖的某个子节点为根的子树大小最多为2𝑛/3(此时,最底层恰好半满)。④INCREASE-KEY(S, x, k):将元素𝑥的关键字的值增加𝑘,这里𝑘值不能小于𝑥的原始关键字的值。假定左子树和右子树都是最大堆,MAX-HEAPIFY让根结点在最大堆中“下降”,得到高度加一的最大堆。优先级队列是一种用来维护由一组元素构成的集合S的数据结构,这一组元素中的每一个都有一个关键字Key。堆的物理结构本质上是顺序存储的,是线性的。

2025-03-24 01:23:31 834

原创 算法分析·递归式求解

递归是一种重要的算法,分析它的复杂度是一个有趣的问题。

2025-03-12 01:49:22 414

原创 算法分析·函数增长

对于大规模输入,我们通常只关注运行时间效率函数的增长率,即只关注函数的高阶项,而忽略低阶项和高阶项系数。

2025-03-11 02:20:08 1051

原创 算法分析入门

算法就是问题的程序化解决方案。它定义了一个良好的计算过程,取一组值作为输入,并产生一组值作为输出。。fill:#333;color:#333;color:#333;fill:none;

2025-03-02 00:38:19 691

原创 数据结构:哈希表

无论是在顺序查找、二分查找、索引顺序查找,还算二叉排序树中,我们查找元素时,都需要逐个对比。那么,我们可不可以构造一种函数H,根据我们要查找关键字key和这个函数,可以直接确定查找值所在位置,直接找到数据,提升效率呢?答案是肯定的,这就是我们这篇文章的主角,哈希表。散列(Hashing):通过把记录的关键字映射到表中的一个存储位置,实现根据关键字的值直接访问数据元素的过程散列函数:把取值范围较大的关键字映射到某确定的存储位置的函数 ,也叫哈希函数。哈希表。

2023-12-23 23:54:34 1166 1

原创 数据结构:查找表

首先,我们要引入关键字的概念。关键字:数据元素中某个数据项的值这么说也许有点抽象。举个例子,如果把人看作一个元素,在户籍管理系统中,我们通过身份证号查找某个特定的人,那么身份证号就是关键字。当然,我们知道,我们不仅能通过身份证号区分不同的人,还可以根据姓名、年龄等特征对其进行查找(当然,这些可能发生重复)。于是,我们把类似身份证号这样的唯一的标志称为主关键字,姓名这类不一定唯一的称为次关键字。主关键字:数据元素中的可以唯一标识一个数据元素的某数据项值次关键字。

2023-12-23 20:39:53 2680 1

原创 希尔排序(C语言)

希尔排序(Shell Sort)是插入排序的一种更高效的改进版本,也称为缩小增量排序。它基于增大元素之间的比较与交换间距的思想,先将待排记录表按间隔D分成若干子序列,然后利用插入排序完成子序列内排序,再渐次减小间隔D重复上述分组插入排序操作,直至D=1为止。也许,初次接触希尔算法时,会感到奇怪,为什么,希尔排序算法使用了多次的插入排序,复杂度反而更小呢?插入排序是不稳定的,希尔排序可以视为一种特殊的插入排序,自然也是不稳定的。因为,越接近有序的序列,插入排序算法所需的比较和移动次数越少。

2023-12-18 22:54:06 963 1

原创 三种简单排序算法 及其 mathematica 可视化

从未排序记录表的底部开始,依关键字逐次比较、交换相邻记录,将具有最小(大)键值的记录移至未排序记录表的顶部位置,直至记录表完全有序。依关键字在未排序记录表中查找记录,选择具有最小(大)键值的 记录并与未排序记录表的首元素交换放置,直至记录表完全有序。每次将一个元素插入已经排序好的序列中,相等的元素仍然按照初始时的先后顺序排列,相对位置没有发生改变。在移动最小/大键值的元素时,相等元素的相对位置可能改变,故选择排序是不稳定的。三者中,只有选择排序是不稳定的。故,冒泡排序是稳定的。故插入排序是稳定的。

2023-12-18 21:08:58 816 1

原创 插入排序、归并排序、快速排序 python 运行时间

插入排序的基本思想是将待排序列表中的每个元素依次插入到已排序好的列表的合适的位置。第 3 行的外循环的循环变量 i 是列表中待插入元素的索引值。第 6 - 8 行的内循环将待插入元素 value 依次与索引值为 i-1,i-2,…,0 的元素进行比较,将 比 value 大的元素向后移动,直至找到比 value 小的元素或者 pos=0 为止。第 9 行将 value 写 入索引值为 pos 的位置,完成插入。

2023-12-12 19:49:57 1067

原创 Three sum 问题及其 python 实现

给定一个整数 x 和一个由整数构成的集合 S,从 S 中找一 个由三个元素构成的子集,该子集中的三个元素之和必须等于 x。使用穷举法列举 S 的所有 由三个元素构成的子集,逐个检查其是否满足条件。

2023-12-12 17:59:21 1975

原创 Numpy 数组和矩阵计算

1,通过提供三个数组生成:data 保存所有非零元;row 保存所有非零元的行索引值;col 保存所有非零元的列索引值。关键字实参 shape 指定矩阵的行数和列数。2, 通过提供三个数组生成:data 保存所有非零元;indices 保存所有非零元的列索引值;indptr 的第i个元素表示前 i-1行的非零元个数。直接生成 CSR 格式的方式有两种。

2023-12-09 21:20:03 556

原创 KMP算法——串的模式匹配算法

对于子串查找定位问题,待查找的子串称为模式,在主串中查找子串的过程称为模式匹配。

2023-10-30 11:05:49 132 1

原创 数据结构及其应用算法·顺序表 笔记6

顺序表说白了就是线性表的顺序表示。当然,这样表述优点太过简单了。:采用顺序存储结构表示的线性表,即用一组地址连续的存储单元依次存储线性表的数据元素。顺序表La1​a2​an​的存储结构如下所示:LOCai1​LOCai​TLOCai​LOCa1​Ti−1i10010。

2023-09-18 10:40:14 135

原创 求解最大连续子序列和的几种方法(C语言版)

求解最大连续子序列和,即以下问题给定一个整数数组arr及其长度arrSize,试找到一个具有最大和的连续子数组(子数组至少包含一个元素),返回其最大和。示例:int maxSubSum_BF(int *arr, int arrSize)①输入[4,-3,5,-2],输出6②输入[-1,2,-6,3],输出3③输入[4,-3,5,-2,-1,2,6,-2],输出11下面我们将采取不同方法,从不同角度解决这个问题。

2023-09-11 13:11:09 1057

原创 数据结构及其算法应用·线性表的基本概念 笔记5

线性结构:描述数据元素之间存在的一对一逻辑关系,即在非空有限数据集中,逻辑相邻数据元素之间存在的序偶关系。线性表:具有线性结构的同类数据元素构成的有限序列例如,如下数据数据元素姓名年龄a1张三11a2李四45\dots\dotsan老十七14就有如下线性表La1a2anLa1​a2​an​①同构性:由同类数据元素组成,所有元素必须属于同一数据对象②有穷性:由有限数据元素组成,数据元素的个数n称为表长。

2023-09-11 12:00:41 177

原创 数据结构及其算法应用·算法设计策略——笔记4

与分治法类似,所不同在于适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立的,即存在重叠子问题,动态规划借助状态表记录和查找子问题的解,从而避免重叠子问题的重复求解,提高效率。把原问题分成若干规模较小、相互独立且形式相同的子问题,然后递归地对子问题求解,再将子问题的解进行加工合并,得到原问题的解。将原问题分解为若干规模较小、形式相同的子问题,然后分阶段迭代选择每个子问题的局部最优解,再将子问题的解合并获得原问题的解。③输入[4,-3,5,-2,-1,2,6,-2],输出11。

2023-09-07 13:38:36 208

原创 数据结构及应用算法·算法设计与分析——笔记3

设计出算法后,需要对算法的性能进行评估,于是,我们引入算法分析及其相关概念。T3(n):循环语句,执行频次n*(n+1)/2次。T4(n):赋值语句,执行频次n*(n+1)/2次。T1(n):循环语句O(k) (k未知)个正常数M,即:存在正常数N和M,使得当。基本操作的总执行频次为:T(n)=n。T1(n):赋值语句,执行频次1次。T2(n):循环语句,执行频次n次。在渐近算法分析中,我们一般使用“大。T1(n):循环语句O(n)T2(n):循环语句O(n)T3(n):赋值语句O(1)

2023-09-07 12:02:21 169

原创 数据结构及应用算法·抽象数据类型——笔记2

那么,可以理解为,抽象数据类型就是给数据结构加上了一些基本操作。抽象数据结构包含三部分内容。

2023-09-06 14:33:32 280 1

原创 复变函数·复数的基本概念 笔记1

复数是形如。

2023-09-05 15:37:25 778

原创 数据结构及应用算·数据结构的基础概念——笔记1

即,数据结构由“数据对象”及“数据对象所包含的数据元素间的相互关系”两部分组成。例如,在如下表格中,单个格子是一个数据项,而一整行可视为一个数据元素。数据结构是较为抽象的概念,其具体实现依赖于物理硬件。例如,下图为两种不同的存储结构。

2023-09-04 17:27:37 162 1

原创 [C语言入门] 转义字符表

C语言的转义字符表常让新手头疼,这里附上转义字符表,并试着解释其字母的含义(个人推测,不一定完全正确),以便记忆。

2023-02-25 11:05:48 1734 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除