草庐IT

algorithm

全部标签

c++ - 需要更快地计算(近似)方差

我可以通过CPU分析器看到,compute_variances()是我项目的瓶颈。%cumulativeselfselftotaltimesecondssecondscallsms/callms/callname75.635.435.4340135.75135.75compute_variances(unsignedint,std::vector>const&,float*,float*,unsignedint*)19.086.801.37readDivisionSpace(Division_Euclidean_space&,char*)...这是函数体:voidcompute_var

c++ - C++ 中 strstr() 函数的时间复杂度、空间复杂度和算法是什么?

我很好奇在C++中使用默认的老式strstr()函数的成本。它的时间和空间复杂度是多少?它使用哪种算法?我们还有其他具有以下最坏情况时间和空间复杂度的算法:设n=字符串长度,m=模式长度Knuth-Morris-Pratt算法:时间=O(n+m),空间=O(m)Rabin-Karp算法:时间=O(n*m),空间=O(p)(p=组合长度m的p模式)Boyer-Moore算法:时间=O(n*m),空间=O(S)(S=字符集的大小)就时间和空间复杂性而言,strstr()在任何方面都优于上述算法? 最佳答案 在C标准中它只是说,在§7.2

c++ - 为什么需要间接寻址

这个问题在这里已经有了答案:CreatingCmacrowith##and__LINE__(tokenconcatenationwithpositioningmacro)(3个答案)关闭6年前。考虑以下宏:#defineCAT(X,Y)X##Y#defineCMB(A,B)CAT(A,B)#defineSLB_LOGGING_ALGORITHMCMB(Logging,SLB_ALGORITHM)其中SLB_ALGORITHM是定义的预处理器符号。如果我直接使用CAT而不是CMB,则SLB_ALGORITHM不会展开。为什么会这样?间接寻址究竟有何帮助?

c++ - 柴油发电机驱动算法

我有一个旧的柴油发电机,我在给调速器编程时遇到了很大的问题。我需要引擎保持在2400-2800RPM之间我有强大的RC汽车伺服插入发动机的throttle杆,伺服在22°(最小)和95°(最大)燃油喷射之间移动我用Atmelmeg328微Controller驱动它。速度通过哈尔效应传感器和飞轮上的单个磁铁测量。我测量转一整圈所需的时间,并据此计算RPM(这意味着如果引擎速度更快,代码会更频繁地对其使用react=>喷射量变化更快)首先我尝试了最简单、最愚蠢的方法。如果RPM大于我的需要,则将伺服后退=>较小的燃油喷射量。如果RPM低于所需的步进伺服前进。结果证明这是一个非常糟糕的主意,

c++ - "if"语句对性能有多大影响?

有一些不同大小的IPTables(例如255或16384或512000!!)。每个表的每个条目都包含一个唯一的IP地址(十六进制格式)和一些其他值。IP总数为800万。所有IPTables的所有IP都排序我们需要每秒搜索IPTable300,000次。我们目前查找IP的算法如下://10_ipTable[i].start&&ip可以看出,在最坏的情况下,给定IP地址的比较次数为_rangeCount*2,“if”语句检查的次数为_rangeCount。假设我想更改searchIPTable并使用更有效的方法在IPTables中查找IP地址。据我所知,对于排序数组,二进制搜索等著名搜索算

c++ - 用于查找图像堆栈中每个像素的平均值的快速数据结构或算法

我有一堆图像,我想计算其中每个像素的平均值。例如,设(x_n,y_n)为第n张图像中的(x,y)像素。因此,图像堆栈中三幅图像的像素(x,y)的平均值为:mean-of-(x,y)=(1/3)*((x_1,y_1)+(x_2,y_2)+(x_3,y_3))我的第一个想法是将每个图像的所有像素强度加载到具有单个线性缓冲区的数据结构中,如下所示:|Allpixelsfromimage1|Allpixelsfromimage2|Allpixelsfromimage3|为了找到图像堆栈中像素的总和,我执行了一系列嵌套的for循环,如下所示:for(intcol=0;col基本上img*img_

c++ - 在无向树中寻找路径的算法

假设我有一棵无向树,我需要在两个节点之间找到一条路径(唯一路径)。最好的算法是什么。我可能可以使用Dijkstra算法,但对于树来说可能有更好的算法。C++示例会有所帮助但不是必需的谢谢 最佳答案 假设每个节点都有一个指向其父节点的指针,那么只需从每个起始节点向根节点回溯树。最终,这两条路径必须相交。交集测试可以像维护节点地址的std::map一样简单。更新当您更新问题以指定无向树时,以上内容无效。一种简单的方法是简单地从节点#1开始执行深度优先遍历,最终您将到达节点#2。这是树的大小的O(n)。假设有一个完全通用的树,我不确定是否

c++ - 算法:查找给定范围内的数字计数

给定一个未排序的数字数组,其中可能存在重复项,对数组进行预处理,以便找到给定范围内数字的计数,时间为O(1)。例如,7,2,3,2,4,1,4,6.数字的计数都是>=2和是5.(2,2,3,4,4). 最佳答案 对数组进行排序。对于已排序数组中的每个元素,将该元素插入到哈希表中,以元素的值作为键,并将其在数组中的位置作为关联值。任何被跳过的值,您都需要插入。要查找范围内的项目数,请在哈希表中查找范围每一端的值的位置,然后从上限减去下限以找到范围的大小。 关于c++-算法:查找给定范围内的

c++ - 如何在 C++ 中精确显示 double 的小数位?

ProblemGiventwointegersa,b,aSampleInput3734580011299053122SampleOutput.428751Thelast6digitsrepeatforever..43125Thisexpansionterminates..113Thelast2digitsrepeatforever..4344262295081967213114754098360655737704918032786885245901639Thelast60digitsrepeatforever.注意:此问题源自ProgFest编程竞赛。如果我们应用这三个定理,这个问题的

c++ - OBB(定向边界框)算法中的点?

给定形成OBB的中心点、宽度、高度和角度,如何确定给定点P是否在OBB内?谢谢 最佳答案 我认为你的问题中的皱纹是边界框可以旋转?如果是这样,对我来说最简单的解决方案似乎是在以边界框中心为中心的旋转坐标平面中进行所有计算。要计算点相对于这些轴的坐标:newy=sin(angle)*(oldy-centery)+cos(angle)*(oldx-centerx);newx=cos(angle)*(oldx-centerx)-sin(angle)*(oldy-centery);(您可能需要根据角度的测量方式进行调整,我会把它留给您,因为