我正在实现我设计的算法,并且正在探索不同的方法
这不是家庭作业问题,但我要像一个人一样解释:假设商人在不同的日子购买了苹果库存,并且在不同的日子也出售了一些苹果。我想要他们当前购买的加权平均时间戳。
我将此数据对象作为时间戳字符串存储在时期的时间和苹果数量中。我的数据集实际上具有购买和销售的单独数据集,例如:
//buys
var incomingArray = {
"1518744389": 10,
"1318744389": 30
};
//sells
var outgoingArray = {
"1518744480": 3,
"1418744389": 5,
"1408744389": 8
};
我希望结果仅显示剩余的进来时间戳购买对。
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
它不完整,嵌套循环解决方案的计算时间已经很差。
该功能仅尝试对交易进行分类,以便仅通过从最近的传入余额中减去剩余的余额,然后将其剩余到下一个传入的余额
我觉得递归解决方案会更好,或者也许是我从未想过的更优雅的东西(JavaScript中的嵌套对象访问访问者(
我对它们进行排序后,然后我需要实际执行加权平均方法,我已经有一些想法。
首先分类,然后剩余数量的加权平均值。
无论如何,我知道Stackoverflow上的JavaScript社区对寻求帮助特别苛刻,但我正在陷入僵局,因为我不仅需要解决方案,而且需要一个计算上有效的解决方案,因此我可能会在上面投入赏金。
您可以将对象转换为时间戳 - 值对的数组。外向的可能是负面的。然后,您可以在时间戳后轻松地对它们进行分类并积累自己喜欢的方式:
const purchases = Object.entries(incomingArray).concat(Object.entries(outgoingArray).map(([ts, val]) => ([ts, -val])));
purchases.sort(([ts1, ts2]) => ts1 - ts2);
现在,您可以迭代时台上的时间板,并在值增加时将三角洲存储在新数组中(新的ingoing(:
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;
}
}