Faster Space-Efficient Algorithms for Subset Sum, K-Sum and Related Problems
arxiv.org
arxiv.org
I believe this top line result will mostly be of interest to Computer Scientists, as a practical matter these problems are rarely solved exactly because even the fast algorithms are far too slow for non-trivial problem sizes.
However, this part regarding the "list disjointment problem" may be of wider interest:
"Underlying these results is an algorithm that determines whether two given lists of length n with integers bounded by a polynomial in n share a common value. Assuming random read-only access to random bits, we show that this problem can be solved using O(log n) space significantly faster than the trivial O(n^2) time algorithm if no value occurs too often in the same list."
N.B. The HN parser won't let me use stars, so read star for each of the dollar signs in the first paragraph.
The rules say
> Text surrounded by asterisks is italicized, if the character after the first asterisk isn't whitespace.
But apparently noen of the zero-width spaces are not counted as whitespace.
The previous best was O(2^(n/2)) time and O(2^(n/4)) space, which they improve to O*(2^(0.86n)) time and polynomial space.
EDIT: I just noticed the space/polynomial space distinction, so I guess that's the improvement, but I don't know what that means.
I'm not a practical programmer, so I may be off base, but it seems to me that one could as well say "You can always buy more memory, but if the answer takes more time than you have to wait then you're out of luck." (In both cases, super-rapid growth won't take too long to exhaust the age, and the information capacity, of the universe.) Is it really clear that it's better to err on the side of more time in the time / space trade-off?
Space is how much memory you need to run it.
Frequently in operations there is a tradeoff between time and space. The classic example being that saving previous results in a lookup table requires more space but saves time because you eliminate repeat calculations.
We already had O(2^n) time with O(n) space, or O(2^(n/2)) time with O(2^(n/4)) space. This algorithm represents a new tradeoff between those two points.
Note that these are all worst case scenarios. In practice for sets of modest sized integers, subset sum is solvable in reasonable time and space. See https://en.wikipedia.org/wiki/Subset_sum_problem#Pseudo-poly... for details.
As another illustrative example, if you allow unbounded fan-in and an exponential number of AND/OR gates, you can solve any monotone boolean function in two steps (you just take the DNF of a positive input and turn it into a circuit). This means that if you're willing to use an unbounded amount of space (chip area, in this case), you can simulate things like k-clique for any fixed k < n in two steps. As a result, essentially all circuit lower bound results either restrict fanin (to 2, generally) or restrict you to polynomial chip area.
Moreover, you can encode any monotone boolean function of n inputs in O(lg(Dedekind(n))) bits as long as you have an auxiliary array of size O(Dedekind(n)), which you can look up answers in in constant time. So you can compress boolean functions pretty well (about 5x more than the naive bit lookup solution for n=32), but Dedekind(n) grows so fast that nobody would ever actually try to implement this.
I have lots more examples, if you want them :P Exponential space algorithms are almost totally useless in nearly all cases (with the exception of those that only rarely take exponential space).