Re:Gaming CS Interviews
by trinovantes on Wednesday September 28, 2022 @05:51AM
(#33006206)
Does it? Set insertion is O(log n) and you need to insert n items.
[ Parent
| on HN ]
Not if you use a hash set. This is expected O(n) time to de-duplicate an array of integers while maintaining the original order (more explicitly written than I normally would in Rust for didactical purposes):
let mut hash_set = HashSet::new();
let mut len = 0;
for i in 0..arr.len() {
if !hash_set.contains(&arr[i]) {
hash_set.insert(arr[i]);
arr[len] = arr[i];
len += 1;
}
}
arr.truncate(len);
Re:Gaming CS Interviews
by trinovantes on Wednesday September 28, 2022 @06:40AM
(#33006481)
Good point but it's not exactly a free lunch. You're trading memory for the speedup.
You can also use radix sort for what I'd like to call "fake" O(n) sort since physical hardware puts an upper limit on the hidden constant.
Radix sort generally places far more restrictions on the keys than a set would.
Re:Gaming CS Interviews
by Cyphonetic on Wednesday September 28, 2022 @06:27AM
(#33006415)
But to order a list is O(n log n)
Re:Gaming CS Interviews
by trinovantes on Wednesday September 28, 2022 @06:42AM
(#33006493)
In the worst case, you need to insert every element into your set to find out if there's no duplicate hence it'll take O(n log n) too
Not with a hash set - that gives you expected amortized O(1) insertion (yes, both expected and amortized). In contrast, a generalized sort is O(n log n), but you can sort numeric types in O(n).