zoukankan      html  css  js  c++  java
  • 算法笔记(九):二分查找

    (一)二分查找

    1、例如:抱着一堆书走出图书馆的时候,检测器突然响了(其中一本书没有消磁),现在要检查哪一本书没有消磁。

    (1)比较耗时的方式就是,一本一本书用检测器都检查下。

    (2)比较快的方式是:分成相等的2份,分别给检测器检测。引起报警的那一份,再分成2份,分别给检测器检测,重复这个过程,直到找到引起报警的那本书。

        第二种方式就体现了二分查找思想。

    2、二分查找依赖的是顺序表结构,简单的说就是数组。(二分查找需要按照下标随机访问元素,用其他数据结构,例如链表的话,时间复杂度会变高)

    3、二分查找针对的是有序数据。

    4、数据量太小不适合二分查找(因为此时遍历、二分查找花的时间差不多)

    5、数据量太大也不适合二分查找。(二分查找底层依赖数组这种数据结构,而数组需要连续的内存空间,如果数据量太大,太耗内存。)

    6、二分查找的时间复杂度为Ologn

    (二)练习题

    1、实现“求一个数的平方根”,精确到小数点后 6 位。

     1 def mySqrt(n):
     2     l = 0
     3     r = n + 1
     4     while l < r:
     5         mid = l + (r - l) // 2
     6         if mid ** 2 == n:
     7             return "{}.000000".format(mid)
     8         elif mid ** 2 < n:
     9             l = mid + 1
    10         elif mid ** 2 > n:
    11             r = mid
    12     inte = l -1   # 开方整数部分
    13     result = inte + 0.5  # 该行及下面的for循环根据开方公式计算小数部分
    14     for i in range(1,7):
    15         result = result + (n/result - result)*0.5
    16         result = str(result).split(".")
    17         result = float("{}.{}".format(result[0],result[1][:i]))  # 保留小数位,根据开方计算公式,依次保留1、2、3...位小数
    18     return result
    19 
    20 print(mySqrt(5))

  • 相关阅读:
    Palindrome Partitioning
    triangle
    Populating Next Right Pointers in Each Node(I and II)
    分苹果(网易)
    Flatten Binary Tree to Linked List
    Construct Binary Tree from Inorder and Postorder Traversal(根据中序遍历和后序遍历构建二叉树)
    iOS系统navigationBar背景色,文字颜色处理
    登录,注销
    ios 文字上下滚动效果Demo
    经常崩溃就是数组字典引起的
  • 原文地址:https://www.cnblogs.com/simple-free/p/12913605.html
Copyright © 2011-2022 走看看