What is the time complexity of this nifty function 'assoc'?
+6
A:
I would assume that assoc is O(n)*, assuming that equal? is O(1) in your usage of the function. This is because it's trivial to write your own version of assoc:
(define (my-assoc v lst)
(cond ((null? lst) #f)
((equal? v (caar lst)) (car lst))
(else (my-assoc v (cdr lst)))))
You can see this simply slides down the list lst until a match is found. If none is found, #f is returned.
* technically equal? is O(n) where n is the size of the smaller input, so if you're comparing huge list structures using assoc, your runtime will be O(n*m) where n is the size of the list provided to assoc and m is the size of v.
Kyle Cronin
2009-06-23 21:27:03
To nitpick, m is the smaller of either the size of v or the average actual key size in the association list.
Svante
2009-06-23 22:31:11
@Svante: true, but worst case is that v is smaller than every key in the assoc list, so it still holds
Kyle Cronin
2009-06-23 22:49:50