![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
c
文章平均质量分 86
csdn_aspnet
这个作者很懒,什么都没留下…
展开
-
C语言 打印菱形的程序(Program to print the Diamond Shape)
O(n*n),因为我们正在遍历网格的行和列来打印空格 ' '和星号 '*'。给定一个数字n ,编写一个程序来打印一个有2n行的菱形。O(1),不使用额外空间。原创 2024-07-22 10:02:43 · 466 阅读 · 0 评论 -
c语言 Program to print pyramid pattern (打印金字塔图案的程序)
这个想法是对金字塔的每个部分使用两个 for 循环。这两个部分可以分为上部和下部。我们强烈建议您最小化浏览器并先自己尝试一下。编写程序打印由星星组成的金字塔图案。原创 2024-07-18 10:18:03 · 706 阅读 · 0 评论 -
C语言 帕斯卡三角形(Pascal’s Triangle)
该方法基于使用二项式系数的方法。我们知道行号 line 中的第 i 个条目是二项式系数 C(line, i) ,并且所有行都以值 1 开头。这个想法是使用C(line, i-1)计算C(line, i )。例如,第一行有“1 ”,第二行有“ 1 1 ”,第三行有“1 2 1 ”,等等。此方法可以优化为使用 O(n) 额外空间,因为我们只需要前一行的值。因此,可以在 O(1) 时间内通过 C(line, i-1) 计算出 C(line, i)3、在 O(n) 时间内,给定行号,找到帕斯卡三角形的特定行。原创 2024-07-10 10:03:05 · 4300 阅读 · 0 评论 -
C语言 空间和时间高效的二项式系数(Space and time efficient Binomial Coefficient)
在本文中,我们讨论了 O(n*k) 时间和 O(k) 额外空间算法。C(n, k) 的值可以在 O(k) 时间和 O(1) 额外空间内计算出来。4、所以答案将等于 ((n/1)*((n-1)/2)*…*((n-r+1)/r),等于 nCr。3、在每次迭代中更新 ans 为 (ans*(ni))/(i+1),其中 i 是循环计数器。这里函数采用两个参数n和k,并返回二项式系数 C(n, k) 的值。// 如果 r > n-r,则 r 可以更改为 n-r。另外,C(n, k) = C(n, nk)原创 2024-07-06 11:21:35 · 3429 阅读 · 0 评论 -
c语言 对排序输入进行高效霍夫曼编码 | 贪婪算法(Efficient Huffman Coding for Sorted Input | Greedy Algo)
如果输入未排序,则需要先对其进行排序,然后才能通过上述算法进行处理。因此,对于未排序的输入,总体时间复杂度变为 O(nlogn)。如果我们知道给定的数组是排好序的(按频率非递减顺序),我们可以在 O(n) 时间内生成霍夫曼码。4.创建一个新的内部节点,其频率等于两个节点频率之和。将第一个出队节点设为其左子节点,将第二个出队节点设为右子节点。最初第二个队列是空的。剩下的节点就是根节点,树就完成了。3.通过检查两个队列的前面,使两个频率最小的节点出队。3. 否则,比较两个队列的前面,并使最小的节点出队。原创 2024-06-22 10:22:09 · 7354 阅读 · 0 评论 -
c语言 霍夫曼编码 | 贪婪算法(Huffman Coding | Greedy Algo)
分配给输入字符的可变长度代码是前缀码,这意味着代码(位序列)的分配方式是分配给一个字符的代码不是分配给任何其他字符的代码的前缀。将第一个提取的节点作为其左子节点,将另一个提取的节点作为其右子节点。现在最小堆包含 4 个节点,其中 2 个节点是每个节点只有一个元素的树的根,另外两个堆节点是具有多个节点的树的根。其思想是为输入字符分配可变长度的代码,分配的代码的长度基于相应字符的频率。现在最小堆包含 5 个节点,其中 4 个节点是每个节点只有一个元素的树的根,一个堆节点是具有 3 个元素的树的根。原创 2024-06-05 09:08:04 · 5759 阅读 · 0 评论 -
c语言 工作排序(Job Sequencing Problem)
给定一个作业数组,其中每个作业都有一个截止期限,如果作业在截止期限之前完成,则可获得相关利润。printf("作业ID: %d, 利润: %d, 截止日期: %d\n", result[i].id, result[i].profit, result[i].deadline);当空时隙可用且堆不为空时,将作业的利润包含在最大堆的根部,因为这有助于为每组可用时隙选择利润最大的作业。// 存储作业的数组。// 从最大堆中获取具有最大利润和截止日期的作业。// 从最大堆中移除具有最大利润和截止日期的作业。原创 2024-05-31 09:51:30 · 850 阅读 · 0 评论 -
c语言 贪心算法(Greedy Algo)
贪心选择是选择连接两个集合并且位于从源到包含尚未包含的顶点的集合的最小权重路径上的边。贪心选择是总是选择剩余活动中完成时间最短的下一个活动,并且开始时间大于或等于先前选择的活动的结束时间。我们可以根据活动的完成时间对活动进行排序,以便我们始终将下一个活动视为完成时间最短的活动。B 中的活动是独立的,并且 k 的完成时间是所有活动中最小的。每一步,我们都可以做出当前看来最好的选择,从而得到整个问题的最优解。4、如果此活动的开始时间大于或等于先前选择的活动的结束时间,则选择此活动并打印。原创 2024-05-29 09:03:20 · 666 阅读 · 0 评论 -
c语言 分而治之(施特拉森矩阵乘法)
注意,上述代码主要展示了施特拉森矩阵乘法的基本思路,具体的矩阵拆分、计算以及结果合并部分需要进一步完善。实现施特拉森矩阵乘法需要一定的数学知识和编程技巧,确保正确理解算法原理后再进行实现。注意,实现施特拉森矩阵乘法需要考虑矩阵大小以及递归结束条件等情况,确保正确理解算法逻辑并正确实现细节部分。2、递归计算以下值。1、将矩阵 A 和 B 分为 4 个大小为 N/2 x N/2 的子矩阵,如下图所示。给定两个大小分别为 nxn 的方阵 A 和 B,求它们的乘法矩阵。以下是两个方阵相乘的简单分而治之方法。原创 2024-05-23 09:45:58 · 688 阅读 · 0 评论 -
c语言 快速排序(QuickSort)
为了缓解最坏的情况,使用了各种技术,例如选择一个好的主元(例如,三的中位数)并使用随机算法(随机快速排序)在排序之前对元素进行混洗。分区的目标是将主元(可以选择任何元素作为主元)放置在已排序数组中的正确位置,并将所有较小的元素放在主元的左侧,将所有较大的元素放在主元的右侧。它不是稳定的排序,这意味着如果两个元素具有相同的键,在快速排序的情况下,它们的相对顺序将不会保留在排序的输出中,因为这里我们根据枢轴的位置交换元素(不考虑它们的原始位置)职位)。QuickSort 中的分区:将枢轴与 80 进行比较。原创 2024-05-15 09:03:54 · 982 阅读 · 0 评论 -
c语言 归并排序
它的工作原理是递归地将输入数组划分为较小的子数组并对这些子数组进行排序,然后将它们合并在一起以获得排序后的数组。简单来说,归并排序的过程就是将数组分成两半,对每一半进行排序,然后将已排序的两半合并在一起。合并排序不是就地排序算法,这意味着它需要额外的内存来存储排序后的数据。归并排序是一种稳定的排序算法,这意味着它保持输入数组中相等元素的相对顺序。归并排序在排序过程中需要额外的内存来存储合并后的子数组。O(n log n),当数组已经排序或接近排序时。O(n),合并时使用的临时数组需要额外的空间。原创 2024-05-11 09:17:27 · 857 阅读 · 0 评论 -
c 语言 为什么二元搜索优于三元搜索
在每一步中,算法将目标值与数组中间元素进行比较,如果中间元素等于目标值,则找到目标,如果中间元素大于目标值,则在左半部分继续搜索,如果中间元素小于目标值,则在右半部分继续搜索。因此,三元搜索和二元搜索的比较归结为表达式 2Log 3 n 和 Log 2 n的比较。由于 (2 / Log 2 3)的值大于 1,因此在最坏情况下,三元搜索比二元搜索进行更多的比较。根据上面的定义,二元搜索是将搜索范围划分为两部分,而三元搜索是将搜索范围划分为三部分。在三元搜索中,最坏情况下有 4Log 3 n + 1 次比较。原创 2024-04-28 10:45:14 · 844 阅读 · 0 评论 -
c语言 线性搜索与二分搜索
那么搜索目标项目的唯一方法就是从第一个位置开始,并将其与目标进行比较。否则,我们将转移到下一个位置。然而,在二分搜索中,一旦找到排序列表的中间,就将搜索量减少一半。O(1) – 二分查找算法只需要常数空间来存储低、高、中索引,不需要任何额外的数据结构,因此其辅助空间复杂度为 O(1)。O(n),其中 n 是输入数组的大小。最坏的情况是数组中不存在目标元素,并且该函数必须遍历整个数组才能找出该元素。O(log n) – 二分搜索算法在每一步将输入数组分成两半,将搜索空间减少一半,因此具有对数阶的时间复杂度。原创 2024-04-19 10:08:10 · 609 阅读 · 0 评论 -
c 语言 无处不在的二分搜索
给定一个由 N 个不同整数组成的数组,找到输入“key”的下限值。以下是可能的极端情况, —> 如果数组中的所有元素都小于 key,则左指针移动到最后一个元素。—> 如果数组中的所有元素都相等且原创 2024-04-17 10:05:12 · 1144 阅读 · 0 评论 -
c 语言 斐波那契搜索(Fibonacci Search)
设第(m-2)个斐波那契数为i,我们将arr[i]与x进行比较,如果x相同,则返回i。由于 fibMm2 标记了大约三分之一的数组,并且它标记的索引肯定是有效的,因此我们可以将 fibMm2 添加到 offset 并检查索引 i = min(offset + fibMm2, n) 处的元素。当我们继续寻找目标时,当我们的目标位于数组的较大 (2/3) 部分时,最坏的情况就会发生。斐波那契数被递归地定义为 F(n) = F(n-1) + F(n-2)、F(0) = 0、F(1) = 1。原创 2024-04-11 09:02:16 · 563 阅读 · 0 评论 -
c 语言 指数搜索(Exponential Search)
一旦我们找到一个索引 i(在重复将 i 加倍之后),我们就知道该元素必须存在于 i/2 和 i 之间(为什么是 i/2?因为我们在之前的迭代中找不到更大的值)下面给出的是上述步骤的实施。这个想法是从子数组大小 1 开始,将其最后一个元素与 x 进行比较,然后尝试大小 2,然后是 4,依此类推,直到子数组的最后一个元素不大于。上述二分查找的实现是递归的,需要 O(Log n) 空间。2、对于有界数组,以及当要搜索的元素更接近第一个元素时,它比二分搜索效果更好。搜索的元素 x,找到 x 在数组中的位置。原创 2024-04-07 10:05:11 · 801 阅读 · 0 评论 -
c 语言 插值搜索(Interpolation Search)
插值搜索是对实例二分搜索的改进,其中排序数组中的值是均匀分布的。另一方面,插值搜索可以根据正在搜索的键的值去不同的位置。线性插值采用两个数据点,我们假设为 (x1,y1) 和 (x2,y2),公式为:在点 (x,y) 处。我们假设数组的元素是线性分布的,直线的一般方程:y = m*x + c,y 是数组中的值,x 是其索引。给定一个由 n 个均匀分布值 arr[] 组成的排序数组,编写一个函数来搜索数组中的特定元素 x。当要搜索的元素更接近arr[hi]时,返回较高的pos值。原创 2024-04-04 17:04:36 · 735 阅读 · 0 评论 -
c 语言 跳转搜索(Jump Search)
一旦找到区间 (arr[km] < x < arr[(k+1)m]),我们就从索引 km 执行线性搜索操作来查找元素 x。在最坏的情况下,我们必须进行 n/m 次跳转,如果最后检查的值大于要搜索的元素,我们会为线性搜索多执行 m-1 次比较。4、二分查找比跳转查找要好,但是跳转查找的优点是我们只需要回溯一次(二分查找可能需要最多 O(Log n) 次跳转,考虑要查找的元素是最小元素或者更大的元素的情况比最小的)。3、跳转搜索的时间复杂度介于线性搜索 ((O(n)) 和二分搜索 (O(Log n)) 之间。原创 2024-03-29 09:06:42 · 595 阅读 · 0 评论 -
c 语言 三元搜索 - 迭代与递归(Ternary Search)
例如,二分搜索将信息分为两部分,而三元搜索则执行相同的操作,但分为三个相等的部分。在本文中,我们将揭开三元搜索的秘密——它是如何工作的,为什么它在某些情况下更快。如果目标位于mid1和mid2的元素之间,则将左指针更新为mid1 + 1,将右指针更新为mid2 – 1。它的工作原理是将数组分为三部分,并对适当的部分递归地执行搜索操作,直到找到所需的元素。三元搜索的时间复杂度为O(2 * log 3 n),比线性搜索更高效,与二分搜索相当。需要注意的是,要使三元搜索正常工作,要搜索的数组必须进行排序。原创 2024-03-25 10:00:00 · 1040 阅读 · 0 评论 -
c语言 二分查找(迭代与递归)
考虑一个数组arr[] = {2, 5, 8, 12, 16, 23, 38, 56, 72, 91},目标 = 23。如果键小于 mid 元素,则向左移动,如果大于 mid 则将搜索空间向右移动。二分搜索可以用作机器学习中使用的更复杂算法的构建块,例如训练神经网络或查找模型的最佳超参数的算法。并根据结果返回找到键的索引或调用下一个搜索空间的递归函数。它可用于计算机图形学中的搜索,例如光线追踪或纹理映射的算法。3、如果在中间元素没有找到键,则选择哪一半将用作下一个搜索空间。密钥小于当前的中间 56。原创 2024-03-05 09:10:51 · 1502 阅读 · 0 评论 -
C语言 冒泡排序 插入排序 选择排序 快速排序 归并排序 堆排序 示例
快速排序是一种高效的分治排序算法,通过递归将数组分割成较小的子数组,然后递归排序子数组。堆排序的时间复杂度为 O(nlogn),属于原地排序算法,不需要额外的空间复杂度。冒泡排序是一种简单直观的排序算法,它重复地走访要排序的数列,一次比较两个元素,然后根据大小交换位置,大的元素往后移动。归并排序是一种分治排序算法,采用递归的方式将数组划分为更小的子数组,然后通过合并操作将子数组合并成有序的数组。时间复杂度为 O(n^2),不稳定的排序算法,但是是一种原地排序算法,空间复杂度为 O(1)。原创 2024-03-04 13:08:08 · 683 阅读 · 0 评论 -
c语言 广度优先搜索(Breadth-First Search,BFS)
其基本思想是先访问起始顶点,然后逐层遍历其相邻的顶点,直到找到目标顶点或遍历完所有顶点。BFS算法的时间复杂度用 的形式表示O(V + E),其中V是节点数,E 是边数。该算法的空间复杂度为O(V)。mark v as visited and put v into Q -- 将v标记为已访问,并将v放入Q中。我们从顶点 0 开始,BFS 算法首先将其放入 Visited 列表中,并将其所有相邻顶点放入堆栈中。顶点 2 在 4 中有一个未访问的相邻顶点,因此我们将其添加到队列的后面并访问位于队列前面的 3。原创 2024-03-01 10:24:00 · 1500 阅读 · 1 评论