2022/04/21
はじめに
ビルトインの hash table library を使わずに hash set を実装する問題.
Rust を使って,簡単な方法で解いてみる(この問題を解くためのベストの方法ではないのでご注意!!).
コード全文
問題の条件では,key
が0 <= key <= 10^6
となっていたので,「行けるだろ」ということで,フラグを格納する10^6+1
の長さを持つブール配列を準備した.
main.rs
struct MyHashSet {
flags: Vec<bool>,
}
impl MyHashSet {
fn new() -> Self {
Self { flags: vec![false; 1000001] }
}
fn add(&mut self, key: i32) {
self.flags[key as usize] = true;
}
fn remove(&mut self, key: i32) {
self.flags[key as usize] = false;
}
fn contains(&self, key: i32) -> bool {
self.flags[key as usize]
}
}
解説
struct 準備
flags
のkey
番目にはkey
が含まれているかどうかの状態をbool
型で記録するような実装を行う.
struct MyHashSet {
flags: Vec<bool>,
}
コンストラクタ
MyHashSet::new()
により,MyHashSet
を初期化出来る.
初期化時は,長さ1000001
のfalse
を持つflags
を準備する.
impl MyHashSet {
fn new() -> Self {
Self { flags: vec![false; 1000001] }
}
add method
key
を追加するためのメソッド.
ミュータブルメソッドのため,&mut self
とし,key
番目の値をtrue
にする.
ここで,入力されるkey
の型はi32
であり,直接Vec
のキーとすることは出来ないため,key as usize
により,型キャストを行い,要素にアクセスする.
fn add(&mut self, key: i32) {
self.flags[key as usize] = true;
}
remove method
key
を削除するためのメソッド.
key
番目の値をtrue
にする.
fn remove(&mut self, key: i32) {
self.flags[key as usize] = false;
}
contains method
要素が含まれるかを確認するメソッド.
例によって,型キャストを行って取得できる要素を戻り値とする.
fn contains(&self, key: i32) -> bool {
self.flags[key as usize]
}
}
おわりに
メンバ関数に関して,C++ではconst
を付けることでイミュータブルに出来るのに対し,Rust ではmut
を付けることでミュータブルにできるという点から,両者の違いが伝わってくる.