Should I maintain
1.) a SortedDictionary(double,struct)
2.) or just a plain Dictionary(double,struct) plus a SortedSet(double)?
I just want fast insertions. I dont care about retrievals, as I'm not gonna do much lookups. I need sorted nature because, the only lookups I do are going to be on the maximum double or a few maximum doubles.
I feel time performance wise -
Both are same, the SortedSet<double>
just does extra work. Can you guys confirm?
The part I'm unaware of is whether to maintain the sorting, the SortedDictionary
moves around just the keys (doubles), or both the keys and values. In the latter case 2.) will outperform 1.), isn't it?
Also, its not clear how SortedDictionary
is internally implemented. Sortedset
is red-black tree which is a proven performer.
SortedDictionary, SortedList, and SortedSet are collection classes that store key-value pairs and can be sorted based on the keys. A SortedSet is a collection that is maintained in sorted order.
SortedSet is an ordered set collection. You have many elements you need to store, and you want to store them in a sorted order and also eliminate all duplicates from the data structure. SortedSet does not include hashing, meaning that it has to do linear searches for lookups.
Example: In C#, SortedDictionary is a generic collection which is used to store the key/value pairs in the sorted form and the sorting is done on the key. SortedDictionary is defined under System.Collection.Generic namespace. It is dynamic in nature means the size of the sorted dictionary is growing according to the need.
If you need to access items using an index or populate sorted data all at once in the collection, you might use a SortedList. If minimizing memory overhead is important and you need more lookups and fewer insert and delete operations, you might opt for a SortedList.
SortedDictionary<K, V>
is the way to go. Not just because it is the right structure for your usage, but even performance-wise and maintenance-wise it will be just better.
I just want fast insertions
In the second case you will have to insert both into Dictionary<K, V>
as well as SortedSet<K>
. That's two insertions (one O(1) and other O(log n)). I would expect it to be slower than single insertion to a SortedDictionary<K, V>
(O(log n)).
SortedDictionary<K, V>
is internally implemented as a SortedSet<KeyValuePair<K, V>>
with comparison being done on the Key
part of the KeyValuePair<K, V>
. So if you're satisfied with the performance of SortedSet<T>
, then there should be no looking back.
the sorteddictionary moves around just the keys (doubles), or both the keys and values
This is clearly micro-optimization. It's just a matter of moving around few extra bytes and that will hardly matter.
its not clear how sorteddictionary is internally implemented. Sortedset is red-black tree which is a proven performer.
SortedDictionary<K, V>
is internally implemented as a SortedSet<KeyValuePair<K, V>>
with comparison being done on the Key
part of the KeyValuePair<K, V>
. It is a red-black tree. So that is proven performer too...
Also note that SortedDictionary<K, V>
will be lighter on memory, as well as, results in faster removal as well as enumeration. The Dictionary<K, V>
/SortedSet<K>
hybrid approach will give you faster lookups, but it will have to do a lookup for each key in the dictionary for corresponding value part during enumeration. This is going to be slower.
Alert: I had not read your comments when I wrote the above !!
the struct I am using is kinda heavy ~100 bytes
If you can change it to class, do it. Moving around 100 bytes wont be nice if your app is performance critical one.
I made a quick and dirty Dictionary<K, V>
/SortedSet<K>
hybrid structure and tested it.
Indeed it was faster for a 100 byte struct when it came to insertion (more than twice as fast). Surely there is a penalty (who would create a 100 byte struct?).
When I changed it to class, they both gave the same insertion performance.
When I shrunk the size of the struct, even then the insertion performance was comparable.
So my suggestion is switch to a class and use SortedDictionary<K, V>
. If you are stuck with the struct, then Dictionary<K, V>
/SortedSet<K>
will be better. Good q, and +1.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With