RustBook
RustBook copied to clipboard
第五章 5.4.3节内插查找算法编写有点小问题
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%的内容。谢谢你指出问题,有机会,第二版将您加入致谢名单。