-
Notifications
You must be signed in to change notification settings - Fork 119
/
Copy pathTweet Counts Per Frequency.js
59 lines (44 loc) · 1.58 KB
/
Tweet Counts Per Frequency.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
// Runtime: 342 ms (Top 68.75%) | Memory: 56.4 MB (Top 87.50%)
var TweetCounts = function() {
this.map = new Map();
};
TweetCounts.prototype.recordTweet = function(tweetName, time) {
if (!this.map.has(tweetName)) this.map.set(tweetName, []);
this.map.get(tweetName).push(time);
};
TweetCounts.prototype.getTweetCountsPerFrequency = function(freq, tweetName, startTime, endTime) {
if (!this.map.has(tweetName)) return [];
const tweets = this.map.get(tweetName);
const buckets = createBuckets(freq, startTime, endTime);
for (let i = 0; i < tweets.length; i++) {
const tweetTime = tweets[i];
let left = 0;
let right = buckets.length - 1;
while (left <= right) {
const mid = (left + right) >> 1;
const [startTime, endTime, count] = buckets[mid];
if (startTime <= tweetTime && tweetTime <= endTime) {
buckets[mid][2] = count + 1;
break;
}
if (endTime < tweetTime) left = mid + 1;
else right = mid - 1;
}
}
const res = [];
for (let i = 0; i < buckets.length; i++) {
res.push(buckets[i][2]);
}
return res;
function createBuckets(freq, startTime, endTime) {
const chunks = { "minute": 60, "hour": 3600, "day": 86400 };
const buckets = [];
let start = startTime;
while (start <= endTime) {
const end = Math.min(start + chunks[freq] - 1, endTime);
buckets.push([start, end, 0])
start = end + 1;
}
return buckets;
}
};