zoukankan      html  css  js  c++  java
  • 查找算法——插值查找

    1、算法介绍

    插值查找是对二分查找的优化,是有序序列的查找算法。

    二分查找:mid = (left + right)/2 = left/2 + right/2 = left - left/2 + right/2

             = left + (right - left)/2 = left + (right - left) * (1/2)

    二分查找选取中间位置,插值查找则通过查找值判定大概位于序列的哪个位置比例。

    插入查找:选择下标 = left + (right - left) * (key - arr[left])/(arr[right] - arr[left])

    (1)序列为有序序列

    (2)根据公式选取比较值,相等返回下标,不相等则根据公式继续查找,未找到返回-1

    2、代码实现

    2.1、golang

    package main
    
    import (
    	"fmt"
    )
    
    func main() {
    	slice := []int{1, 2, 3, 4, 5, 6} //升序序列
    	key := -100
    	index := SearchInsert(slice, key)
    	if index == -1 {
    		fmt.Printf("%v不存在元素%v
    ", slice, key)
    	} else {
    		fmt.Printf("%v位于%v下标为%v的位置。
    ", key, slice, index)
    	}
    }
    
    //插值查找
    func SearchInsert(slice []int, key int) int {
    	left, right := 0, len(slice)-1
    	for left <= right {
    		//相等值处理
    		if slice[right] == slice[left] {
    			if slice[left] == key {
    				return left
    			}
    			return -1
    		}
    		mid := left + (right-left)*(key-slice[left])/(slice[right]-slice[left])
    		//下标判断
    		if mid < left || key > right {
    			return -1
    		}
    		if slice[mid] == key {
    			return mid
    		}
    		if slice[mid] > key {
    			right = mid - 1
    		}
    		if slice[mid] < key {
    			left = mid + 1
    		}
    	}
    	return -1
    }
    

    2.2、python3

    # 插值查找
    def search_insert(arr, key):
        left, right = 0, len(arr) - 1
        while (left <= right):
            # 相等判断
            if arr[right] == arr[left]:
                if arr[left] == key:
                    return left
                else:
                    return -1
            mid = left + (key - arr[left]) // (arr[right] - arr[left]) * (right -
                                                                          left)
            # 选取下标判断
            if mid < left or mid > right:
                return -1
            if (arr[mid] == key):
                return mid
            if (arr[mid] > key):
                right = mid - 1
            if (arr[mid] < key):
                left = mid + 1
        return -1
    
    
    if __name__ == '__main__':
        arr = [2, 2, 2, 2]
        key = 2
        index = search_insert(arr, key)
        if index == -1:
            print("%s不存在元素%s。" % (arr, key))
        else:
            print("%s位于%s下标为%s的位置。" % (key, arr, index))
    

      

    笃志:“博学而笃志,切问而近思,仁在其中矣。”
    弘毅:“士不可以不弘毅,任重而道远。”
    止于至善:“大学之道,在明明德,在亲民,在止于至善。”
    关注:笃志弘毅,止于至善
  • 相关阅读:
    js加载优化三
    js加载优化-二
    js加载优化
    怎样获取元素的高度
    HttpClient
    Android Http请求方法汇总
    table列等宽
    单页面手机开发
    单页面
    【154】C#打包程序成安装包
  • 原文地址:https://www.cnblogs.com/dzhy/p/10948280.html
Copyright © 2011-2022 走看看