经典算法剖析

2018-11-15  本文已影响31人  Bobby0322

二分查找

二分法查找,也称折半查找,是一种在有序数组中查找特定元素的搜索算法。查找过程可以分为以下步骤:
(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]
上一篇 下一篇

猜你喜欢

热点阅读