"기수 탐색 트라이"의 두 판 사이의 차이

1번째 줄: 1번째 줄:
<source lang="rust">
 
 
#[derive(Debug)]
 
#[derive(Debug)]
 
enum Node<T: Sized> {
 
enum Node<T: Sized> {
36번째 줄: 35번째 줄:
 
         Node::None
 
         Node::None
 
     }
 
     }
     fn insert(&mut self, index: u8, key: u32, data: T) {
+
     fn insert(&mut self, index: u8, key: u32, data: T)->Option<T> {
 
         //println!("insert {}",index);
 
         //println!("insert {}",index);
 
         match *self {
 
         match *self {
46번째 줄: 45번째 줄:
 
                 };
 
                 };
 
                 *self = n;
 
                 *self = n;
 +
                None
 
             }
 
             }
 
             Node::Nonterminal {
 
             Node::Nonterminal {
56번째 줄: 56번째 줄:
 
                     left.as_mut()
 
                     left.as_mut()
 
                 };
 
                 };
                 next.insert(index + 1, key, data);
+
                 next.insert(index + 1, key, data)
 
                 //next
 
                 //next
 
             }
 
             }
 
             Node::Terminal {
 
             Node::Terminal {
 
                 key: self_key,
 
                 key: self_key,
                 data: self_data,
+
                 data:ref mut self_data,
 
             } => {
 
             } => {
 +
                if self_key == key{
 +
                    return Some(std::mem::replace(self_data, data));
 +
                }
 +
                let s = std::mem::replace(self, Node::None);
 +
                let res;
 
                 //eprintln!("{:?}", self);
 
                 //eprintln!("{:?}", self);
 
                 *self = match (radix_bit(self_key, index), radix_bit(key, index)) {
 
                 *self = match (radix_bit(self_key, index), radix_bit(key, index)) {
 
                     (true, true) => {
 
                     (true, true) => {
 
                         let mut node =
 
                         let mut node =
                             Node::nonterminal(Node::None, Node::terminal(self_key, self_data));
+
                             Node::nonterminal(Node::None, s);
                         node.insert(index, key, data);
+
                         res = node.insert(index, key, data);
 
                         node
 
                         node
 
                     }
 
                     }
 
                     (false, false) => {
 
                     (false, false) => {
 
                         let mut node =
 
                         let mut node =
                             Node::nonterminal(Node::terminal(self_key, self_data), Node::None);
+
                             Node::nonterminal(s, Node::None);
                         node.insert(index, key, data);
+
                         res = node.insert(index, key, data);
 
                         node
 
                         node
 
                     }
 
                     }
 
                     (true, false) => {
 
                     (true, false) => {
 
                         //eprintln!("{:?}", self);
 
                         //eprintln!("{:?}", self);
 +
                        res = None;
 
                         Node::nonterminal(
 
                         Node::nonterminal(
 
                             Node::terminal(key, data),
 
                             Node::terminal(key, data),
                             Node::terminal(self_key, self_data),
+
                             s,
 
                         )
 
                         )
 
                     }
 
                     }
 
                     (false, true) => {
 
                     (false, true) => {
 
                         //eprintln!("{:?}", self);
 
                         //eprintln!("{:?}", self);
 +
                        res = None;
 
                         Node::nonterminal(
 
                         Node::nonterminal(
                             Node::terminal(self_key, self_data),
+
                             s,
 
                             Node::terminal(key, data),
 
                             Node::terminal(key, data),
 
                         )
 
                         )
 
                     }
 
                     }
 
                 };
 
                 };
 +
                res
 
             }
 
             }
         };
+
         }
 
     }
 
     }
 
}
 
}
127번째 줄: 135번째 줄:
 
     }
 
     }
 
}
 
}
</source>
+
fn main(){
[[분류:프로그래밍]]
+
    //let mut tree = Tree::new();
 +
    let mut tree:Tree<[u8; 4096]> = Tree::new();
 +
   
 +
}

2019년 1월 5일 (토) 07:59 판

  1. [derive(Debug)]

enum Node<T: Sized> {

   Terminal {
       key: u32,
       data: T,
   },
   Nonterminal {
       left: Box<Node<T>>,
       right: Box<Node<T>>,
   },
   None,

}

  1. [derive(Debug)]

struct Tree<T: Sized> {

   root: Node<T>,

}

  1. [inline]

fn radix_bit(num: u32, radix: u8) -> bool {

   num & (1 << (32 - radix)) != 0

} impl<T: Sized> Node<T> {

   fn terminal(key: u32, data: T) -> Self {
       Node::Terminal {
           key: key,
           data: data,
       }
   }
   fn nonterminal(left: Self, right: Self) -> Self {
       Node::Nonterminal {
           left: Box::new(left),
           right: Box::new(right),
       }
   }
   fn none() -> Self {
       Node::None
   }
   fn insert(&mut self, index: u8, key: u32, data: T)->Option<T> {
       //println!("insert {}",index);
       match *self {
           Node::None => {
               let n = if radix_bit(key, index) {
                   Node::nonterminal(Node::none(), Node::terminal(key, data))
               } else {
                   Node::nonterminal(Node::terminal(key, data), Node::none())
               };
               *self = n;
               None
           }
           Node::Nonterminal {
               ref mut left,
               ref mut right,
           } => {
               let next = if radix_bit(key, index) {
                   right.as_mut()
               } else {
                   left.as_mut()
               };
               next.insert(index + 1, key, data)
               //next
           }
           Node::Terminal {
               key: self_key,
               data:ref mut self_data,
           } => {
               if self_key == key{
                   return Some(std::mem::replace(self_data, data));
               }
               let s = std::mem::replace(self, Node::None);
               let res;
               //eprintln!("{:?}", self);
               *self = match (radix_bit(self_key, index), radix_bit(key, index)) {
                   (true, true) => {
                       let mut node =
                           Node::nonterminal(Node::None, s);
                       res = node.insert(index, key, data);
                       node
                   }
                   (false, false) => {
                       let mut node =
                           Node::nonterminal(s, Node::None);
                       res = node.insert(index, key, data);
                       node
                   }
                   (true, false) => {
                       //eprintln!("{:?}", self);
                       res = None;
                       Node::nonterminal(
                           Node::terminal(key, data),
                           s,
                       )
                   }
                   (false, true) => {
                       //eprintln!("{:?}", self);
                       res = None;
                       Node::nonterminal(
                           s,
                           Node::terminal(key, data),
                       )
                   }
               };
               res
           }
       }
   }

}

impl<T: Sized> Tree<T> {

   fn new() -> Self {
       Self { root: Node::none() }
   }
   fn insert(&mut self, key: u32, data: T) {
       self.root.insert(1, key, data);
   }
   fn find(&self, key: &u32) -> Option<&T> {
       let mut node = &self.root;
       let mut radix = 0u8;
       loop {
           //eprintln!("{}, {:?}",radix, node);
           radix += 1;
           //println!("find radix: {} {:?}",radix, node);
           match node {
               Node::Terminal {
                   key: termial_key,
                   data,
               } if termial_key == key => break Some(data),
               Node::Nonterminal { left, right } => {
                   node = match radix_bit(*key, radix) {
                       true => right.as_ref(),
                       false => left.as_ref(),
                   }
               }
               _ => break None,
           }
       }
   }

} fn main(){

   //let mut tree = Tree::new();
   let mut tree:Tree<[u8; 4096]> = Tree::new();
   

}