From f702a6fc99abb02069f75e9017df7bbd734c11af Mon Sep 17 00:00:00 2001 From: Felix Martin Date: Mon, 15 Feb 2021 13:02:17 -0500 Subject: [PATCH] Finish course 3 week 3 assignment --- src/main.rs | 13 +++++++++++- src/mwis.rs | 60 +++++++++++++++++++++++++++++++++++++++++++++++++++++ src/util.rs | 21 +++++++++++++++++++ 3 files changed, 93 insertions(+), 1 deletion(-) create mode 100644 src/mwis.rs diff --git a/src/main.rs b/src/main.rs index 0b43178..9569690 100644 --- a/src/main.rs +++ b/src/main.rs @@ -4,6 +4,7 @@ mod huffman; mod jobs; mod k_clustering; mod k_clustering_big; +mod mwis; mod merge_sort; mod min_cut; mod prims; @@ -23,6 +24,7 @@ use crate::prims::prims; use crate::quick_sort::quick_sort; use crate::ssc::ssc; use crate::two_sum::find_two_sums; +use crate::mwis::mwis; use std::cmp::min; #[allow(dead_code)] @@ -120,7 +122,15 @@ fn c3a2() { fn c3a3() { let h = util::read_huffman_alphabet("data/c3a3_huffman.txt").unwrap(); let r = huffman::build_huffman_tree(&h); - println!("r1 = {} r2 = {}", r.1, r.0); + + let s = util::read_max_weight_set("data/c3a3_mwis.txt").unwrap(); + let r3 = mwis(&s); + println!("r1 = {} r2 = {} r3 = {:?}", r.1, r.0, r3); +} + +#[allow(dead_code)] +fn c3a4() { + println!("continue here"); } fn main() { @@ -134,4 +144,5 @@ fn main() { // c3a1(); // c3a2(); c3a3(); + c3a4(); } diff --git a/src/mwis.rs b/src/mwis.rs new file mode 100644 index 0000000..28aeee2 --- /dev/null +++ b/src/mwis.rs @@ -0,0 +1,60 @@ + +#[derive(Debug)] +pub struct IndependentSet { + pub length: usize, + pub weights: Vec, +} + +#[derive(Debug)] +struct Solution { + weight: u64, + nodes: Vec, +} + +pub fn mwis(s: &IndependentSet) -> Vec { + let mut solutions: Vec = Vec::new(); + + + solutions.push(Solution { + weight: s.weights[0], + nodes: vec![0], + }); + + solutions.push(Solution { + weight: s.weights[1], + nodes: vec![1], + }); + + for i in 2..s.weights.len() { + let s1 = Solution { + weight: solutions[i - 1].weight, + nodes: solutions[i - 1].nodes.to_vec(), + }; + + let mut s2_vec = solutions[i - 2].nodes.to_vec(); + s2_vec.push(i); + let s2 = Solution { + weight: solutions[i - 2].weight + s.weights[i], + nodes: s2_vec, + }; + + if s1.weight > s2.weight { + solutions.push(s1); + } else { + solutions.push(s2); + } + + } + + let solution = solutions.pop().unwrap(); + let mut result = Vec::new(); + let vertices = vec![0, 1, 2, 3, 16, 116, 516, 996]; + for v in &vertices { + if solution.nodes.contains(v) { + result.push(1); + } else { + result.push(0); + } + } + result +} \ No newline at end of file diff --git a/src/util.rs b/src/util.rs index 3f55aa8..5d0ed5d 100644 --- a/src/util.rs +++ b/src/util.rs @@ -5,6 +5,7 @@ use crate::k_clustering_big; use crate::min_cut; use crate::prims; use crate::ssc; +use crate::mwis; use std::fs::File; use std::io; use std::io::{BufRead, BufReader, Error, ErrorKind}; @@ -260,3 +261,23 @@ pub fn read_huffman_alphabet(path: &str) -> Result Result { + let file = File::open(path)?; + let mut lines = BufReader::new(file).lines(); + let line = lines.next().unwrap().unwrap(); + let length = line.parse().unwrap(); + + let mut s = mwis::IndependentSet { + length: length, + weights: Vec::new(), + }; + + for line in lines { + let line = line?; + let weight = line.parse().unwrap(); + s.weights.push(weight); + } + assert!(length == s.weights.len()); + Ok(s) +}