think of a set as an unordered list of unique items.

if you don’t sort the set, operations take linear time ⇒ o(n).

however, if you sort the set, finding an object can take log^n time.

if every step is divided by a constant factor, that's log(n).


tried implementing a merge-sort algorithm. failed in the first attempt, even though i understood it; but failed to translate it into code.


watched a video to understand how this worked, and stumbled upon the call stack: https://www.youtube.com/watch?v=aCPkszeKRa4&t=131s

so, essentially, in a factorial algorithm:

//a factorial function.
 
function factorial(n){
    if (n<=1) return n;
    
    return (n*(factorial(n-1))); 
}
 
console.log(factorial(4)); 

the first call is dependent on the outcome of the second call … nth call where n=1, then n is returned as itself (1*1 = 1), but then when we go up the stack, it keeps computing (because it was put on hold till the thing it was dependent on returned a value).

this is what it means when the computer says ‘maximum call stack exceeded’. i ran a simple script to figure out the max call stack for my environment (node.js):

// Source - https://stackoverflow.com/a/7828803
// Posted by josh3736, modified by community. See post 'Timeline' for change history
// Retrieved 2026-06-25, License - CC BY-SA 4.0
 
var i = 0;
function inc() {
  i++;
  inc();
}
 
try {
  inc();
} catch (e) {
  // The StackOverflow sandbox adds one frame that is not being counted by this code
  // Incrementing once manually
  i++;
  console.log("Maximum stack size is", i, "in your current browser");
}
 
a@as 260625_merge-sort % node call-stack-test.js
Maximum stack size is 10408 in your current browser

here’s my merge sort:

code:
//merge sort function.
 
/*
given an array where length % 2 == 0:
- recursively divide array into smallest parts.
- sort between pairs. 
- return new sorted array.
 
we assume that this implementation of merge-sorting only does things in ascending order.
 
*/
 
function merge_sort(arr) {
  if (arr.length <= 1) return arr;
 
  let half = Math.floor(arr.length / 2);
 
  let left = merge_sort(arr.slice(0, half));
  let right = merge_sort(arr.slice(half));
 
  return merge(left, right);
}
 
//helper:
function merge(l, r) {
  let result = [];
 
  let i = 0;
  let j = 0;
 
  while (i < l.length && j < r.length) {
    if (l[i] <= r[j]) {
      result.push(l[i]);
      i++;
    } else {
      result.push(r[j]);
      j++;
    }
    while (i < l.length) {
      result.push(l[i]);
      i++;
    }
 
    while (j < r.length) {
      result.push(r[j]);
      j++;
    }
  }
  return result;
}
 
//we want to return a sorted list.
let org_arr = [6, 4, 7, 8, 2, 9];
let sorted_arr = merge_sort(org_arr);
console.log(
  "original array was: " + org_arr + "\n" + "new array is: " + sorted_arr,
);
 

also found the ‘try, catch, finally’ statements of javascript: https://www.youtube.com/watch?v=cFTFtuEQ-10