对两个关联阵列/堆栈进行排序



我正在实现我设计的算法,并且正在探索不同的方法

这不是家庭作业问题,但我要像一个人一样解释:假设商人在不同的日子购买了苹果库存,并且在不同的日子也出售了一些苹果。我想要他们当前购买的加权平均时间戳。

我将此数据对象作为时间戳字符串存储在时期的时间和苹果数量中。我的数据集实际上具有购买和销售的单独数据集,例如:

//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;
  }
}

最新更新