zoukankan      html  css  js  c++  java
  • 算法图解

    例子:猜一个1到100之间的数,最多猜几次?

    # 最糟糕的猜法:一个一个的猜 

      - 最多查找次数: n 
      - 运行时间: O(n)

    # 二分查找:在有序的一组数中猜一个数,对半猜。找到返回其位置(索引),否则返回null

      - 最多查找次数: log₂n 
      - 运行时间:O(logn)

      eg:从1到100找一个数,最多查找 log₂100次。 2的7次方大于等于128,所以最多查找7次

    # 理解:每次从中间找

    代码:

     /**
         * @method: test
         * @des: 二分查找 - 在有序的一组数中猜一个数,对半猜
         * @param {list} -  一组数
         * @param {item} -  要猜的数
         * @return: 
         */
        function test(list, item) {
            var low = 0;
            var high = '';
            var mid = '';//中间数  ---找到后的索引
            var guess = '';
            if (Object.prototype.toString.call(list) == "[object Array]") {
                high = list.length - 1;
            }
            while (low <= high) {
                mid = Math.floor((low + high)/2);
                guess = list[mid];
                if (guess == item) {//找到了数
                    console.log('找到',mid);
                }
                if (guess > item) {//猜的数大了
                    high = mid - 1;
                    console.log('大了',high);
                } else {
                    low = mid + 1;
                    console.log('小了',low);//猜的数小了
                }
                console.log('none');
            }
        }
    
        var o_list = [1,3,5,7,9,11];
        test(o_list,7);

    # 大O运行时间
    - O(n) 线性时间
    - O(logn) 对数时间 - 二分查找
    - O(n*logn) 速度较快 - 快速排序
    - O(n²) 速度较慢 -选择排序
    - O(n!) 非常慢 - 旅行商问题

  • 相关阅读:
    UVA 120 Stacks of Flapjacks
    HDU 4869 Turn the pokers
    HDU 4882 ZCC Loves Codefires
    HDU 4864 Task
    HDU 4861 Couple doubi
    UVA 1600 Patrol Robot
    UVA 712 S-Trees
    2014/4/6长沙多校第六次(浙大校赛)
    UVA10905 思维考察
    HDU1498 枚举+二分图类棋盘问题(最大匹配)
  • 原文地址:https://www.cnblogs.com/lingXie/p/13039410.html
Copyright © 2011-2022 走看看