算法导论——二分查找

Posted 代码综合征

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法导论——二分查找相关的知识,希望对你有一定的参考价值。

二分查找

对于一个已排序的序列,可以从序列的中点开始与给定的值进行比较,根据比较的结果,序列中可以有一半不做考虑。

二分查找重复这个过程,每次都将序列剩余部分的规模减半。二分查找最坏情况运行时间为θ(lgn)。

 
   
   
 
  1. def binary_search(data_set, val):

  2.    low = 0

  3.    high = len(data_set) - 1

  4.    while low <= high:

  5.        mid = (low + high) // 2

  6.        if data_set[mid] == val:

  7.            return mid

  8.        elif data_set[mid] > val:

  9.            high = mid - 1

  10.        else:

  11.            low = mid + 1

  12.    return

插入排序用二分查找的改进

插入排序算法可以使用二分查找来改进。可以将其最坏情况运行时间改进到θ(nlgn)。

 
   
   
 
  1. def insertion_sort_binary_search(a):

  2.    for j in range(1, len(a)):

  3.        key = a[j]

  4.        left = 0

  5.        right = j - 1

  6.        while left <= right:

  7.            middle = (right + left) // 2

  8.            if a[middle] > key:

  9.                right = middle - 1

  10.            else:

  11.                left = middle + 1

  12.        i = j - 1

  13.        while i > right:

  14.            a[i + 1] = a[i]

  15.            i = i - 1

  16.        a[right + 1] = key

寻找是否存在两数之和等于目标数

需要一个运行时间为θ(nlgn)的算法,给定n个整数的集合S和另一个整数x,确定S中是否存在两个数的和刚好为x的元素。

使用二分查找是可以得到θ(nlgn)的最坏情况运行时间。但是实际这个问题还有另一个更好的算法。使用哈希表能够使其达到θ(n)的时间。

 
   
   
 
  1. def find_sum_target(self, nums, target):

  2.    dic=dict()

  3.    for index, value in enumerate(nums):

  4.        if target-value in dic:

  5.            return [dic[target-value],index]

  6.        else:

  7.            dic[value]=index

在归并排序中对小数组采用插入排序

尽管合并排序的最坏情况运行时间为θ(nlgn),插入排序的最坏情况运行时间为θ(n^2),但插入排序中的常数因子使得它在n较小时,运行得要更快一些。

因此,在合并排序算法中,当子问题足够小时,采用插入排序就比较合适了。

考虑对合并排序做这样的修改,即采用插入排序策略,对n/k个长度为k的子列表进行排序,然后,再用标准的合并机制将它们合并起来,此处k是一个特定的值。

n/k个子表的插入排序最坏情况时间为θ(nk),最坏情况合并时间为θ(nlg(n/k))。

在实践中,在满足插入排序比合并排序更快的情况下,k取最大值。

冒泡排序

解决桶排序空间的问题,但是效率太低。

 
   
   
 
  1. def bubbleSort(nums):

  2.    for i in range(len(nums)-1):    # 这个循环负责设置冒泡排序进行的次数

  3.        for j in range(len(nums)-i-1):  # j为列表下标

  4.            if nums[j] > nums[j+1]:

  5.                nums[j], nums[j+1] = nums[j+1], nums[j]

  6.    return nums


以上是关于算法导论——二分查找的主要内容,如果未能解决你的问题,请参考以下文章

二分查找学习

利用二分法实现插入排序算法(二分法使用递归来实现)

《算法导论》动态规划—最优二分搜索树

算法导论-2

PHP实现二分查找算法(代码详解)

「算法笔记」一文摸秃二分查找