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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| public boolean hasPrevious() { [...already done at least once logic...] int localIndex = searchIndex; searchIndex = 0; int tmp, tmp2 = -1;
while (hasNext()) { tmp = next(); if ((tmp + 1) < localIndex) { tmp2 = tmp; } else { break; } }
if (tmp2 == -1) { searchIndex = localIndex; return false; } else { lastFound = tmp2; return true; } } |

(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?