[erlang-questions] How would you do 100 ifs?

Anthony Molinaro anthonym@REDACTED
Tue Nov 15 18:16:46 CET 2011


I had a similar problem where I had to do 10182857 ifs, which I solved with
and ordered set ets table.  I generate the table ahead of time since it can
take a while, and use ets:file2tab/1 to read it in quickly (takes about 5
minutes to generate but only a few seconds to load).

You use the start of your range as the key of the ets table, the value
is whatever you want, in your case you could use the top end of the range,
or the index.

To look thing up you then use something like

case ets:lookup (Tab, X) of
  [] ->
    case ets:lookup (Tab, ets:prev (Tab, X)) of
      [] -> out_of_range;
      V -> hd (V)
    end;
  V -> hd (V)
end

Even with the double lookups, its still very fast (< .2 millis per lookup).
Might be overkill for just 100 ifs but useful if you have 10 million.

-Anthony

PS. Thanks to Paul Mineiro and Ulf Wiger who I believe were the ones who
first turned me on to this technique.

On Tue, Nov 15, 2011 at 04:27:22PM +0300, Max Bourinov wrote:
> Hi guys,
> 
> I have a value X which is integer, and I have a list of ranges
> [0....200),[200....600),[600...1000)....etc....[100000, infinity] (this is
> just an example). We can assume that the list is static.
> 
> I have frequently check the index of the range X belongs to.
> 
> How would you implement it in Erlang?
> 
> Best regards,
> Max

> _______________________________________________
> erlang-questions mailing list
> erlang-questions@REDACTED
> http://erlang.org/mailman/listinfo/erlang-questions


-- 
------------------------------------------------------------------------
Anthony Molinaro                           <anthonym@REDACTED>



More information about the erlang-questions mailing list