搜索算法

二分法

Posted by 新宇 on January 16, 2020

一、二分法

1. 定义

2. 过程

3. 要求

  1. 必须是顺序存储结构
  2. 必须按照关键字大小有序排列
  3. 适合一次排序,多次查找,不适合多次插入删除

4. 代码实现

# 递归版本

def binary_search(l, item):
    length = len(l)
    if length == 0:
        return False
    mid = length//2
    if item == l[mid]:
        return True
    elif item < l[mid]:
        return binary_search(l[0:mid], item)
    elif item > l[mid]:
        return binary_search(l[mid+1:], item)

print(binary_search([1,2,3,4,5,6,7], 7))

# 非递归版本

def binary_search(l, item):
    start = 0
    end = len(l)-1
    while start <= end:
        mid = (start + end) // 2
        if item == l[mid]:
            return True
        elif item < l[mid]:
            end = mid - 1
        else:
            start = mid + 1
    return False

# 需求:返回找到的第一个数据的下标

def binary_search(l, item):
    start = 0
    end = len(l)-1
    while start <= end:
        mid = (start + end) // 2
        if item == l[mid]:
            if mid == 0 or item == l[mid-1]:
                return mid
            else:
                end = mid - 1
        elif item < l[mid]:
            end = mid - 1
        else:
            start = mid + 1
    return -1

4. 效率分析

  1. 时间复杂度:最优 O(1) 最差 O(logn)
  2. 空间复杂度:非递归版本 O(1)

二、其他搜索算法

  • 暴力(遍历)
  • 哈希(最高效O(1) JDK1.8 HashMap:链表+红黑树(处理hash冲突)
  • 插值(对二分查找的改进)
  • 索引(搜索引擎Lucene)
  • bfs&dfs(图论里面的遍历)
  • 平衡树
  • B+树
  • B树
  • 红黑树(高效的查找算法数据结构)
  • 二叉搜索树