DEV Community

loading...
Cover image for Natural Search Algorithm

Natural Search Algorithm

gkucmierz profile image Grzegorz Kućmierz ・2 min read

This post is about function I wrote while solving LeetCode task.

Complexity of naive solution for this task is O(w²) where w is weights size.
But it can be done better with little improvement.
Instead checking every possible day from 1 to weights.length we can implement natural search algorithm and finish this task with O(w * log(w)) complexity.

Here is code I wrote:
https://github.com/gkucmierz/algorithms/blob/master/js/natural_search.js

Using this function is very simple.
Whenever we have Signum function with unknown bias.

Alt Text

Like this:

const fn = n => Math.sign(n - 345) >= 0;

345 here is random unknown number.
We can easily find it using simple code:

const fn = n => Math.sign(n - 345) >= 0;

console.log(naturalSearch(fn));

Second parameter for naturalSearch function which is retFirstTrue indicates if function should return first natural number when condition is returning true value, or last natural number when it is still false.

Lets check if algorithm really is calling function optimal number of times:

const fn = n => {
  const res = n >= 345;
  console.log('checking number:', n, 'result:', res);
  return res;
};

console.log(naturalSearch(fn));

Than we have this result:

'checking number:', 1, 'result:', false
'checking number:', 2, 'result:', false
'checking number:', 4, 'result:', false
'checking number:', 8, 'result:', false
'checking number:', 16, 'result:', false
'checking number:', 32, 'result:', false
'checking number:', 64, 'result:', false
'checking number:', 128, 'result:', false
'checking number:', 256, 'result:', false
'checking number:', 512, 'result:', true
'checking number:', 384, 'result:', true
'checking number:', 320, 'result:', false
'checking number:', 352, 'result:', true
'checking number:', 336, 'result:', false
'checking number:', 344, 'result:', false
'checking number:', 348, 'result:', true
'checking number:', 346, 'result:', true
'checking number:', 345, 'result:', true
345

As we can see in first phase algorithm is trying to find true value by multiplying number by 2, then when it find, it can find exact point using bisection technique.

Discussion (0)

pic
Editor guide