QMHTMY / RustBook

A book about Rust Data Structures and Algorithms.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

第五章 5.4.3节内插查找算法编写有点小问题

Lethexy opened this issue · comments

https://github.com/QMHTMY/RustBook/blob/main/code/chapter05/interpolation_search.rs
不应该用上界处是否是 target来判断查找的结果
原来的代码:

fn interpolation_search(nums: &[i32], target: i32) -> bool {
    if nums.is_empty() { return false; }

    let mut high = nums.len() - 1;
    let mut low  = 0usize;
    loop {
        let low_val  = nums[low];
        let high_val = nums[high];
        if high <= low || target < low_val || target > high_val {
            break;
        }

        let offset = (target - low_val)*(high - low) as i32 / (high_val - low_val);
        let interpolant = low + offset as usize;

        if nums[interpolant] > target {
            high = interpolant - 1;
        } else if nums[interpolant] < target {
            low = interpolant + 1;
        } else {
            break;
        }
    }

    if target == nums[high] {
        true
    } else {
        false
    }
}

修改如下:

fn interpolation_search(nums: &[i32], target: i32) -> bool {
    if nums.is_empty() { return false; }

    let mut high = nums.len() - 1;
    let mut low  = 0usize;

    loop {
        let low_val  = nums[low];
        let high_val = nums[high];
        if high <= low || target < low_val || target > high_val {
           return false; 
        }

        let offset = (target - low_val)*(high - low) as i32 / (high_val - low_val);
        let interpolant = low + offset as usize;

        if nums[interpolant] > target {
            high = interpolant - 1;
        } else if nums[interpolant] < target {
            low = interpolant + 1;
        } else {
            return true;
        }
    }
}

ok,你这个实现更直观,我改下。但开源的图书已经不修改了,因为本书已经出版了,版权在出版社,我不能随便改开源版本。如果有机会,第二版我会修改此问题。打个广告,本书今天发布,可以买来看下(异步社区或者京东都可以)。出版的这本书修复了很多问题,且比开源版多40%的内容。谢谢你指出问题,有机会,第二版将您加入致谢名单。