最近在学算法,写了一个线性时间的获取最大子数组的方法。 但是奇怪的是,速度有可能会突然慢很多。 代码如下: pub fn quick_find_max_subarray(v:&Vec) -> (usize,usize,i32){ let mut max_array = (0,0,0); let mut i = 0; while(i<v.len()){ let array = find_new_array(&v,i); i = array.1; let mut sum = array.2; if array.2 > max_array.2{ max_array = array; } for j in i..v.len(){ if(sum+v[j]<0){ i=j+1; break; }else{ sum = sum+v[j]; if(sum>max_array.2){ max_array = (array.0,j+1,sum); } } } } return max_array; }
fn find_new_array(v:&Vec,left:usize)->(usize,usize,i32){ for i in left..v.len(){ if(v[i]>0){ let mut sum = v[i]; for j in i+1..v.len(){ if(v[j]<0){ return (i,j,sum) }else{ sum = sum + v[j]; } } return (i,v.len(),sum); } } return (v.len(),v.len(),0); }
主方法: fn main(){ for j in 1..7 { let mut rng = thread_rng(); let mut v = vec![]; for i in 0..(10 as i32).pow(j) { v.push(rng.gen::() % 10); } //println!("{:?}", v); //println!("{:?}", quick_find_max_subarray(&v)); let r = v.len()-1; let t1 = SystemTime::now(); quick_find_max_subarray(&v); let t2 = SystemTime::now(); merge_sort(&mut v, 0, r); let t3 = SystemTime::now(); println!("q-m : {:?}",t2.duration_since(t1).ok().unwrap().as_nanos()/(10 as i32).pow(j) as u128); println!("m-s : {:?}",t3.duration_since(t2).ok().unwrap().as_nanos()/(10 as i32).pow(j) as u128); //println!("{:?}",t3.duration_since(t2).ok().unwrap().as_nanos()/t2.duration_since(t1).ok().unwrap().as_nanos()); } } 典型运行结果第一组: q-m : 24 m-s : 211 q-m : 4 m-s : 192 q-m : 7 m-s : 182 q-m : 3 m-s : 172 q-m : 2 m-s : 177 q-m : 497 m-s : 188 典型运行结果第二组: q-m : 21 m-s : 209 q-m : 5 m-s : 183 q-m : 2 m-s : 181 q-m : 0 m-s : 172 q-m : 172 m-s : 176 q-m : 69 m-s : 189
这到底是什么原因呢?
评论区
写评论已经发现问题了。。。是我代码的错误。。。
错误代码
正确代码
默认文字是p标签,如果想显示文字的原格式,该网站支持Markdown中的代码写法。
谷歌
markdown code
,查询使用方法。这样标记之后,特定的文字可以转换成HTML的pre标签。
e.g.
对以下内容的回复:
额,这里的代码为什么会排版混乱。。。