Intro to Linear Search
-> Checking every single thing at a set interval on item at a time
-> many different search methods on arrays in JavaScript
- indexOf, includes, find, findIndex
Linear Search Pseudocode
- Loop through the array and check if the current array element is equal to the value
 - If it is, return the index at which the element is found
 - If the value is never found, return -1
 
Linear Search Big O
as far as time complexity is concerned,
O(1) best - find thing right away
O(n) average - as the length grows so does the average amount of time it takes.
O(n) worst - very last element
Intro to Binary Search
- much faster form of search
 - you can eliminate half of the remaining elements at a time
 - only works on sorted arrays. there has to be an order to it.
 
Binary Search on sorted arrays
- create a left pointer at the start of the array,
and a rignt pointer at the end of the array
- while the left pointer comes before the right pointer
- create a pointer in the middle
- if you find the value you want, return the index
- if the value is too small, move the left pointer up
- if the value is too large, move the right pointer down
- if you never find the value, return -1
function binarySearch(arr, searchVal){
    let temp=0;
    let end= arr.length-1;
    
    while(temp !== (end+temp)/2) {
        if(arr[temp] < searchVal){
            temp = Math.floor((end+temp)/2);
        } else if(arr[temp] > searchVal) {
            end = temp;
            temp = Math.floor(temp/2);
        }
        
        if(arr[temp] === searchVal) return temp;
    }
    return -1;
    
}
binarySearch([1,2,3,4,5],5);
// Original Solution
function binarySearch(arr, elem) {
    var start = 0;
    var end = arr.length - 1;
    var middle = Math.floor((start + end) / 2);
    while(arr[middle] !== elem && start <= end) {
        if(elem < arr[middle]){
            end = middle - 1;
        } else {
            start = middle + 1;
        }
        middle = Math.floor((start + end) / 2);
    }
    if(arr[middle] === elem){
        return middle;
    }
    return -1;
}
// Refactored Version
function binarySearch(arr, elem) {
    var start = 0;
    var end = arr.length - 1;
    var middle = Math.floor((start + end) / 2);
    while(arr[middle] !== elem && start <= end) {
        if(elem < arr[middle]) end = middle - 1;
        else start = middle + 1;
        middle = Math.floor((start + end) / 2);
    }
    return arr[middle] === elem ? middle : -1;
}
binarySearch([2,5,6,9,13,15,28,30], 103)
Binary Search Big O
O(log n) - worst and average case
every tiem double it ,simply adding one extra step
O(1) - best case
Naive String Searching Algorithm
- searching for substrings in a larger string
function naiveSearch(long, short){
    var count = 0;
    for(var i = 0; i < long.length; i++){
        for(var j = 0; j < short.length; j++){
           if(short[j] !== long[i+j]) break;
           if(j === short.length - 1) count++;
        }
    }
    return count;
}
naiveSearch("lorie loled", "lol")
'Javascript > Algorithms' 카테고리의 다른 글
| Selection Sort (0) | 2021.01.03 | 
|---|---|
| Bubble Sort (0) | 2020.12.27 | 
| Recursion (0) | 2020.12.20 | 
| Problem Solving Patterns (0) | 2020.12.09 | 
| Problem Solving Approach (0) | 2020.12.08 |