Argmax语句评估Java

时间:2013-10-11 02:02:01

标签: java algorithm

我有以下伪代码:

for j = 0 to argmax {l where t mod 2^l = 0} do

t是一个在此for循环之外递增的计数器。我的问题是如何评估argmax声明?

enter image description here

我相信'我'在代码中是一个错字。 '吨'可能是对的。

3 个答案:

答案 0 :(得分:3)

没有封闭式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.")

如果你有两个整数,你可以使用嵌套循环;如果你的参数是双倍的并且你有一个平滑的凸函数,你可以使用梯度下降方法。

在这种特殊情况下,最大l应该是i的尾随零的数量。有更高效的方法(可能还有一个库函数,例如Java中的Long.numberOfLeadingZeros)。

在这种特殊情况下,您可能希望将循环实现为:

for (int j=0, i=t; (i&1)==0; j++, i>>>=1) {
  ...
}

答案 1 :(得分:1)

我不确定我是否得到了你的问题的要点?

for (int j = 0; j < argmax; j++) {...}

因为argmax是一个函数,所以

for (int j = 0; j < argmax(); j++) {...}

private int argmax () {return some int}

答案 2 :(得分:1)

不是将argmax作为一个函数实现,甚至不直接计算argmax,我认为这样做会更简单:

int j=0;
for(int s=t*2; s%2==0; s/=2){
  // loop code goes here
  j++;
}