2012-03-02 42 views
0

我想基於幾個重疊事件的組合值來創建圖。我想爲在合成值的每個變化的一個數據點,所以對於一組這樣的事件:加法疊加事件的算法

 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

22222是否意味着連續五次事件二,或者事件二持續了五次? – Eduardo 2012-03-02 14:15:17

+0

這意味着5個時間單位的持續時間,抱歉的混淆 – user1245172 2012-03-02 14:27:19

回答

0

我會保持您存儲的事件是活動的關聯數組(對象)。每當一個事件被觸發或完成(這是產生你想跟蹤變化的只有兩種情況)添加/刪除元素的對象,並打印其內容與下面這樣的循環:

logMsg = "" 
for(eventName in activeEvents) logMsg += " timestamp"+timestamp+": "+eventName; 
+0

我接受這個答案,因爲這是我正在做的,甚至認爲我的問題確實是如果有一個更明智的做法,謝謝你的反饋。 – user1245172 2012-03-06 20:08:14

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'] 
+0

我目前的實施是這樣的,我的問題是,如果有更好的方法,需要少添加新事件時添加,並具有更高的性能。 – user1245172 2012-03-02 14:32:26

+0

你*簡介*,這一步是性能瓶頸嗎? – jammon 2012-03-02 14:41:19