我正在try 通过大约1.5n次运算来确定Rust中整数向量中的最大和第二大元素.(这是我正在读的一本书中的练习).
我的方法是迭代数组,直到n/2,以 Select 一对整数,然后比较这些整数以确定哪个更大.较大的数字被放置在新的数组L中,而较小的数字被添加到另一数组S.
逻辑是最大的数字应该在数组L中,而第二大数字应该在数组L或数组S中.这将使用不同的比较.
第一步应采用n/2运算,而其他步骤理想情况下应采用少于n个运算,约为1.5n个运算.
我已经用Rust编写了一个程序,该程序有时会输出正确的答案,但大多数情况下,它会输出错误的答案.
我try 对其进行调试,但发现了一些问题:
-
当迭代到100时,当向量的大小为奇数时,程序无法访问向量中的最后一个元素.如果迭代到101,我会得到一个越界错误.
-
代码无法确定最大数字和第二大数字是否具有相同的索引.(它们不应该是同一个指数,这更多的是因为我缺乏如何实现这一点的 idea ).
以下是我开发的程序:
pub fn max_pairwise_product_faster(a: &Vec<i64>) -> i64 {
let n = (a.len()) / 2;
let mut larger_numbers: Vec<i64> = Vec::new();
let mut smaller_numbers: Vec<i64> = Vec::new();
println!("n: {}", n);
for i in 0..n {
if a[2 * i] > a[2 * i + 1] {
larger_numbers.push(a[2 * i]);
smaller_numbers.push(a[2 * i + 1]);
} else {
larger_numbers.push(a[2 * i * 1]);
smaller_numbers.push(a[2 * i]);
}
}
println!(
"larger_numbers: {:?}, smaller_numbers: {:?}",
larger_numbers, smaller_numbers
);
let largest = larger_numbers.iter().max().unwrap();
// Determine the second-largest number
let mut second_largest = smaller_numbers.iter().max().unwrap();
//Check if there is any number higher than this in the larger_number vector
for number in &larger_numbers {
if number != largest && number > second_largest {
second_largest = number;
}
}
println!(
"largest_number: {}, second_largest_number: {}",
largest, second_largest
);
largest * second_largest
}
以下是当前实现的样例输入和输出:
input array: [3, 5, 8, 20, 8, 7, 11, 20, 5, 16]
n: 5
larger_numbers: [3, 8, 8, 11, 5], smaller_numbers: [3, 8, 7, 11, 5]
largest_number: 11, second_largest_number: 11
Wrong answer -> naive: 400, fast: 121
在本例中,正确答案应该是400,但代码甚至没有正确获得最大数字.
我不想要这方面的确切代码,但演练我可以如何实现这一点.