Skip to content

Commit

Permalink
Complete characterFrequency.js in O(n*log(n)) time complexity
Browse files Browse the repository at this point in the history
  • Loading branch information
fay-jai committed Dec 29, 2014
1 parent 46fb517 commit 0f2dc08
Showing 1 changed file with 94 additions and 1 deletion.
95 changes: 94 additions & 1 deletion characterFrequency/characterFrequency.js
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,100 @@
*
*/

// O(n*log(n)) + O(n) + O(n) => O(n*log(n))
var characterFrequency = function (string) {
var freq = {};
var result = [];
var length = string.length;
var i, prop, temp;

// O(n)
for (i = 0; i < length; i += 1) {
if (freq[string[i]] === void 0) {
freq[string[i]] = 1;
} else {
freq[string[i]] += 1;
}
}

// freq is an object with all the frequencies for each character
// O(n)
for (prop in freq) {
result.push( [prop, freq[prop]] );
}

// result is an array of [character, frequency]'s
// O(n*log(n))
mergeSort(result);

var characterFrequency = function(string) {
return result;
};

// O(n*log(n))
var mergeSort = function (array) {
var length = array.length;

if (length < 2) { return array; }

var mid = Math.floor( length / 2 );
var left = array.slice(0, mid);
var right = array.slice(mid);

left = mergeSort(left);
right = mergeSort(right);
merge(array, left, right);

return array;
};

var merge = function (array, left, right) {
// each element in any of the arrays is an array of [character, frequency]
var a = 0;
var l = 0;
var r = 0;
var aLen = array.length;
var lLen = left.length;
var rLen = right.length;

while (l < lLen && r < rLen) {
if (left[l][1] < right[r][1]) {
// descending order
array[a] = right[r];
a += 1;
r += 1;
} else if (left[l][1] > right[r][1]) {
array[a] = left[l];
a += 1;
l += 1;
} else {
// when the frequencies are equal
if ( getCharCode(left[l][0]) < getCharCode(right[r][0]) ) {
array[a] = left[l];
a += 1;
l += 1;
} else {
array[a] = right[r];
a += 1;
r += 1;
}
}
}

// by the time the above while loop terminates, either left or right arrays
// is still not exhausted
while (l < lLen) {
array[a] = left[l];
a += 1;
l += 1;
}

while (r < rLen) {
array[a] = right[r];
a += 1;
r += 1;
}
};

var getCharCode = function (character) {
return String.prototype.charCodeAt.call(character);
};

0 comments on commit 0f2dc08

Please sign in to comment.