Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm O(N*log(log(N))编码算法&x27;什么是山峰?_Algorithm_Prime Factoring - Fatal编程技术网

Algorithm O(N*log(log(N))编码算法&x27;什么是山峰?

Algorithm O(N*log(log(N))编码算法&x27;什么是山峰?,algorithm,prime-factoring,Algorithm,Prime Factoring,任务描述如下: 这里也有: 首先,我试图自己解决这个问题,但只能想出我认为是蛮力的解决方案。但是,它的得分为100/100: 这显然让我完全不满意对于N(或每个峰值,以较小者为准)的每个因子调用外部循环,对于每个峰值调用内部循环(仅检查每个块中是否有峰值)。也许这是O(N^2),也许更好一点(因为它在时间限制内通过了测试),但我几乎可以肯定它不是O(N*log(log(N)) 然后我尝试搜索一个O(N*log(log(N))解决方案,但其他人似乎都有一个与我类似的解决方案 那么,有没有人想到一个

任务描述如下: 这里也有:

首先,我试图自己解决这个问题,但只能想出我认为是蛮力的解决方案。但是,它的得分为100/100:

这显然让我完全不满意对于
N
(或每个峰值,以较小者为准)的每个因子调用外部循环,对于每个峰值调用内部循环(仅检查每个块中是否有峰值)。也许这是
O(N^2)
,也许更好一点(因为它在时间限制内通过了测试),但我几乎可以肯定它不是
O(N*log(log(N))

然后我尝试搜索一个
O(N*log(log(N))
解决方案,但其他人似乎都有一个与我类似的解决方案

那么,有没有人想到一个
O(N*log(log(N))
(或者更好的)解决方案

另外,如果有人能告诉我我的解决方案有多复杂,我将不胜感激。

您的代码是O(nd(n)),其中d(n)是n的除数。在[1,100000]上,d(n)最大化为83160=2^3^3^3 5 7 11,它有126个除数,d(n)是o(n^epsilon),对于每一个epsilon>0,它的增长相当缓慢


要获得O(n log n)解,请构建一个部分和数组,告诉您每个点还剩下多少个峰值。然后你可以判断在O(1)时间间隔内是否有峰值。然后检查除数d需要O(n/d)时间。在所有除数d上加n/d与在所有除数d上加d是一样的,根据相同的Wikipedia页面,结果是O(n log n)。

我以tmyklebu建议的方式实现了一个解决方案(谢谢!),应该是n.log(log(n))。Codibility不再测试这个问题的“性能”(!),但python解决方案的准确率为100%

顺便说一句,如果你一直在学习可互换性课程,你会从中记住,调和数运算的总和将给出O(log(n))的复杂性。我们有一个缩减集,因为我们只考虑因子分母。显示素数的倒数和是如何为O(log(log(n)),并声称“证明是不平凡的”。除数倒数之和与素倒数之和不同,但我认为它也属于“非平凡”证明范畴

def溶液(数据):
长度=长度(数据)
#数组结尾不能是峰值,len<3必须返回0
如果len<3:
返回0
峰值=[0]*长度
#计算O(n)时间内的“左侧峰值”列表
对于范围(2,长度)中的索引:
峰值[指数]=峰值[指数-1]
#检查左侧是否有峰值,将其添加到计数中
如果数据[index-1]>data[index-2]和数据[index-1]>data[index]:
峰值[指数]+=1
#候选块是我们要测试的块大小
对于范围(3,长度+1)内的候选人:
#如果不是一个因素,请跳过
如果长度%candidate!=0:
持续
#在每个点进行测试n/块
有效=真
索引=候选人
而索引!=长度:
#如果此块中没有峰值,则中断
如果峰值[索引]==峰值[索引-候选]:
有效=错误
打破
索引+=候选
#由于peaks[length]位于阵列之外,因此需要进行一次额外检查
如果索引==长度和峰值[索引-1]==峰值[索引-候选]:
有效=错误
如果有效:
返回长度/候选者
返回0

如果不登录,我就看不到问题。你能复制问题本身中的问题描述吗?好的,它是受版权保护的,所以不应该复制到这里?然而,一个用户已经做了,我添加了一个到他的问题的链接(带有任务描述)。除了最后一部分,我了解所有内容。你说“所有除数d上的n/d之和等于所有除数d上的d之和”是什么意思?@NPS:i(d)=n/d给出的n的除数集合上有一个对合。(对合是从一个集合到它自身的双射,当应用两次时,它什么也不做。)那么sum(d除以n)n/d=sum(d除以n)n/i(d)=sum(d除以n)d。你是如何得出这个if条件意味着没有峰值的结论的?如果peaks[index]==peaks[index-candidate]:valid=False,请您也解释一下第二个if条件好吗?如果index==length和peaks[index-1]==peaks[index-candidate]:valid=false在回答第一个问题时:看看“peaks”包含什么。这是到目前为止(在当前索引的左侧)已发现的峰值数量的累积计数。如果比较数组中的两个点,并且它们具有相同的值,则未找到新的峰值。在回答第二个问题时,数组的结尾(while循环的最后一次迭代应该是什么)是特殊的。规则规定数据数组的结尾不能被视为峰值。鉴于我们的设置方式,peaks[长度]将超出数组范围,因此我们需要查看峰值[length-1]。为了更好地了解正在发生的事情,您可以尝试使用一个小数组并在纸上完成此操作。或者查看@rafalio的示例,并选择几个关键点: