草庐IT

Algorithm

全部标签

c++ - 在 C/C++ 中查找字符串中具有任意字符顺序的子字符串

假设我有一个字符串“abcdpqrs”,现在“dcb”可以算作上述字符串的子字符串,因为字符在一起。“pdq”也是上述字符串的一部分。但是“bcpq”不是。我希望你得到我想要的。有什么有效的方法可以做到这一点。我所能想到的就是借助哈希来做到这一点。但即使在O(n)程序中也需要很长时间,因为在许多情况下需要回溯。任何帮助将不胜感激。 最佳答案 这是一个O(n*alphabetsize)的解决方案:让我们维护一个数组count[a]=字符a在当前窗口出现了多少次[pos;pos+子串的长度-1]。窗口向右移动1(count[s[pos]

c++ - 迭代任意范围的 n 维数组的最快方法?

在C++中,我希望迭代一个n维数组,其范围分别从min[n]到max[n],并在整个过程中分别保持ord[n]中的纵坐标。即。通用解决方案:for(intx=0;x形式:intmin[n]{0,3,-2...}intmax[n]{10,20,5...}intord[n]{0,0,0...};intmaxIterations=(max[0]-min[0])*(max[1]-min[1])*....for(intiteration=0;iteration我能想到的iterate()最快的算法是:inlinevoiditerate(intdimensions,int*ordinates,in

c++ - 保证值序列所有可能排列的伪随机分布 - C++

随机问题。我正在尝试创建一个程序来生成伪随机分布。我正试图找到适合我需要的伪随机算法。这些是我的担忧:1)我需要一个输入来在每次使用时生成相同的输出。2)它需要足够随机,以至于查看输入1的输出的人看不到输入1的输出与输入2的输出之间没有任何联系(等等),但不需要密码安全或真正随机。3)它的输出应该是一个介于0和(29^3200)-1之间的数字,该范围内的每个可能的整数都是一个可能的且同样(或接近)可能的输出。4)我希望能够保证410个输出序列的每个可能排列也是连续输入的潜在输出。换句话说,0到(29^3200)-1之间的410个整数的所有可能分组应该是顺序输入的潜在输出。5)我希望该函

c++ - 网格 : "Sorting/Reordering" Arrays Referencing Shared Entries of Another for Cache Efficiency

给定一个顶点数组:{v1,v2,v3,v4,v5,...,vN}和K个多边形用这样的块索引它,用于示例4边多边形*:{v7,v2,v51,v16}请注意,两个或多个多边形可能共享同一个顶点。事实上,大多数顶点将由4-6个多边形共享(四边形网格的价数为4,三角形网格的价数为6)。...我们如何有效地重新排序/排序顶点数据,例如在读取给定多边形的顶点时减少缓存未命中?我对一种在合理时间内完成的算法感兴趣,而不仅仅是提供最佳结果的算法。在这里,即使是一些粗略的启发式方法也比完全任意的顺序要好。理想的情况是将{v1052,v507213,v63252,v3}之类的东西变成更像:{v70,v71

C++ Std 队列和 vector 性能

我最近一直在处理图形,我正在研究从图形返回路径。该路径需要作为包含所有节点的标准vector返回,其中起始节点在前。我一直在寻找两种选择:-使用slowvectorinsert方法在vector前面添加节点-使用双端队列将节点添加到前端(push_front),这样速度更快。然后使用std::copy将双端队列复制到vector与另一种方法相比,使用一种方法是否有显着的性能提升? 最佳答案 由于您要返回一条路径,因此您可能对其长度有一个上限。因此,您可以调用创建一个vector,调用reserve之后(如@user2079303所写

c++ - 使用 Barnes-Hut 进行图形放置的优化问题

我一直在尝试解决我的图形可视化应用程序中的力导向图/Barnes-Hut问题。到目前为止,我已经检查了八叉树的创建,它看起来正确(树由方框表示,圆圈是我的图形节点):我的Quadtree中的字段如下:classQuadtree{public:intlevel;Quadtree*trees[2][2][2];glm::vec3vBoundriesBox[8];glm::vec3center;boolleaf;floatcombined_weight=0;std::vectorobjects;//Additionmethods/fieldsprivate://Additionalmetho

c++ - 一堆盒子 - 动态规划

我目前正在练习一些动态规划。我遇到了一堆盒子。这些框表示为:structBox{doubleh;doublew;doubled;};问题是创建最高的盒子堆,其中每个盒子(在宽度和深度上)都比它上面的盒子大。让我们假设在这种情况下盒子不能旋转。我将这些盒子存放在std::vector中.我首先按宽度进行稳定排序,然后按深度进行排序,这样每当我选择一个盒子时,我只需要向前搜索下一个适合的盒子。这是我的问题-这是最优的吗?我想每次我选择一个盒子时我都需要搜索线性时间(O(n))以便选择下一个可能的盒子。有没有不同的方法来存储时间复杂度可能更好的盒子?当然也欢迎任何其他优化。我的完整代码://

c++ - 找出分数 a/b 的小数点后第 k 位,其中 a,b,k 是非常大的整数(小于 10e18)

我的任务是找到分数(a/b)小数点后第k位的数字。昨天我发现了这个算法。为了获得小数点后的任何数字,我生成了一个名为rem的变量并进行了循环for(inti=1;i循环将返回一个值,该值是小数点后的第k位。但是这个任务要求我用a,b,k计算非常大的数(小于或等于10e18),所以代码肯定会超过时间限制。找出重复前的数字个数。它是分母中因数2和5中较大的一个。如果k不超过位数,运行for循环。否则,我们仍然会运行for循环到k+1。将除法的余数存储在变量x中。用上面相同的内容运行一个while循环,直到余数再次具有x的值。此后,将除法的每一个商存储到一个名为qut的数组中。while循环

c++ - 如果我们可以将特定数组元素增加/减少 1,则平衡数组的最小总移动量

这是leetcode462。我有一种算法,但它在通过其他测试时未通过某些测试。我试图仔细考虑但不确定我忽略的极端情况是什么。我们有一个包含N个元素的数组。一次移动定义为将数组的一个元素增加或减少1。我们试图找到使所有元素相等的最小移动次数。我的想法是:1.求平均值2.找到最接近平均值的元素3.将每个元素与最接近平均值的元素的差值相加。我错过了什么?请提供一个反例。classSolution{public:intminMoves2(vector&nums){intsum=0;for(inti=0;i 最佳答案 假设数组是[1,1,10

c++ - PCL估计某些部分的法线方向错误

我正在使用PCL计算点云的法线。用Meshlab,法线是对的,虽然所有的法线都是从外到内的,但是我把它们都反转后就是正确的。但是当我使用PCL执行此操作时,如左图所示,一些法线的方向是错误的。为了更有意义,下面是使用meshlab和PCL重建的表面,使用PCL估计的法线,我无法得到正确的结果。我的代码如下,我的示例.ply数据是here,我的模型可以在这里找到,我尝试更改半径、邻居数和质心位置,但无法解决这个问题。coutne;pcl::search::KdTree::Ptrtree(newpcl::search::KdTree());ne.setSearchMethod(tree);