我想根据几个重叠事件的组合值创建一个图表。我想为组合值中的每个更改提供一个数据点,因此对于一组这样的事件:
11111111111
22222
55555555555555
3333333
^ ^ ^ ^ ^ ^ ^ ^ ^
(数字表示值为3333333,值为3,x轴表示时间,^标记表示要为其生成的更改时间戳结果)
我想要这样的输出:
timestamp0: 0,timestamp1: 2,timestamp2: (2+1),timestamp3:1,
timestamp4:(5+1),timestamp5:5,timestamp6:0,timestamp7:3,timestamp8:0
这是通常的方法,还是通常用于解决这些类型问题的数据结构或算法?
我可以设法做到这一点,但我想知道是否已经存在更好的方法。将动态添加新事件,并且结果生成的性能非常重要。
在第一个答案到达后添加:
我当前的实现是遍历事件列表并将当前事件添加到一组活动事件中,并检查自上次迭代后是否有任何活动事件变为无效(这些事件可以为活动列表生成时间戳并从中删除)。当前的实现有很多循环和一些特殊的案例处理(比如两个事件同时停止),所以我想知道你是否知道更聪明的方法?
答案 0 :(得分:0)
据我所知,这里的事件是一个有开始时间和持续时间的事情。当事件开始或结束时,您想要绘制剩余事件的列表。
要使用的数据结构可以是一组(无序列表)。无论何时事件开始或结束,您都可以在集合中添加或删除事件,并将剩余集合的列表作为结果。
这是你的意思吗?
更新
我刚才看到了javascript标签。
var events = {
getEvents: function() {
var result = [];
for (key in this) {
if (typeof this[key] !== 'function') {
result.push(key); }
}
return result;
}
};
// add events
var event_A = 'A', event_B = 'B';
events[event_A] = true; // or whatever
console.log(events.getEvents()); // ['A']
events[event_B] = true;
console.log(events.getEvents()); // ['A', 'B']
// stop events
delete events[event_A]
console.log(events.getEvents()); // ['B']
答案 1 :(得分:0)
我会保留一个关联数组(Object),用于存储哪些事件处于活动状态。无论何时触发或最终确定事件(这是产生您想要跟踪的更改的唯一两种情况),您都可以向对象添加/删除元素,并使用如下所示的循环打印其内容:
logMsg = ""
for(eventName in activeEvents) logMsg += " timestamp"+timestamp+": "+eventName;