tags:

views:

132

answers:

1

What is the time complexity of count in clojure?

+11  A: 

Here's the implementation:

public static int count(Object o){
        if(o == null)
                return 0;
        else if(o instanceof Counted)
                return ((Counted) o).count();
        else if(o instanceof IPersistentCollection) {
                ISeq s = seq(o);
                o = null;
                int i = 0;
                for(; s != null; s = s.next()) {
                        if(s instanceof Counted)
                                return i + s.count();
                        i++;
                }
                return i;
        }
        else if(o instanceof String)
                return ((String) o).length();
        else if(o instanceof Collection)
                return ((Collection) o).size();
        else if(o instanceof Map)
                return ((Map) o).size();
        else if(o.getClass().isArray())
                return Array.getLength(o);

        throw new UnsupportedOperationException("count not supported on this type: " + o.getClass().getSimpleName());
}

So it's O(1) for arrays, strings, collections, maps and anything that implements Counted. It's O(n) for anything that implements IPersistentCollection, but not Counted.

sepp2k