Re: Re: Re: list manipulation
- To: mathgroup at smc.vnet.net
- Subject: [mg20688] Re: [mg20614] Re: [mg20601] Re: list manipulation
- From: "Allan Hayes" <hay at haystack.demon.co.uk>
- Date: Sun, 7 Nov 1999 02:10:18 -0500
- References: <199911020735.CAA26984@smc.vnet.net.> <199911040713.CAA02648@smc.vnet.net.> <3822F4DD.4A5EA11A@gsmail01.darmstadt.dsh.de>
- Sender: owner-wri-mathgroup at wolfram.com
Hartmut,
We can speed things up by avoiding AppendTo and constructing "linked lists"
{}, {{},1}, {{{},1},2}, {{{{},1},2},3}, ......... {.,n}
To be flattend to {1,2,......,n} at the end.
This is a generally applicable trick.
A slight extra speedup come from accumulatig positions instead of elements.
The timings on my machine for the case of 10000 events comes down from
70.52 Second for your function
to 5.33 Second, 5.16 Second and 4.94 Second
in the variants below.
***** Your Test Data *****
Function[{n},
gapsX[n] =
Module[{kappa = 250./n},
Table[With[{c = Random[Real, {0., 100.}],
d = kappa Exp[-Random[Real, {0., 10.}]]}, {c - d,
c + d}], {n}]];
{Timing[truegapsX[n] =
Interval @@
gapsX[n];]\[LeftDoubleBracket]1\[RightDoubleBracket],
Length[truegapsX[n]]}] /@ {100, 300, 1000, 3000, 10000}
{{0. Second, 62}, {0.11 Second, 178}, {0.55 Second, 582}, {6.75 Second,
1821}, {91.34 Second, 6006}}
Function[{n}, events[n] = Table[Random[Real, 100.], {n}];] /@ {100, 300,
1000,
3000, 10000};
********* Helmut Wolf ********
(Function[n, ((Print[#1]; #1) & )[
Timing[ss[n] = Module[{selected = {}, t = 1},
With[{tmax = Length[events[n]],
events = Sort[events[n]], gaps =
truegapsX[n]},
Do[While[t <= tmax && events[[t]] < gaps[[i,
1]], AppendTo[selected, events[[
t++]]]]; While[t <= tmax && events[[
t]] <= gaps[[i,2]], t++],
{i, 1, Length[gaps]}]; Join[selected,
Take[events, {t, tmax}]]]]; ][[1]]]]) /@
{100, 300, 1000, 3000, 10000}
0.06 Second
0.38 Second
0.93 Second
5.94 Second
70.52 Second
{0.06 Second, 0.38 Second, 0.93 Second, 5.94 Second, 70.52 Second}
****** Allan Hayes variants *********
** Using linked lists
(Function[n, ((Print[#1]; #1) & )[
Timing[ss1[n] = Module[{selected = {}, t = 1},
With[{tmax = Length[events[n]],
events = Sort[events[n]], gaps =
truegapsX[n]},
Do[While[t <= tmax && events[[t]] < gaps[[i,
1]], selected = {selected, events[[
t++]]}]; While[t <= tmax && events[[
t]] <= gaps[[i,2]], t++],
{i, 1, Length[gaps]}]; Join[Flatten[
selected], Take[events, {t, tmax}]]]]; ][[
1]]]]) /@ {100, 300, 1000, 3000, 10000}
0.06 Second
0.38 Second
0.55 Second
1.65 Second
5.33 Second
{0.06 Second, 0.38 Second, 0.55 Second, 1.65 Second, 5.33 Second}
** Linked Lists and accumulating positions
(Function[n, ((Print[#1]; #1) & )[
Timing[ss2[n] = Module[{selected = {}, t = 1},
With[{tmax = Length[events[n]],
events = Sort[events[n]], gaps =
truegapsX[n]},
Do[While[t <= tmax && events[[t]] < gaps[[i,
1]], selected = {selected, t}; t++];
While[t <= tmax && events[[t]] <= gaps[[i,
2]], t++], {i, 1, Length[gaps]}];
Join[events[[Flatten[selected]]],
Take[events, {t, tmax}]]]]; ][[1]]]]) /@
{100, 300, 1000, 3000, 10000}
0.05 Second
0.39 Second
0.44 Second
1.7 Second
5.16 Second
{0.05 Second, 0.39 Second, 0.44 Second, 1.7 Second, 5.16 Second}
** Linked lists and working backwards - start with full bag and find
positions of unwanted elements
(Function[n, ((Print[#1]; #1) & )[
Timing[ss3[n] = Module[{t = Length[events[n]],
se = Sort[events[n]], gaps = truegapsX[n],
bag = {}},
Do[While[t > 0 && se[[t]] > gaps[[i,2]], --t];
While[t > 0 && se[[t]] >= gaps[[i,1]],
bag = {bag, t}; --t], {i, Length[gaps], 1,
-1}]; Delete[se, List /@ Flatten[bag]]]][[
1]]]]) /@ {100, 300, 1000, 3000, 10000}
0.05 Second
0.33 Second
0.6 Second
1.6 Second
4.94 Second
{0.05 Second, 0.33 Second, 0.6 Second, 1.6 Second, 4.94 Second}
********* Check Correctness ***********
ss[100] === ss1[100] === ss2[100] === ss3[100]
True
ss[300] === ss1[300] === ss2[300] === ss3[300]
True
ss[1000] === ss1[1000] === ss2[1000] === ss3[1000]
True
ss[3000] === ss1[3000] === ss2[3000] === ss3[3000]
True
ss[10000] === ss1[10000] === ss2[10000] === ss3[10000]
True
Allan
---------------------
Allan Hayes
Mathematica Training and Consulting
Leicester UK
www.haystack.demon.co.uk
hay at haystack.demon.co.uk
Voice: +44 (0)116 271 4198
Fax: +44 (0)870 164 0565
- Follow-Ups:
- Re: Re: Re: Re: list manipulation
- From: Daniel Lichtblau <danl@wolfram.com>
- Re: Re: Re: Re: list manipulation
- References:
- Re: list manipulation
- From: "jim leddon" <jleddon@home.com>
- Re: Re: list manipulation
- From: "Wolf, Hartmut" <hwolf@debis.com>
- Re: list manipulation