下面是我对图形编辑器编程挑战的解决方案,详细here(花了3天时间才解决)。输出正确时,它会产生time_limit_exceeded错误。我认为问题在于我实现了flood_fill函数的方式,当用户输入" F"作为一行的第一个字母。如果有人解释我的代码效率低下以及如何改进它,我将不胜感激。我的代码如下:
identityProviders:
- name: my_htpasswd_provider
challenge: true
login: true
provider:
apiVersion: v1
kind: HTPasswdPasswordIdentityProvider
file: /path/to/users.htpasswd
答案 0 :(得分:1)
你的洪水填充有一些非常糟糕的性能问题。
这是最大的两个:
1)您正在使用矢量作为队列。这非常慢,因为从向量的开头移除项目需要花费O(N)的时间。改为使用deque,或者通过从末尾而不是从开头获取项目来使用像堆栈而不是队列的向量。
2)你将get_matching_neighbors返回的所有内容排入队列,但它可以返回队列中已经区域的内容。因此,您最终可以扫描并将相同像素排入多次次。
要解决问题(2),您应该:
a)如果目标像素已经是正确的颜色,则立即从洪水填充返回。然后
b)将它们放入队列时的彩色像素,而不是当它们取出时。这样你就不会在队列中排除任何已经存在的东西,因为队列中没有任何东西具有原始颜色。
让get_matching_neighbors分配新的向量也相当昂贵。你应该传递一个对现有向量的引用并让它替换内容,或者将它传递给队列并让它重新着色并添加它找到的像素。
答案 1 :(得分:0)
您可以应用于代码的一些整体优化提示:
首先,规范说颜色是1拉丁字符...所以你为什么要使用字符串?字符串很慢,特别是当你知道你将收到一个字符时。
第二 - 当你使用向量并知道你将推动很多元素(并且你知道之前的数量),然后reserve()
向量的实际大小和元素的数量你要补充一下。
当你将向量附加到向量时,只需保留足够的空间然后
insert(first.begin(), second.begin(), second.end());
更不用说我实际上建议不要使用矢量......它们很容易使用,但通常比使用数组慢。因此,如果算法本身不是很复杂 - 使用数组。还要记住,c风格的数组比指针更快(矢量操作指针)。
第三 - 尽可能使用构造函数,使用预递增/递减运算符,并且在可能的情况下始终从n迭代到0(生成约2个asm指令)for(int i=0; i<n; i++)
- &gt; for(int i(n); i>0; --i)
第四 - 如果您有if()...else if()...else if()
链,请考虑使用switch()
。在大多数情况下,编译器会为它们创建一个查找表。但我相信switch
可以保证这一点,但if
链不会这样做。简而言之 - switch()
最有可能比if
第五 - 如果你必须使用向量,并且必须用一些值填充它们,可以使用<algorithm>
和迭代器,或者使用它附带的C++11
和vector::data()
来获取指向已分配数组的指针,并迭代它。
如果您不理解“如何”或“为什么”,请做一些研究。如果你已经做了但仍然不明白,那么我无法帮助你 - 我不会为你优化代码。这样你就什么都学不到了。
此外,当给定的优化似乎没有足够优化时,请考虑考虑新算法。