我如何可以实施这一方程式中Java?
-
22-08-2019 - |
题
好的,这是更多的后续行动的问题: 如何计算的最佳途径推销员bitonic的旅游吗?
首先,为bitonic旅游的旅行推销员问题,我有以下的再次发生关系:
(a) When i = 1 and j = 2, l(i; j) = dist(pi; pj )
(b) When i < j - 1; l(i; j) = l(i; j - 1) + dist(pj-1; pj)
(c) When i = j - 1 and j > 2, min 1<=k<i (l(k; i) + dist(pk; pj ))
l
是表的以前的结果。我的问题是与C部分:假设 l(k,i)
和 dist(pk,pj)
定义,我将如何执行部分C在Java?我的初步想法是,我迭代 k
从 1
要 i
和储存的最低结果 (l(k,i) + dist(pk,pj))
, 但我不认为那是正确的。
例如:
for (int k = 1; k < i; ++k) {
tmp = l(k,i) + dist(pk,pj);
if (tmp < min) {
min = tmp;
}
}
// min is the result
这可能看起来像一个愚蠢的问题(而且很可能是,我严重缺乏睡眠的),但是我希望有人可以帮忙。
解决方案
一个明显的优化是预先在循环之前计算你dist(pk,pj)
值
例如
dist_pk_pj = dist(pk,pj);
/* then do as you did before */
for (int k = 1; k < i; ++k) {
tmp = l(k,i) + dist_pk_pj;
if (tmp < min) {
min = tmp;
}
}
请注意我没做●一个类似的优化(如升预先计算表),因为你说,它已经是一个预计算表。如果不是,那么我会执行相同的优化:)
但是,随着以前的评论指出,Java编译器可以很好地做到这一点优化你。我在什么优化的Java编译器执行,但这样采取与一粒盐是最后的评论没有专家:)
最后在那里该l(k,i)
表具有任何特殊的性质?例如一些对称l(i,k) = l(k,i)
(我只是猜测这里是因为我不很了解,如果听起来很古怪的问题,所以忽略此评论)。如果有任何特殊的性质张贴他们,我们可以拿出进一步的优化。
其他提示
我认为Java编译器将优化你的循环中它的方式。并且它是确定
(a) When i = 1 and j = 2, l(i; j) = dist(pi; pj ) (b) When i < j - 1; l(i; j) = l(i; j - 1) + dist(pj-1; pj) (c) When i = j - 1 and j > 2, min 1<=k<i (l(k; i) + dist(pk; pj ))
import system.math
unsigned long i;
unsigned long j;
if ((i==j-1)&& (j>2))
{
unsigned long k=1;
unsigned long result;
while (k<i)
{
result = l(k; i) + dist(pk; pj )
min = minus(min, result);
k++;
}
return min;
}
不隶属于 StackOverflow