Algorithm 多项式时间内数的平方深度 更新

Algorithm 多项式时间内数的平方深度 更新,algorithm,time-complexity,big-o,Algorithm,Time Complexity,Big O,似乎根本不可能做到这一点。有人还寄给我一份不同考试的复印件,其中问了几乎相同的问题,但不同的是,你不能从任何位置删除,只能从开始或开始删除。这个问题很可能是抄袭时出错了。现在我只需要证明这一点,并要求重新评估试题 几周前,在一门关于数据结构和算法的课程的考试中,我遇到了以下问题。我当时无法在规定的时间内解决这个问题,尽管我可能会通过这门课程,但从昨天起我就一直在努力想出一个解决方案,以便提高我的技能 问题 给定一个整数n我们反复从任何位置消除一个数字,直到只剩下一个数字。函数PC(n)定义为通过

似乎根本不可能做到这一点。有人还寄给我一份不同考试的复印件,其中问了几乎相同的问题,但不同的是,你不能从任何位置删除,只能从开始或开始删除。这个问题很可能是抄袭时出错了。现在我只需要证明这一点,并要求重新评估试题

几周前,在一门关于数据结构和算法的课程的考试中,我遇到了以下问题。我当时无法在规定的时间内解决这个问题,尽管我可能会通过这门课程,但从昨天起我就一直在努力想出一个解决方案,以便提高我的技能

问题 给定一个整数n我们反复从任何位置消除一个数字,直到只剩下一个数字。函数PC(n)定义为通过所述过程可获得的整数平方的最大数目

例如PC(32492)=3。两种可能的序列是:

  • 32492->3249->324->24->4
  • 32492->3249->349->49->9
现在设计一种算法,可以在d的多项式时间内计算PC(n),其中d是n中的位数。假设您有一种方法来测试一个数字在O(1)时间内是否是整数的平方

到目前为止我所尝试的
第一种方法显然是测试每个可能的序列并返回最大值。如果我没弄错的话,这是O(d!)

改进了蛮力方法,我添加了一个HashMap,其中存储了所有已经计算过的值。这样,我们可以使用O(1)查找来避免必须计算相同的值两次。这显然是对实时性的改进,但我很难得到时间复杂度的下限。所以,据我所知,这不是多项式

我还尝试了一些贪婪算法的方法,但正如预期的那样,我发现每一种算法(我能想到的)都有一种情况,它没有进行最佳选择


任何帮助都将不胜感激。我试着在网上寻找类似的问题,但到目前为止运气不佳。

棘手、棘手。这方面的平方查找是一个危险的方面,如果您可以在
O(1)
中检查它,这是一个没有意义的问题。真正的问题是独特的、有序的子串查找,这似乎归结为在与它争论了一段时间后查找子串,也许这是一个技巧性问题,目的是证明它无法完成?

发布此答案,这样问题就不会一直悬而未决。似乎是老师的错误,不可能


这个问题可能只允许消除第一个或最后一个数字,在这种情况下,可以使用动态规划在O(d^2)中解决问题。

如果N是数字,那么d=log10(N)是数字。时间是O(d!)我认为你可能抓住了问题的错误方向。由于我今天的工作需要,我没有时间完全解决这个问题,但是对于你的例子来说,每个完美的正方形必须是@pjs,即时间
O(sqrt(N))=O(10^(d/2))
,在
d
中是指数。但我认为这是个正确的想法。嗯,这个问题对我来说似乎无关紧要。有一个指数数量的不同子序列是可能的(例如,如果我们重复9876543210 k次,那么我们可以从一个长度为10k的序列中生成所有10^k位数字,以10^(1/10)为基数的指数),因此如果我们所有的平方测试都是一个不透明的常数时间框,如果不调用一些非平凡的数论,我们不可能检查所有的序列,这会让我们奇怪地提到平方检查是常数时间,因为牛顿的算法并不特别晦涩。@Nuclearman生成所有子序列(非连续)的结果是O(2^d)(或OP中的O(d!),因为输出是(子序列的数量)可能有那么长。所以这是不可行的,正如OP中已经提到的。在递归树中,这个算法在哪里检查由第一个和最后一个数字组成的2位数字的平方度?实际上没有递归逻辑通常是错误的,需要调整得过于复杂。@justhalf-Fixed,不需要拆分它。只需删除索引并连接即可两个子字符串。首先对所有可能的子字符串“按原样”进行子字符串检查,如果检查通过,那么我们会更深入一层,确保也通过。从技术上来说,这个算法是深度优先搜索,这并不理想。嗯,我相信这实际上使它不再是多项式。这基本上是搜索所有可能的子序列现在XD