Unique Elements with Occurrences

Using Binary Search

JavaScript

var arrT = [1, 2, 2, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 8, 8, 8, 8, 8, 8, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 11, 12, 3, 13, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 19, 19, 19, 19, 19, 19, 20];

	function uniqueIndex(start, end, arr, map) {
	  if (start === end) {
	    return;
	  }

	  var startValue = arr[start],
	    endValue = arr[end];

	  initUniqueStartObj(startValue, map, start, arr[start - 1]);
	  initUniqueEndObj(endValue, map, end, arr[end - 1], arr.length);

	  if (endValue === startValue) {
	    if (end === arr.length - 1 || arr[end + 1] !== startValue) {
	      setMapObj(startValue, map, end, 'to');

	      if (end + 1 < arr.length) {
	        setMapObj(arr[end + 1], map, end + 1, 'from');
	      }

	      return;
	    }
	  } else {
	    if ((start === end - 1) && arr[start - 1] === startValue) {
	      setMapObj(startValue, map, start, 'to');
	    }
	  }

	  var middle = Math.floor((start + end) / 2);

	  var middleValue = arr[middle],
	    nextValue = arr[middle + 1];

	  if (middleValue !== nextValue) {
	    setMapObj(middleValue, map, middle, 'to');
	  }

	  uniqueIndex(start, middle, arr, map);
	  uniqueIndex(middle + 1, end, arr, map);

	}

	function initUniqueStartObj(key, obj, value, toComparekey) {
	  if ((value > 0 && toComparekey !== key) || value === 0) {
	    setMapObj(key, obj, value, 'from');
	  }
	}

	function initUniqueEndObj(key, obj, end, toCompareKey, arrLength) {
	  if (end > 0 && toCompareKey !== key) {
	    setMapObj(key, obj, end, 'from');

	    if (end === arrLength - 1) {
	      setMapObj(key, obj, end, 'to');
	    }
	  }
	}


	function setMapObj(key, obj, value, prop) {
	  if (!obj[key]) {
	    obj[key] = {};
	  }

	  obj[key][prop] = value;
	}

	function loopThrough(arr, map) {
	  for (var i = 0; i < arr.length; i++) {
	    var item = arr[i];

	    if (!map[item]) {
	      map[item] = {
	        from: i
	      };
	    }
	    if ((i + 1 < arr.length &&...