用于累加重叠事件的算法

时间:2012-03-02 14:02:32

标签: javascript algorithm

我想根据几个重叠事件的组合值创建一个图表。我想为组合值中的每个更改提供一个数据点,因此对于一组这样的事件:

      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

这是通常的方法,还是通常用于解决这些类型问题的数据结构或算法?

我可以设法做到这一点,但我想知道是否已经存在更好的方法。将动态添加新事件,并且结果生成的性能非常重要。

在第一个答案到达后添加:

我当前的实现是遍历事件列表并将当前事件添加到一组活动事件中,并检查自上次迭代后是否有任何活动事件变为无效(这些事件可以为活动列表生成时间戳并从中删除)。当前的实现有很多循环和一些特殊的案例处理(比如两个事件同时停止),所以我想知道你是否知道更聪明的方法?

2 个答案:

答案 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;