美文网首页
经典算法剖析

经典算法剖析

作者: Bobby0322 | 来源:发表于2018-11-15 16:15 被阅读31次

    二分查找

    二分法查找,也称折半查找,是一种在有序数组中查找特定元素的搜索算法。查找过程可以分为以下步骤:
    (1)首先,从有序数组的中间的元素开始搜索,如果该元素正好是目标元素(即要查找的元素),则搜索过程结束,否则进行下一步。
    (2)如果目标元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半区域查找,然后重复第一步的操作。
    (3)如果某一步数组为空,则表示找不到目标元素。

    参考代码:

    //递归算法
        function binary_search(arr, low, high, key) {
            if (low > high) {
                return -1;
            }
            var mid = parseInt((high + low) / 2);
            if (arr[mid] === key) {
                return mid;
            } else if (arr[mid] > key) {
                high = mid - 1;
                return binary_search(arr, low, high, key);
            } else if (arr[mid] < key) {
                low = mid + 1;
                return binary_search(arr, low, high, key);
            }
        };
        var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 23, 44, 86];
        var result = binary_search(arr, 0, 13, 10);
        console.log(result); //9返回目标元素的索引值
    
    //非递归算法
        function binary_search(arr, key) {
            var low = 0,
                high = arr.length - 1;
            var mid;
            while (low <= high) {
                mid = parseInt((high + low) / 2);
                if (key === arr[mid]) {
                    return mid;
                } else if (key > arr[mid]) {
                    low = mid + 1;
                } else if (key < arr[mid]) {
                    high = mid - 1;
                } else {
                    return -1;
                }
            }
        };
    
        var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 23, 44, 86];
        var result = binary_search(arr, 10);
        console.log(result); // 9返回目标元素的索引值
    

    贪心算法

    贪心算法是指:在每一步求解的步骤中,它要求“贪婪”的选择最佳操作,并希望通过一系列的最优选择,能够产生一个问题的(全局的)最优解。
    贪心算法每一步必须满足一下条件:
      1、可行的:即它必须满足问题的约束。
      2、局部最优:他是当前步骤中所有可行选择中最佳的局部选择。
      3、不可取消:即选择一旦做出,在算法的后面步骤就不可改变了。

    参考代码:

    //贪心算法 钱币找零问题
        //每一步尽可能用面值大的纸币即可。
        //在日常生活中我们自然而然也是这么做的。在程序中已经事先将Value按照从小到大的顺序排好。
        function MinCoinChange(coins) {
            coins = coins.sort(function (a, b) {
                return b - a;
            });
    
            this.makeChange = function (amount) {
                var change = [],
                total = 0;
                for (var i = 0; i < coins.length; i++) {
                    var coin = coins[i];
                    while (total + coin <= amount) {
                        change.push(coin);
                        total += coin;
                    }
                }
                return change;
            }
        }
    
        var coin = new MinCoinChange([1, 5, 10, 20, 50, 100]);  //人民币仅由10元、5元、1元
        console.log(coin.makeChange(101)); //(2) [100, 1]
    

    相关文章

      网友评论

          本文标题:经典算法剖析

          本文链接:https://www.haomeiwen.com/subject/jdiyfqtx.html