1+ struct MyHashMap {
2+ buckets : Vec < Vec < ( i32 , i32 ) > > ,
3+ }
4+
5+ // Prime number of buckets to reduce collisions
6+ const N_BUCKETS : usize = 1031 ;
7+
8+ impl MyHashMap {
9+
10+ fn new ( ) -> Self {
11+ Self { buckets : vec ! [ vec![ ] ; N_BUCKETS ] }
12+ }
13+
14+ fn hash ( key : i32 ) -> usize {
15+ key as usize % N_BUCKETS
16+ }
17+
18+ fn find_entry ( & mut self , key : i32 ) -> ( & mut Vec < ( i32 , i32 ) > , Result < usize , usize > ) {
19+ let bucket = & mut self . buckets [ Self :: hash ( key) ] ;
20+ let result = bucket. binary_search_by ( |( k, v) | k. cmp ( & key) ) ;
21+ ( bucket, result)
22+ }
23+
24+ fn put ( & mut self , key : i32 , value : i32 ) {
25+ match self . find_entry ( key) {
26+ ( bucket, Ok ( index) ) => bucket[ index] = ( key, value) ,
27+ ( bucket, Err ( index) ) => bucket. insert ( index, ( key, value) ) ,
28+ }
29+ }
30+
31+ fn get ( & self , key : i32 ) -> i32 {
32+ let bucket = & self . buckets [ Self :: hash ( key) ] ;
33+ match bucket. binary_search_by ( |( k, v) | k. cmp ( & key) ) {
34+ Ok ( index) => bucket[ index] . 1 ,
35+ Err ( index) => -1 ,
36+ }
37+ }
38+
39+ fn remove ( & mut self , key : i32 ) {
40+ match self . find_entry ( key) {
41+ ( bucket, Ok ( index) ) => { bucket. remove ( index) ; } ,
42+ _ => ( ) ,
43+ }
44+ }
45+ }
0 commit comments