查找算法(一):查找

栏目: 编程工具 · 发布时间: 5年前

内容简介:二分查找(也称为折半查找),在给定一个斐波那契数列公式:斐波那契查找步骤如下:
def search(arr, target):
    for i in range(len(arr)):
        if arr[i] == target:
            return i
    return -1

二分查找

二分查找(也称为折半查找),在给定一个 有序数组 的前提下,取中间的元素(arr[mid])作为比较的对象,如果target值大于中间元素,则在中间元素的右边继续查找,反之,则在中间元素的左边继续查找。

def binary_search(arr, target):
    lo = 0
    hi = len(arr)-1
    
    while lo <= hi:
        mid = (lo + hi) // 2
        if arr[mid] == target:
            return mid
        elif arr[mid] > target:
            hi = mid - 1
        else:
            lo = mid + 1
            
    return -1

斐波那契数列查找

斐波那契数列公式:

斐波那契查找步骤如下:

第一步:从斐波那契数列中找到 第一个 大于或等于数组长度(n)的数(fibM)

第二步:当数组中还有未遍历的元素时:

1. 将游标cur定义为fib2覆盖部分的最后一个元素
 2. 比较目标值与arr[cur]进行比较,如果匹配,立即返回索引,完成查找
 3. 如果目标值大于arr[cur],则把斐波那契数列下降一个单位
 4. 如果目标值小于arr[cur],则把斐波那契数列下降两个单位

第三步:如果仅余一个元素用于比较,检验fib1是否等于1,如果是,判断该元素是否为target

def fibMonaccianSearch(arr, target, n): 
    # f(n) = f(n-1) + f(n-2)  
    # fib2 + fib1 = fibM
    # fib2 --> fib1 --> fibM
    fib2 = 0  
    fib1 = 1 
    fibM = fib2 + fib1 
  
    while fibM < n:  # 从斐波那契数列中找到*第一个*大于或等于数组长度(n)的数(fibM)
        fib2 = fib1 
        fib1 = fibM 
        fibM = fib2 + fib1 
  
    offset = -1
  
    while fibM > 1:  # 当fibM等于1,fib2等于0,后面没有元素了
        cur = min(offset+fib2, n-1)  # cur相当于二分查找中的mid
        
        if arr[cur] < target:  # target大于arr[cur],转向cur的右边
            fibM = fib1        # 斐波那契下降一个单位
            fib1 = fib2 
            fib2 = fibM - fib1 
            offset = cur       # cur的右边需要把cur之前的部分加到fib2上
  
        elif arr[cur] > target:  # target小于arr[cur],转向cur的左边
            fibM = fib2          # 斐波那契下降两个单位
            fib1 = fib1 - fib2 
            fib2 = fibM - fib1 
  
        else: 
            return cur
  
    if fib1 == 1 and arr[offset+1] == target: 
        # 如果仅余一个元素用于比较,检验fib1是否等于1,如果是,判断该元素是否为target
        return offset+1 
  
    # element not found. return -1  
    return -1
  
# Driver Code 
arr = [10, 22, 35, 40, 45, 50, 80, 82, 85, 90, 100] 
n = len(arr) 
target = 10
print("Found at index:", fibMonaccianSearch(arr, target, n))

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

HTML 5实战

HTML 5实战

陶国荣 / 机械工业出版社 / 2011-11 / 59.00元

陶国荣编著的《HTML5实战》是一本系统而全面的HTML 5教程,根据HTML 5标准的最新草案,系统地对HTML 5的所有重要知识点进行了全面的讲解。在写作方式上,本书以一种开创性的方式使理论与实践达到极好的平衡,不仅对理论知识进行了清晰而透彻的阐述,而且根据读者理解这些知识的需要,精心设计了106个完整(每个案例分为功能描述、实现代码、效果展示和代码分析4个部分)的实战案例,旨在帮助读者通过实......一起来看看 《HTML 5实战》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器