C#
文章平均质量分 82
csdn_aspnet
这个作者很懒,什么都没留下…
展开
-
C# 3 个有序点的方向(Orientation of 3 ordered points)
如果斜率相等,则这些点共线。如果前两个点形成的线段的斜率小于后两个点形成的线段的斜率,则方向为逆时针,否则为顺时针。如果 (p1, p2, p3) 的方向是顺时针,则 (p3, p2, p1) 的方向是逆时针,反之亦然。如果 (p1, p2, p3) 的方向共线,则 (p3, p2, p1) 的方向也共线。3. 如果 (p1,p2) 的斜率 < (p2,p3) 的斜率,则点处于逆时针方向。4. 如果 (p1,p2) 的斜率 > (p2,p3) 的斜率,则点处于顺时针方向。线段 (p1, p2) 的斜率:?原创 2024-09-23 09:08:52 · 902 阅读 · 0 评论 -
C# 找到给定点集的简单闭合路径(Find Simple Closed Path for a given set of points)
通过比较所有点的 y 坐标来找到最底部的点。如果有两个点的 y 值相同,则考虑 x 坐标值较小的点。考虑剩余的 n-1 个点,并围绕 points[0] 按照极角逆时针顺序排列它们。如果两个点的极角相同,则将最近的点放在最前面。如果我们使用 O(nLogn) 排序算法对点进行排序,则上述解决方案的时间复杂度为 O(n Log n)。输入:points[] = {(0, 3), (1, 1), (2, 2), (4, 4),观察:我们不关心角度的实际值。遍历排序数组(按角度升序排序)产生简单的闭合路径。原创 2024-09-18 13:10:05 · 1162 阅读 · 0 评论 -
C# 如何检查两个给定的线段是否相交(How to check if two given line segments intersect)
( p1 , q1 , p2 )、( p1 , q1 , q2 )、( p2 , q2 , p1 ) 和 ( p2 , q2 , q1 ) 均为共线,且 – ( p1 , q1 ) 和 ( p2 , q2 )– ( p1 , q1 , p2 ) 和 ( p1 , q1 , q2 ) 具有不同的方向,并且。– ( p2 , q2 , p1 ) 和 ( p2 , q2 , q1 ) 具有不同的方向。的 x 投影相交 – ( p1 , q1 ) 和 ( p2 , q2 )的 y 投影相交。原创 2024-09-11 09:45:02 · 1027 阅读 · 0 评论 -
C# 在给定斜率的线上找到给定距离处的点(Find points at a given distance on a line of given slope)
给定二维点 p(x 0 , y 0 )的坐标。找到距离该点 L 的点,使得连接这些点所形成的线的斜率为M。我们需要找到与给定点距离为 L 的两个点,它们位于斜率为 M 的直线上。与源的距离为 sqrt(2) ,并具有所需的斜率m = 1。1、如果斜率为零,我们只需要调整源点的 x 坐标。3、对于其他斜率值,我们可以使用以下方程来找到点。根据输入的斜率,该问题可以分为 3 类。现在利用上述公式我们可以找到所需的点。输入: p = (2, 1)输入: p = (1, 0)原创 2024-09-09 09:07:47 · 963 阅读 · 0 评论 -
C# 使用中点查找矩形的角(Find Corners of Rectangle using mid points)
我们有 p 和 q 的坐标。因此,我们可以找到 AD 和 BC 的斜率(因为 pq 垂直于 AD)。一旦我们有了 AD 的斜率,我们就可以找到通过 AD 的直线方程。考虑一个矩形 ABCD,我们给出了边 AD 和 BC 中点(分别为 p 和 q)的坐标以及它们的长度 L(AD = BC = L)。如果 AD 的斜率 = m,则 m = (px- qx)/(qy- py)现在,我们可以通过简单地加减相应获得的位移来找到 4 个角的坐标。以及沿 X 轴的位移,dx = L/(2*sqrt(1+m*m))原创 2024-09-04 09:06:12 · 1356 阅读 · 0 评论 -
C# 两线交点程序(Program for Point of Intersection of Two Lines)
为了求解,我们将 1 乘以 b 2并将 2 乘以 b 1这样我们得到 a 1 b 2 x + b 1 b 2 y = c 1 b 2 a 2 b 1 x + b 2 b 1 y = c 2 b 1减去这些我们得到 (a 1 b 2 – a 2 b 1 ) x = c 1 b 2 – c 2 b 1这样我们得到了 x 的值。如果线段由点 (x 1 , y 1 ) 和 (x 2 , y 2 ) 指定,那么要检查 (x, y) 是否在线段上,我们只需检查。输入:A = (1, 1), B = (4, 4)原创 2024-08-30 09:57:36 · 1176 阅读 · 0 评论 -
C# 程序寻找通过 2 个点的线(Program to find line passing through 2 Points)
在数学和计算机科学中,找到通过两个点的线的方程是一个基础问题。假设我们有两个点 P1(x1,y1) 和 P2(x2,y2),我们想要找到通过这两个点的直线方程。原创 2024-08-26 08:59:59 · 4729 阅读 · 0 评论 -
C# 程序来寻找直线的斜率(Program to find slope of a line)
m = \frac{y_2 - y_1}{x_2 - x_1} \] 这里,m 是斜率,(x_1, y_1) 和 (x_2, y_2) 是直线上的任意两点。斜率公式是线性代数和解析几何中的一个基本概念,用于描述直线的方向和倾斜程度。直线的斜率公式用于计算直线上任意两点之间的斜率。斜率,也称为“斜率”或“倾斜度”,是表示一条直线相对于x轴的倾斜程度。要计算直线的斜率,您只需要该直线上的两个点 (x1, y1) 和 (x2, y2)。给定两个坐标,求一条直线的斜率。原创 2024-08-19 10:43:24 · 7277 阅读 · 0 评论 -
C# 截面公式(按给定比例划分一条线的点)Section formula (Point that divides a line in given ratio)
截面公式告诉我们将给定线段分成两部分的点的坐标,使得它们的长度之比为 m : n。PS = x – x1 和 RT = x2 – x。从我们的图表中,我们可以看到,坐标 (1.5, 2.5)类似地,我们可以解出 y。按 1:1 的比例划分线。按 2:3 的比例划分线。利用相似性,我们可以写出。原创 2024-08-14 09:06:13 · 4945 阅读 · 0 评论 -
C# 程序查找直线的中点 (Program to find the mid-point of a line)
查找一条直线的中点可以通过简单的数学公式实现。中点的坐标是两个端点坐标的平均值。输入 : x1 = –1, y1 = 2,输入 : x1 = 6.4, y1 = 3。输出 : –2.15, 3.5。O(1),因为只执行常量操作。原创 2024-08-08 10:13:38 · 3739 阅读 · 0 评论 -
C# 打印空心金字塔、菱形图案及其修改的程序(Program to print hollow pyramid, diamond pattern and their modifications)
该模式类似于金字塔模式。要打印盒子形状,我们需要为 i==1(第一行)和 i==n(最后一行)打印 '-',为 j==1(第一列)和 j==n(最后一列)打印 '|'。要打印盒子形状,我们需要为 i==1(第一行)和 i==n(最后一行)打印 '-',为 j==1(第一列)和 j==n(最后一列)打印 '|'。6. 否则打印‘*’并从 1 遍历到 2*(ni)-3 以打印空心菱形的空间(比如 j),并在循环结束后打印‘*’。5. 如果 (i==n-1) 则打印‘*’(因为最后一行我们只需要一颗星)。原创 2024-08-06 09:51:38 · 3762 阅读 · 0 评论 -
C# 打印 V 和倒 V 图案的程序(Program to print V and inverted-V pattern)
倒 V 型模式:给定 n 的值,打印倒 V 型模式。O(n 2 ),其中 n 表示给定的输入。O(n 2 ),其中 n 表示给定的输入。O(1),不需要额外的空间,因此为常数。O(1),不需要额外的空间,因此为常数。给定 n 的值,打印 V 模式。原创 2024-08-02 10:03:34 · 3266 阅读 · 0 评论 -
C# 沙漏图案(Hour-glass Pattern)
O(rows_no*rows_no),其中rows_no是从用户获取的行值。给定正整数 n,以沙漏形式打印数字模式。O(1),因为我们不使用任何额外的空间。原创 2024-07-29 10:01:00 · 3846 阅读 · 0 评论 -
C# 打印菱形的程序(Program to print the Diamond Shape)
O(N 2 ),因为我们要遍历网格的行和列来打印空格 ' ' 和星号 '*'。O(n*n),因为我们正在遍历网格的行和列来打印空格 ' '和星号 '*'。给定一个数字n ,编写一个程序来打印一个有2n行的菱形。O(N),额外的空间用于递归调用堆栈。O(1),不使用额外空间。原创 2024-07-24 09:19:19 · 3890 阅读 · 0 评论 -
C# Program to print pyramid pattern (打印金字塔图案的程序)
这个想法是对金字塔的每个部分使用两个 for 循环。这两个部分可以分为上部和下部。我们强烈建议您最小化浏览器并先自己尝试一下。编写程序打印由星星组成的金字塔图案。原创 2024-07-22 09:06:52 · 4399 阅读 · 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-12 09:04:10 · 4657 阅读 · 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-08 09:10:02 · 4014 阅读 · 0 评论 -
C# 几何算法 打印图案 1*2*5*6 –3*4(Geometric Algorithms Print the pattern 1*2*5*6 –3*4)
给定整数 N,任务是打印一个倒三角形,其中左半部分由 [1, N*(N+1)/2] 范围内的元素组成,右半部分由 [N*(N+1)/2 + 1, N*(N+1)] 范围内的元素组成。观察该图案,我们可以很容易地发现它遵循了 ZIG-ZAG 图案,首先从顶行到底行打印几个数字,然后从底行到顶行打印数字,数字越来越多。4.1、然后,遍历i*2的长度,按递增的顺序打印每行前的空格。1、创建一个大小为N*N的二维向量arr[],使得矩阵为N*N。3、同样的,从下往上遍历,以同样的方式从下往上推送元素。原创 2024-07-01 10:12:35 · 4029 阅读 · 0 评论 -
C# 几何算法 打印带有交替“*”和“#”的下三角形(Geometric Algorithms Print lower triangle with alternate ‘*’ and ‘#’)
2.1、在外循环中,使用另一个循环将col 从 1 迭代到 row。这将是内循环,将表示当前行中的每一列。2.1.2、如果是偶数,则打印“#”字符。O(N 2 ) // 由于使用了两个嵌套循环,因此算法完成所有操作所需的时间是二次的。2、使用循环迭代从1 到 N 的行。这将是外循环,并将表示模式的每一行。2.1.1、在内层循环中,检查 col 是偶数还是奇数。2.2、内循环完成后,移至下一行(这将在模式中开始新行)。给定一个表示行数的数字N,任务是按照以下模式打印它的前N行。原创 2024-06-28 09:04:57 · 2356 阅读 · 0 评论 -
c# 对排序输入进行高效霍夫曼编码 | 贪婪算法(Efficient Huffman Coding for Sorted Input | Greedy Algo)
如果输入未排序,则需要先对其进行排序,然后才能通过上述算法进行处理。因此,对于未排序的输入,总体时间复杂度变为 O(nlogn)。如果我们知道给定的数组是排好序的(按频率非递减顺序),我们可以在 O(n) 时间内生成霍夫曼码。4.创建一个新的内部节点,其频率等于两个节点频率之和。将第一个出队节点设为其左子节点,将第二个出队节点设为右子节点。最初第二个队列是空的。剩下的节点就是根节点,树就完成了。3.通过检查两个队列的前面,使两个频率最小的节点出队。3. 否则,比较两个队列的前面,并使最小的节点出队。原创 2024-06-25 09:55:20 · 21444 阅读 · 0 评论 -
C# 霍夫曼解码
在给定的C#实现中,时间复杂度主要由使用优先级队列创建 Huffman 树决定,这需要 O(n log n) 时间。霍夫曼编码算法的时间复杂度为O(n log n),其中n为输入字符串的字符个数。下面的代码将一个字符串作为输入,对其进行编码,并将其保存在变量编码字符串中。4、如果在遍历过程中遇到叶节点,我们会打印该特定叶节点的字符,然后再次从步骤 1 开始继续迭代编码数据。由此可见,编码后的数据量是比较大的,上面的方法也可以帮我们确定N的值,也就是编码后数据的长度。要解码编码数据,我们需要霍夫曼树。原创 2024-06-19 09:04:13 · 19610 阅读 · 0 评论 -
C# 规范霍夫曼编码
出现频率最低的字符获得最大代码,出现频率最高的字符获得最小代码。在标准霍夫曼编码中,使用为每个符号生成的标准霍夫曼代码的位长。对于后续符号,如果符号的位长等于前一个符号的位长,则将前一个符号的代码加一并分配给当前符号。一种简单有效的方法是为数据生成一棵哈夫曼树,并使用类似于 Java 中的 TreeMap 的数据结构来存储符号和位长,以使信息始终保持排序。否则,如果符号的位长大于前一个符号的位长,则在增加前一个符号的代码后,将零附加到该代码上,直到长度等于当前符号的位长,然后将代码分配给当前符号。原创 2024-06-17 09:15:55 · 19379 阅读 · 0 评论 -
c# 使用优先级队列的霍夫曼编码(Huffman Coding using Priority Queue)
先决条件: 贪婪算法 | (霍夫曼编码)、priority_queue::push() 和 C++ STL 中的 priority_queue::pop()。给定一个字符数组 ch[]和每个字符的频率作为freq[]。任务是使用优先级队列为ch[]中的每个字符找到霍夫曼编码。1、将ch[]中所有映射到相应频率freq[]的字符推入优先级队列。3、将从优先级队列中弹出的两个节点指定为新节点的左子节点和右子节点。7、打印ch[]中每个字符的所有存储的哈夫曼编码。4、将新形成的节点推送到优先级队列中。原创 2024-06-12 09:01:12 · 19408 阅读 · 0 评论 -
C# 霍夫曼编码 | 贪婪算法(Huffman Coding | Greedy Algo)
分配给输入字符的可变长度代码是前缀码,这意味着代码(位序列)的分配方式是分配给一个字符的代码不是分配给任何其他字符的代码的前缀。将第一个提取的节点作为其左子节点,将另一个提取的节点作为其右子节点。现在最小堆包含 4 个节点,其中 2 个节点是每个节点只有一个元素的树的根,另外两个堆节点是具有多个节点的树的根。其思想是为输入字符分配可变长度的代码,分配的代码的长度基于相应字符的频率。现在最小堆包含 5 个节点,其中 4 个节点是每个节点只有一个元素的树的根,一个堆节点是具有 3 个元素的树的根。原创 2024-06-06 10:01:02 · 19122 阅读 · 0 评论 -
c# 工作排序(Job Sequencing Problem)
给定一个作业数组,其中每个作业都有一个截止期限,如果作业在截止期限之前完成,则可获得相关利润。按截止日期的升序对作业进行排序,然后从末尾开始迭代,计算每两个连续截止日期之间的可用时隙。当空时隙可用且堆不为空时,将作业的利润包含在最大堆的根部,因为这有助于为每组可用时隙选择利润最大的作业。贪婪地首先选择利润最高的工作,方法是按利润降序对工作进行排序。这将有助于最大化总利润,因为为每个时间段选择利润最高的工作最终将最大化总利润。以下是工作利润最大的序列:c、a。以下是工作利润最大的序列:c,a,e。原创 2024-06-03 09:05:05 · 1091 阅读 · 0 评论 -
c# 贪心算法(Greedy Algo)
贪心选择是总是选择剩余活动中完成时间最短的下一个活动,并且开始时间大于或等于先前选择的活动的结束时间。我们可以根据活动的完成时间对活动进行排序,以便我们始终将下一个活动视为完成时间最短的活动。在实现中,假设活动已经按照完成时间排序,否则时间复杂度将上升到 O(N*log(N)),辅助空间将上升到 O(N),因为我们必须创建一个二维数组来将开始时间和结束时间存储在一起。B 中的活动是独立的,并且 k 的完成时间是所有活动中最小的。每一步,我们都可以做出当前看来最好的选择,从而得到整个问题的最优解。原创 2024-05-27 10:00:22 · 1273 阅读 · 0 评论 -
C# 分而治之(施特拉森矩阵乘法)
在上面的分而治之的方法中,高时间复杂度的主要成分是8次递归调用。Strassen 方法与上述简单的分而治之方法类似,该方法也将矩阵划分为大小为 N/2 x N/2 的子矩阵:如上图所示,但在Strassen方法中,结果的四个子矩阵是使用以下公式计算的。在上述方法中,我们对大小为 N/2 x N/2 的矩阵进行 8 次乘法和 4 次加法。1、将矩阵 A 和 B 分为 4 个大小为 N/2 x N/2 的子矩阵,如下图所示。2、对于稀疏矩阵,有专门为其设计的更好的方法。上述方法的时间复杂度为O(N 3 )。原创 2024-05-27 09:03:15 · 593 阅读 · 0 评论 -
c# 使用分而治之算法进行快速乘法的 Karatsuba 算法(唐叶算法)
糖叶算法 看一下上面的公式,有四次大小为n/2的乘法,所以我们基本上将大小为n的问题分为四个大小为n/2的子问题。但这并没有帮助,因为递归 T(n) = 4T(n/2) + O(n) 的解是 O(n^2)。在经典方法中,时间复杂度为O(n^2),因为循环迭代了 n 次。在Karatsuba 方法中,辅助空间为O(n),因为Karatsuba 类的“乘法”方法是针对三个乘积中的每一个递归调用的。通过上述技巧,递推式变为 T(n) = 3T(n/2) + O(n) 并且该递推式的解为 O(n 1.59 )。原创 2024-05-21 09:20:01 · 1200 阅读 · 0 评论 -
C# 快速排序(QuickSort)
为了缓解最坏的情况,使用了各种技术,例如选择一个好的主元(例如,三的中位数)并使用随机算法(随机快速排序)在排序之前对元素进行混洗。分区的目标是将主元(可以选择任何元素作为主元)放置在已排序数组中的正确位置,并将所有较小的元素放在主元的左侧,将所有较大的元素放在主元的右侧。它不是稳定的排序,这意味着如果两个元素具有相同的键,在快速排序的情况下,它们的相对顺序将不会保留在排序的输出中,因为这里我们根据枢轴的位置交换元素(不考虑它们的原始位置)职位)。QuickSort 中的分区:将枢轴与 90 进行比较。原创 2024-05-16 10:08:02 · 20710 阅读 · 0 评论 -
c# 归并排序
它的工作原理是递归地将输入数组划分为较小的子数组并对这些子数组进行排序,然后将它们合并在一起以获得排序后的数组。简单来说,归并排序的过程就是将数组分成两半,对每一半进行排序,然后将已排序的两半合并在一起。合并排序不是就地排序算法,这意味着它需要额外的内存来存储排序后的数据。归并排序是一种稳定的排序算法,这意味着它保持输入数组中相等元素的相对顺序。归并排序在排序过程中需要额外的内存来存储合并后的子数组。O(n log n),当数组已经排序或接近排序时。O(n),合并时使用的临时数组需要额外的空间。原创 2024-05-10 09:53:32 · 863 阅读 · 0 评论 -
c# 为什么二元搜索优于三元搜索
在每一步中,算法将目标值与数组中间元素进行比较,如果中间元素等于目标值,则找到目标,如果中间元素大于目标值,则在左半部分继续搜索,如果中间元素小于目标值,则在右半部分继续搜索。因此,三元搜索和二元搜索的比较归结为表达式 2Log 3 n 和 Log 2 n的比较。由于 (2 / Log 2 3)的值大于 1,因此在最坏情况下,三元搜索比二元搜索进行更多的比较。根据上面的定义,二元搜索是将搜索范围划分为两部分,而三元搜索是将搜索范围划分为三部分。在三元搜索中,最坏情况下有 4Log 3 n + 1 次比较。原创 2024-05-06 09:08:20 · 1407 阅读 · 0 评论 -
c# 插值搜索与二分搜索
如果中间元素等于目标值,则找到目标;插值搜索是一种根据目标值在已知范围内的分布情况,预测目标值应该在的位置,然后进行搜索的算法。插值搜索平均进行 log(log(n)) 次比较(如果元素均匀分布),其中 n 是要搜索的元素数量。当列表中的元素均匀分布时,插值搜索比二分搜索更有效,而当列表中的元素不均匀分布时,二分搜索更有效。插值搜索根据目标元素周围元素的值来估计目标元素的位置,而二分搜索总是从检查列表的中间元素开始。插值搜索可能比二分搜索需要更长的时间来实现,因为它需要使用额外的计算来估计目标元素的位置。原创 2024-04-25 11:58:23 · 974 阅读 · 0 评论 -
c# 线性搜索与二分搜索
那么搜索目标项目的唯一方法就是从第一个位置开始,并将其与目标进行比较。否则,我们将转移到下一个位置。然而,在二分搜索中,一旦找到排序列表的中间,就将搜索量减少一半。O(1) – 二分查找算法只需要常数空间来存储低、高、中索引,不需要任何额外的数据结构,因此其辅助空间复杂度为 O(1)。O(n),其中 n 是输入数组的大小。最坏的情况是数组中不存在目标元素,并且该函数必须遍历整个数组才能找出该元素。O(log n) – 二分搜索算法在每一步将输入数组分成两半,将搜索空间减少一半,因此具有对数阶的时间复杂度。原创 2024-04-22 09:36:58 · 872 阅读 · 0 评论 -
c# 无处不在的二分搜索
给定一个由 N 个不同整数组成的数组,找到输入“key”的下限值。以下是可能的极端情况, —> 如果数组中的所有元素都小于 key,则左指针移动到最后一个元素。—> 如果数组中的所有元素都相等且原创 2024-04-15 09:58:01 · 1299 阅读 · 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-12 09:05:54 · 1363 阅读 · 0 评论 -
c# 指数搜索(Exponential Search)
一旦我们找到一个索引 i(在重复将 i 加倍之后),我们就知道该元素必须存在于 i/2 和 i 之间(为什么是 i/2?因为我们在之前的迭代中找不到更大的值)下面给出的是上述步骤的实施。这个想法是从子数组大小 1 开始,将其最后一个元素与 x 进行比较,然后尝试大小 2,然后是 4,依此类推,直到子数组的最后一个元素不大于。上述二分查找的实现是递归的,需要 O(Log n) 空间。2、对于有界数组,以及当要搜索的元素更接近第一个元素时,它比二分搜索效果更好。搜索的元素 x,找到 x 在数组中的位置。原创 2024-04-06 09:28:38 · 665 阅读 · 0 评论 -
c# 插值搜索-迭代与递归(Interpolation Search)
插值搜索是对实例二分搜索的改进,其中排序数组中的值是均匀分布的。另一方面,插值搜索可以根据正在搜索的键的值去不同的位置。线性插值采用两个数据点,我们假设为 (x1,y1) 和 (x2,y2),公式为:在点 (x,y) 处。我们假设数组的元素是线性分布的,直线的一般方程:y = m*x + c,y 是数组中的值,x 是其索引。给定一个由 n 个均匀分布值 arr[] 组成的排序数组,编写一个函数来搜索数组中的特定元素 x。在二分查找的情况下,该常数的值为:K=(low+high)/2。原创 2024-04-02 09:06:16 · 1265 阅读 · 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-28 09:05:00 · 1327 阅读 · 0 评论 -
c# 三元搜索 - 迭代与递归(Ternary Search)
例如,二分搜索将信息分为两部分,而三元搜索则执行相同的操作,但分为三个相等的部分。在本文中,我们将揭开三元搜索的秘密——它是如何工作的,为什么它在某些情况下更快。如果目标位于mid1和mid2的元素之间,则将左指针更新为mid1 + 1,将右指针更新为mid2 – 1。它的工作原理是将数组分为三部分,并对适当的部分递归地执行搜索操作,直到找到所需的元素。三元搜索的时间复杂度为O(2 * log 3 n),比线性搜索更高效,与二分搜索相当。需要注意的是,要使三元搜索正常工作,要搜索的数组必须进行排序。原创 2024-03-21 10:01:49 · 1242 阅读 · 0 评论 -
C# 元二分搜索 | 单边二分查找(Meta Binary Search | One-Sided Binary Search)
如果中间元素大于目标元素,则算法将新区间设置为前一个区间的左半部分,如果中间元素小于目标元素,则将新区间设置为前一个区间的右半部分间隔。元二分搜索相对于二分搜索的优势在于,它在某些情况下可以执行更少的比较,特别是当目标元素接近列表开头时。因此,当列表的排序方式与目标元素的分布一致时,元二分搜索是最有效的。元二分搜索(Steven Skiena 在《算法设计手册》第 134 页中也称为单边二分搜索)是二分搜索的一种修改形式,它以增量方式构建数组中目标值的索引。3、如果找到该元素,则返回 pos。原创 2024-03-18 09:50:55 · 1042 阅读 · 0 评论