我有以下伪代码:
for j = 0 to argmax {l where t mod 2^l = 0} do
t 是一个在此 for 循环之外递增的计数器。我的问题是如何评估 argmax 语句?
我认为代码中的“i”是一个拼写错误。 “t”可能是正确的。
最佳答案
没有封闭形式的 argmax
函数。
Argmax 表示找到最大化函数的参数(参数)。
它可以是任意复杂的,如果你在语句中有一个复杂的表达式。
在这里,它或许可以作为一行数学表达式来实现,作者只是因为行长而懒得拼写。否则,如果你有一个有限的整数域,你可以使用循环来实现它:
def argmaximod2l(maxl, i):
for l in range(maxl, 0, -1):
if i % (2**l) == 0: return l
raise Exception("No l was divisible by i.")
如果你有两个整数,你可以使用嵌套循环;如果你的参数是 double 的并且你有一个光滑的凸函数,你可以使用梯度下降法。
在这种特殊情况下,最大 l
应该是 i
的尾随零的数量。有更有效的方法(可能还有一个库函数,例如 Java 中的 Long.numberOfLeadingZeros
)可用。
在这种特殊情况下,您可能希望将循环实现为:
for (int j=0, i=t; (i&1)==0; j++, i>>>=1) {
...
}
关于java - Argmax 语句评估 Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19309083/