Two hash tables, hash table with double key or different solution?
Once again, talking about my upcoming university project... I had a class today, where we could ask stuff about the project but I still haven't decided on the best way to do this.
Basically, I have a bunch of users (some struct with a couple of members) which must be quickly searched by name and by SSN. Since I will also need to use theses users on a Graph (for other operations), I will be working with pointers.
Now, I though about using two hash tables. One where the key is the name and another where the key is the SSN. But I don't like the idea of having two Hash Tables, simply with different keys and pointing to the same place.
It crossed my mind using a Hash Table with two keys but I don't even know if that is possible and I believe it's not. I just can't think of a way to 开发者_如何学Pythondo it, maybe there is one, or maybe not.
Besides these two solutions, I can't think of any other alternative... I may have to go with the two Hash Tables.
Do you guys suggest any other alternative?
I'd go with two hash tables. Think of it as two indexes into a database. The database is your users, and you provide two indexes: one ssn index and one name index.
I think that two Hashtables are ok. Consider binary search trees also, they can be more compact but O(log n) search and harder to implement.
"Hash Table with two keys" never heard of it...
I don't think there is a way to build a single hash table which supports two keys.
If you want both SSN-lookup and name-lookup to be really fast, then you need two hash tables. You have to remember to add to both of them, or remove from both of them.
Otherwise, you can make the more frequent one (e.g. SSN-lookup) as a hash-based lookup, and the other one as brute-force lookup from the hash table.
Two hash tables like you said. The advantage is that lookup will be very fast for RANDOM data or even real-life data. The disadvantage is that you don't know what your professors will throw at it (or do you?) and they might force the worst case.
Balanced search trees. I recommend treaps: http://en.wikipedia.org/wiki/Treap - they are, in my opinion, the easiest to implement.
Sort your users and binary search. Also O(log N) per search, and even easier to implement than a treap.
A combination of hashes + sorted users / search trees, if you can afford the memory. This will make it O(1) best case and O(log N) worst case. If H[i] = list of objects that hashed to i, keep a count for each i that tells you how many objects are in that list. If that count is too big, use the sorted users list / search tree instead.
What about concatenate the two keys and use as key?
Example i had x , y , z.
Concatanete x and y using a string or char as a separator. This is a simple way to do it.
At this post I see what could be more interesting to this solution: Multi-dimensional associative arrays in javascript
精彩评论