Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

One-to-one mapping data structure (A,B) with getKey(B) in O(1)?

This question was initially misphrased, see the EDIT below. I'll leave it up for context.

I've been thinking about smart ways to build a bijective (i.e. one-to-one) mapping. Mapping a function A->B (many-to-one) is basically what HashMap(A,B) does. If I now wanted to have a data structure that implements something one-to-one with contains() in O(1), would there be something in the java standard libraries that I could use? Mind you, I don't need this for anything right now, this was just something I thought about recently and couldn't come up with a data structure for, so answers aren't a rush. Is there a class like that? If not, what do you think why that is?

All I could find on SO are things about hibernate, that was of no help to me.

EDIT: My question was ill phrased, so some explanation is due.

What I meant was is the "backward" mapping B->A. HashMap(A,B) has contains(A) and contains(B) both in O(1), so that's not even what I meant, sorry for the confusion. What I meant was, is there a datastructure mapping A<->B that has getValue(A) and getKey(B) in O(1)?

I realize this could be done with two HashMaps (A,B) and (B,A) that are maintained to contain the same relation, but I feel there should be one data structure that handles that without having to do it "manually".

like image 336
G. Bach Avatar asked Jun 22 '12 19:06

G. Bach


1 Answers

I don't think you'll do better than two HashMaps. Writing the wrapper interface is very simple:

class OneToOneMap<Key, Value> {

    public void add(Key k, Value v) {
        if (!keyToVal_.contains(k) && !valToKey_.contains(v)) {
            keyToVal_.add(k, v);
            valToKey_.add(v, k);
        }
    }

    private HashMap<K, V> keyToVal_;
    private HashMap<V, K> valToKey_;
}

I am not sure if this is valid Java, but you get the idea.

like image 181
japreiss Avatar answered Sep 19 '22 08:09

japreiss