我有一个链接列表。我想为这个列表的每个位置 i 设置一个权重因子 p^i。然后我想获得列表元素的加权值作为这些因素的总和。
让我举个例子让事情变得具体。假设我的列表大小为 5,即它包含从索引 0 到索引 4 的元素。假设 p = 0.5(即 p = 1/2)。因此,位置 0 的权重因子是 p^0 = 1,位置 1 的权重因子是 p^1 = 0.5,位置 2 的权重因子是 p^2 = 0.25,位置 3 的权重因子是 p^3 = 0.125,最后是位置 4是 p^4 = 0.0625。
现在让我们假设我在列表中有以下项目,从位置 0 到位置 4(我给出了这些项目的 ID): 4 | 4 | 5 | 4 | 5.因此,由于ID=4的item在0、1、3的位置,它的值应该是这些权重因子之和,即p^0 + p^1 + p^3 = 1 + 0.5 + 0.125 = 1.625。同样,对于 ID = 5 的项目,我们有 p^2 + p^4 = 0.25 + 0.0625 = 0.3125。
我的问题是:如何获取这些元素(ID 4 和 ID 5)在列表中的所有索引,以便将这些元素的值计算为与这些索引权重因子相关联的总和?indexOf(Object o) 返回列表中指定元素第一次出现的索引,我需要所有出现的索引。有什么建议吗?
编辑:更新为几何递减的总和而不是增加
我对我的代码进行了修改,而不是在我的列表(我称之为 window 并采用 Request 类型的对象)中有一个几何递增的总和以得到一个几何递减的总和。如果我有少量请求(例如 100 - 我在 Main 类的 main 方法中设置请求数 -编码)。但是,如果我使用例如 1000 个请求,则会收到错误消息:
java.lang.IllegalArgumentException: n must be positive
这指的是我的代码中的另一点:
if(reqToBeRemoved == null) {
reqToBeRemoved =
minKeyList.get((new Random(System.currentTimeMillis()).nextInt(minKeyList.size())));
}
这是我的代码,我希望我在这里发布的内容有用(显然我不能在这里发布整个代码,我猜也不需要):
public void doWindowLookup(Request request) {
int index = 0;
double sum = 0;
double initVal = 0;
for(Request r : window) {
if(r.equals(request)) {
if(index == 0) {
initVal = 1;
}
else {
request.weight = Math.pow(p, index);
sum += request.weight;
}
request.weightedWinFreq = initVal - sum;
}
index++;
}
logger.info("TEST: Item: " + request.reqID + " has weightedWinFreq: " +
request.getWeightedWinFreq());
}
这个错误信息是什么意思?哪个一般项目n应该是正数???我假设当我调用 random.nextInt() 时,我传递了一个零参数(如线程“main”中的前一个线程异常所示 java.lang.IllegalArgumentException: n must be positive),但这怎么可能,因为我的论点是minKeyList.size()?
(如果我的问题需要进一步澄清,请让我提供所需的信息。)
编辑:关于我的问题的先前更新:这是我在程序的另一部分的错。考虑回答的问题。