I’ve got this… iterator class. It’s type doesn’t really matter (it’s a document find iterator)
Anyway, it’s logic is implemented using hasNext() as the code that actually calculates the new index… and it’s hasPrevious() is:
public boolean hasPrevious() {
[...already done at least once logic...]
//lame O(n) backward search
//TODO please memoize this
int localIndex = searchIndex;
searchIndex = 0;
int tmp, tmp2 = -1;
while (hasNext()) {
tmp = next();
if ((tmp + 1) < localIndex) {
tmp2 = tmp;
} else {
break;
}
}
if (tmp2 == -1) {
//revert the index if found nothing.
searchIndex = localIndex;
return false;
} else {
//prepare for previous (next() clobbered lastFoundLocation)
lastFound = tmp2;
return true;
}
}
:persecutioncomplex: (so embarrassed)
Anyway since the underlying search algorithms don’t support backwards searching, memoization is the obvious answer to this problem, although it would introduce stale cache issues.
I don’t have much experience with memoization - what do you think it’s the best policy: to expand the table (much harder it looks like) or just null it and let it be reconstructed from scratch?