算法图解 - 第1章 二分查找 与大O

例子:猜一个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!) 非常慢 - 旅行商问题

 

posted @ 2020-06-04 17:16  邪儿莫  阅读(173)  评论(0编辑  收藏  举报