Um..... I take it you have not covered hashes yet. It results in a variable efficency which only if the hashtable is 100% full will it reach O(n) in some cases (statistically unlikly), otherwise it is a lot less.
/facepalm.
Actually I'm right and you're wrong. You don't seem to understand how hashing works.
A hashtable is a large array. A hashfunction returns an integer which serves as the index to the array. When a collision occurs (that can be as soon as you have 2 elements, you don't need a full hashtable AT ALL), your efficiency drops to O(n) because you have to search an array. With linear probing, you must search each index after the index that corresponds to the hashed value, resulting in O(n). With separate chaining, each index points to a list. Only when 2 or more elements share the same index, the list must be searched resulting in efficiency drop. With both methods you can easily have your efficiency drop a lot without even having filled 10% of your table, if you're unlucky.
The more elements in the hashtable, the larger the chance a collision occurs. Therefor, every hashtable I have ever seen automatically resizes when it's filled for about 50%.
In fact, probing probably causes more collisions to occur than separate chaining.
In separate chaining, collisions only happen with elements that share the same hash.
In probing, collisions happen with elements that share the same hash but ALSO with elements that have a hash resulting in an index that is already used by another element.
If you claim efficiency only drops when the table is completely used, you must be on crack or you just don't know how it works at all.
Oh, and hashtables don't use an array of 32kb. Like I said: before you make some claims, go find me some proof. Test it, perhaps.