草庐IT

algorithm

全部标签

c++ - 处理设定间隔的算法

在C++中实现需要跟踪设置间隔的类的最佳方法是什么?我希望利用现有的STL或Boost库,但除了使用标准容器之外,我不得不求助于手动实现算法,这出人意料地难以正确实现,而且我不得不以牺牲一些性能为代价来简化它,因为一项工作最后期限。一定有更好的方法。例如,我需要以下类型的行为:classSubRange{public:SubRange(constT&lower_bound,constT&upper_bound);...};Subranger1(1,3);Subranger2(5,6);Subranger3(6,9);Subrangetot=r1+r2+r3;cout注释子范围由下限和上

c++ - 查找数组总数

我有一个由N个整数组成的数组A。我还有一个整数K。我想通过恰好应用以下操作K次,找出我可以从数组A中获得的不同数组的数量。选取数组中的某个元素并将其乘以-1数组A=[2,3,2]且k=2我有四种可能的数组1.[2,3,2]2.[-2,-3,2]3.[-2,3,-2]4.[2,-3,-2]这可以计算为∑nCr的总和,其中r是{k,k-2,k-4....}。编辑但是对于正数和负数的组合,假设我们的数组是A=[-1,2,3]和k=3,所有可能的组合都是1.[1,2,3]2.[-1,-2,3]3.[-1,2,-3]4.[1,-2,-3]总共4个数组,也总共4个数组。我刚刚提交了我认为应该正确的

c++ - Median of Medians 算法误解的中位数?

我已经明白了我知道中位数算法的中位数(我将表示为MoM)是一个高常数因子O(N)算法。它找到k组(通常为5)的中位数,并将它们用作下一次迭代的集合以查找的中位数。找到它后的基准将在原始集的3/10n和7/10n之间,其中n是找到一个中值基本情况所需的迭代次数。当我为MoM运行这段代码时,我总是遇到段错误,但我不确定为什么。我调试了它并认为问题在于我正在调用medianOfMedian(medians,0,medians.size()-1,medians.size()/2);。但是,我认为这在逻辑上是合理的,因为我们应该通过调用自身来递归地找到中位数。也许我的基本情况不正确?在YogiB

c++ - 我如何直观地证明这段代码的时间复杂度

我有一段代码如下:intsearchNumOccurrence(vector&V,intk,intstart,intend){if(start>end)return0;intmid=(start+end)/2;if(V[mid]k)returnsearchNumOccurrence(V,k,start,mid-1);returnsearchNumOccurrence(V,k,start,mid-1)+1+searchNumOccurrence(V,k,mid+1,end);}凭直觉来分析,我们假设数组中的所有数字都=k。这意味着我们可以在returnsearchNumOccurrenc

C++:计算给定范围内可能的浮点值的数量

我正在开发一个加密应用程序,使用Crypto++作为此应用程序的一个晦涩部分,我需要确定在特定数值范围内可以存在的唯一浮点值的最大数量。显然在现实中0和1之间存在无穷多个数字-但并非所有数字都可以用唯一的浮点值表示。我有一个最小浮点值和一个最大浮点值。我需要确定此范围内可能的浮点值的数量。这很棘手,因为浮点值间隔得越远,离0越远。例如,0和1之间的可能浮点值的数量与100,000和100,001出于我的目的,我希望计数也包括最小值和最大值。但是生成独占计数的算法同样有用,因为我可以根据需要简单地添加1或2。其他问题:如果0在范围内怎么办?例如,如果最小值为-2.0,最大值为正2.0,我

c++ - 双向插入排序错误

我正在尝试进行双向插入排序。它应该获取数组中的第一个值,然后通过将其与第一个值进行比较来对数组中的以下数字进行排序。如果数字较大,则放在数组中第一个数字的后面,如果数字较小,则放在前面。这是一张说明该过程的图片。这里的数组是65318724,从上往下读就是排序过程的每一步。它将数字6与其余数字进行比较,然后相应地放置它们。到目前为止我有这段代码:voidtwowaysort(intn,inta[]){intj;intfirst=a[0];for(inti=1;ifirst){j=i+1;while(j=0&&a[j]>a[j+1]){swap(a[j+1],a[j]);j=j-1;}}

c++ - 为第一个元素对数组进行排序的算法,然后是前 2 个元素,然后是前 3 个元素,依此类推

我有一个未排序的数字列表,我想要一个算法,这样我可以获得第一个R元素的排序列表,但是由于这个R对于不同的测试用例可能不同,我不想每次都对第一个R的数组进行排序元素。有没有办法让我完成这项工作。一种可能的方法是维护vector数组,这样我先排序1个数字,然后排序前2个数字,然后排序前3个数字,依此类推,但这需要1log1+2log2+3log3+....+nlogn时间,即N^2logN复杂度。有更快的方法吗? 最佳答案 在这种情况下,旧的插入排序似乎会比O(N^2lgN)做得更好,因为您不需要对元素进行排序从头开始为每个R。假设您有

c++ - 寻找对的更有效方法

我最近遇到了一个问题,该问题要求找到好的圆对的数量。当通过连接第一个圆上的任意点P1和第二个圆上的P2可以获得给定的距离时,就形成了一对好的圆。我们有N个圆和Q个距离。接下来的N行包含圆心的坐标(X、Y)及其半径R.之后,下一个Q列出了要检查的距离。以下约束适用:2≤N≤1031≤Q≤5⋅105X,Y≤|2⋅105|1≤R≤2⋅1050≤K≤106执行时间必须这里,K是要检查的距离。删除了我的代码,因为它是正在进行的竞赛的一部分我的代码只被部分接受,我花了几个小时试图为这个问题找到一个有效的算法。任何人都可以提供一个有效的方法来解决这个问题,以便解决TLE问题吗?

c++ - 确定一个数组是否可以分成两个子序列,每个子序列的顺序都是递增的

我目前正在为我的算法课做作业。指令摘要:用户输入一个整数“n”来确定测试用例的数量。用户单独输入另一个整数“num”以确定每个测试用例中元素的数量。用户输入单个数组的元素。算法必须处理数组并确定它是否可以划分为两个子序列,每个子序列都严格递增。如果结果是肯定的,程序打印"is",否则打印“否”。我有24小时的时间来完成这项任务,但我正在努力解决主要问题-我无法正确处理用户输入。(想出一个算法来拆分两个子序列)更新:我找到了这个解决方案。它通过了4/5测试,但在最后一次测试中未达到时间限制。#include#includeusingnamespacestd;boolrun(){intnu

c++ - "How to impress interviewers with my coding? What practices can I adopt in the code I' 已经为给面试官留下深刻印象的问题而写了吗?

假设有一个整数vector。现在我们想要合并,我们选择2个相邻元素v[I]和v[I+1](对于每个有效的I)并执行v[I]=v[I+1]+v[I]。并删除v[I+1]。继续这样做,直到vector中只剩下一个元素。(注意I=0&I=v.size()-1也被认为是相邻的)。所以我们需要尝试所有这些可能的组合(即我们首先采用哪一对并合并问题,如果需要进一步说明,请在评论中告诉我)每次我们合并时,我们都会做成本+=v[I]+v[I+1]。目标是最小化成本。举个例子说vector是123。合并[123]->[3,3]&cost=3->[6]&cost=9另一种方式[123]->[1,5]&co