Advertisement
Guest User

Untitled

a guest
Jan 9th, 2018
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Rust 3.58 KB | None | 0 0
  1. extern crate rand;
  2.  
  3. const SPAN: u32 = 16;
  4.  
  5. use rand::Rng;
  6. use std::cmp;
  7.  
  8. fn collapse_right(x: u32) -> u32 {
  9.     if x == 0 {
  10.         return 0
  11.     }
  12.     let mut num_shifts = 0;
  13.     loop {
  14.         let num_shifts_is_fine = ((x >> num_shifts) << num_shifts) == x;
  15.         let num_shifts_plus_one_is_fine =((x >> (num_shifts + 1)) << (num_shifts + 1)) == x;
  16.         if !num_shifts_is_fine {
  17.             panic!();
  18.         }
  19.         if num_shifts_is_fine && !num_shifts_plus_one_is_fine {
  20.             return x >> num_shifts;
  21.         } else {
  22.             num_shifts = num_shifts + 1;
  23.         }
  24.     }
  25. }
  26.  
  27. fn get_span(mut x: u32) -> i32 {
  28.     if x == 0 {
  29.         return 0;
  30.     }
  31.     x = collapse_right(x);
  32.  
  33.     for i in 0..32 {
  34.         if x >> i == 0 {
  35.             return i;
  36.         }
  37.     }
  38.     panic!();
  39. }
  40.  
  41. fn make_esubtable_with(ids: &Vec<u32>) -> ESubTable {
  42.     let mut esubtable = ESubTable {
  43.         itablePtrs: [None; SPAN as usize]
  44.     };
  45.     for id in ids {
  46.         insert_into_esubtable(&mut esubtable, *id);
  47.     }
  48.     return esubtable;
  49. }
  50.  
  51. fn make_zero_etable(capacity: u32) -> Vec<ESubTable> {
  52.     let mut etable: Vec<ESubTable> = Vec::new();
  53.     for _ in 0..capacity {
  54.         etable.push(make_esubtable_with(&Vec::new()));
  55.     }
  56.     return etable;
  57. }
  58.  
  59. struct ESubTable {
  60.     itablePtrs: [Option<u32>; SPAN as usize]
  61. }
  62.  
  63. fn insert_into_esubtable(esubtable: &mut ESubTable, id: u32) {
  64.     let esubindex = (id % SPAN) as usize;
  65.     esubtable.itablePtrs[esubindex] = Some(id)
  66. }
  67.  
  68. fn insert_into_etable(etable: &mut Vec<ESubTable>, id: u32) {
  69.     let etopindex = (id % (etable.len() as u32)) as usize;
  70.     let mut esubtable = &mut etable[etopindex];
  71.     insert_into_esubtable(&mut esubtable, id);
  72. }
  73.  
  74. fn get_members(esubtable: &ESubTable) -> Vec<u32> {
  75.     let mut members: Vec<u32> = Vec::new();
  76.     for j in 0..SPAN {
  77.         match esubtable.itablePtrs[j as usize] {
  78.             Some(id) => {
  79.                 members.push(id);
  80.             }
  81.             None => {}
  82.         }
  83.     }
  84.     return members;
  85. }
  86.  
  87. fn count_members(etable: &Vec<ESubTable>) -> u32 {
  88.     let mut count = 0;
  89.     for i in 0..etable.len() {
  90.         count = count + get_members(&etable[i]).len()
  91.     }
  92.     return count as u32;
  93. }
  94.  
  95. fn generate_etable(mut rng: &mut rand::ThreadRng, ids: &Vec<u32>) -> (Vec<ESubTable>) {
  96.     let mut capacity = ids.len() as u32;
  97.     if ids.len() > 170 {
  98.         capacity = ((ids.len() as f32) * 1.5f32) as u32;
  99.     }
  100.     if ids.len() > 250 {
  101.         capacity = (ids.len() as u32) * 2;
  102.     }
  103.  
  104.     loop {
  105.         let mut etable = make_zero_etable(capacity);
  106.  
  107.         for id in ids.iter() {
  108.             insert_into_etable(&mut etable, *id);
  109.         }
  110.         let num_members = count_members(&etable);
  111.         if num_members == ids.len() as u32 {
  112.             return etable;
  113.         }
  114.  
  115.         capacity = capacity + 1;
  116.     }
  117. }
  118.  
  119.  
  120.  
  121. fn main() {
  122.     let mut rng = rand::thread_rng();
  123.  
  124.     let increment = 50;
  125.     let stop = 500;
  126.     let mut num_elements = 0;
  127.     loop {
  128.         num_elements = num_elements + increment;
  129.  
  130.         let mut sum_of_sizes_for_average: u64 = 0;
  131.         let mut num_trials = 10;
  132.         let mut worst_size_option: Option<u32> = None;
  133.  
  134.         for _ in 0..num_trials {
  135.             let mut ids: Vec<u32> = Vec::new();
  136.             for _ in 0..num_elements {
  137.                 ids.push(rng.gen::<u32>());
  138.             }
  139.             let etable = generate_etable(&mut rng, &ids);
  140.  
  141.             let size = etable.len() as u32;
  142.  
  143.             sum_of_sizes_for_average = sum_of_sizes_for_average + size as u64;
  144.             match worst_size_option {
  145.                 None => {
  146.                     worst_size_option = Some(size);
  147.                 }
  148.                 Some(previously_worst_size) => {
  149.                     worst_size_option = Some(cmp::max(previously_worst_size, size));
  150.                 }
  151.             }
  152.         }
  153.  
  154.         let average_size = sum_of_sizes_for_average as f64 / num_trials as f64;
  155.         let worst_size = worst_size_option.unwrap_or(0);
  156.  
  157.         println!("For {} elements, average size {} and worst size {}", num_elements, average_size, worst_size);
  158.  
  159.         if num_elements >= stop {
  160.             break;
  161.         }
  162.     }
  163. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement