我正在实施我设计的算法,并正在探索不同的方法
这不是一个家庭作业问题,但我会解释一下:假设一个商人在不同的日子购买了苹果库存,并且在不同的日子也卖了一些。我想要他们当前购买的加权平均时间戳。
我将此数据对象存储为纪元时间中的时间戳字符串和苹果数量。我的数据集实际上是在单独的数据集中进行购买和销售,如下所示:
//buys
var incomingArray = {
"1518744389": 10,
"1318744389": 30
};
//sells
var outgoingArray = {
"1518744480": 3,
"1418744389": 5,
"1408744389": 8
};
我希望结果只显示剩余的incomingArray时间戳购买对。
var incomingArrayRemaining = {
"1518744389": 7,
"1318744389": 17
};
如果您看到在后来的时间戳中有3个苹果的外向交易,因此从10减去。在购买10之前有13个外发交易,但在购买30之后,所以他们只减去30个
注意,如果在10之后转移10个以上,它将从10和30中减去。苹果的数量永远不会少于0。
首先,为了实现我的目标,似乎我需要知道他们购买的地段实际上还有多少人拥有。
而不是在LIFO方法中进行堆栈减法,似乎这更像是税收会计。批次本身必须独立处理。
因此,我必须在传出数组中获取销售的第一个索引的时间戳,并在传入的数组中找到最接近的买入时间戳
以下是我的尝试:
for (var ink in incomingArray) {
var inInt = parseInt(ink);
for (var outk in outgoingArray) {
if (inInt >= 0) {
var outInt = parseInt(outk);
if (outInt >= inInt) {
inInt = inInt - outInt;
if (intInt < 0) {
outInt = inInt * -1; //remainder
inInt = 0;
} //end if
} //end if
} //end if
} //end innter for
} //end outer for
它是不完整的,并且嵌套for循环解决方案已经具有较差的计算时间。
该功能仅尝试对交易进行分类,以便仅剩余余额,通过从最近的进货余额中减去货币,并将该余额转入下一个进货余额
我觉得递归解决方案会更好,或者可能是我没有想过的更优雅的东西(嵌套的Object for each accessor in javascript)
在我对它们进行排序后,我需要实际采用加权平均法,我已经有了一些想法。
首先排序,然后是剩余数量的加权平均值。
无论如何,我知道StackOverflow上的javascript社区对于寻求帮助特别苛刻,但我陷入了僵局,因为我不仅需要一个解决方案,而且是一个计算上有效的解决方案,所以我可能会抛出一笔赏金在它上面。
答案 0 :(得分:1)
您可以将对象转换为时间戳值对的数组。传出的可能是消极的。然后,您可以在时间戳之后轻松对它们进行排序,并累积您喜欢的方式:
const purchases = Object.entries(incomingArray).concat(Object.entries(outgoingArray).map(([ts, val]) => ([ts, -val])));
purchases.sort(([ts1, ts2]) => ts1 - ts2);
现在,您可以迭代时间跨度并在值增加时将增量存储在新数组中(新的进入):
const result = [];
let delta = 0, lastIngoing = purchases[0][0];
for(const [time, value] of purchases){
if(value > 0){
// Store the old
result.push([lastIngoing, delta]);
// Set up new
delta = 0;
lastIngoing = time;
} else {
delta += value;
}
}