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))
    

      

    笃志:“博学而笃志,切问而近思,仁在其中矣。”
    弘毅:“士不可以不弘毅,任重而道远。”
    止于至善:“大学之道,在明明德,在亲民,在止于至善。”
    关注:笃志弘毅,止于至善
  • 相关阅读:
    POJ 3468 A Simple Problem with Integers
    BZOJ 4430 Guessing Camels
    POJ 2309 BST
    POJ 1990 MooFest
    cf 822B Crossword solving
    cf B. Black Square
    cf 828 A. Restaurant Tables
    Codefroces 822C Hacker, pack your bags!
    [HDU 2255] 奔小康赚大钱
    [BZOJ 1735] Muddy Fields
  • 原文地址:https://www.cnblogs.com/dzhy/p/10948280.html
Copyright © 2011-2022 走看看