Re:Re: Counting Runs
- To: mathgroup at smc.vnet.net
- Subject: [mg52212] Re:[mg52170] Re: Counting Runs
- From: "Fred Simons" <f.h.simons at tue.nl>
- Date: Sun, 14 Nov 2004 20:15:09 -0500 (EST)
- References: <200411130940.EAA01037@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
Dear Carl,
Yes, I remember the problem how to count how many 0's are followed by a 1.
Allan Hayes and you had some wonderful ideas how to solve that.
With respect to your question, it turns out that using 1-Abs[Sign[data-int]]
is slightly faster. But when we use Abs[Sign[data-int] and then count how
may 1's are followed by a 0 there is a considerable gain.
In[1]:=
runs[int_,data_]:=
Module[{modlist},modlist=Abs@Quotient[#,#+1,1]&@Abs[data-int];
Tr[BitXor[modlist,RotateRight[modlist]]]/2+BitAnd[modlist[[1]],modlist[[-1]]
]]
In[2]:=
runs1[int_,data_]:=Module[{modlist},modlist=1-Abs[Sign[data-int]];
Tr[BitXor[modlist,RotateRight[modlist]]]/2+BitAnd[modlist[[1]],modlist[[-1]]
]]
In[3]:=
runs2[int_,data_] :=
With[{lst=Abs[Sign[data-int]]},
Total[ BitXor[lst ,RotateLeft[lst]]]/2+
If[lst[[1]]\[Equal]1, 0,If[lst[[-1]]\[Equal]0, 1,0]] ]
In[4]:=
data=Table[Random[Integer,20], {2 10^7}];
In[5]:=
n=5;{Do[runs[3, data], {n}]// Timing, Do[runs1[3, data], {n}]// Timing,
Do[runs2[3, data], {n}]// Timing}
Out[5]=
{{7.516 Second,Null},{6.328 Second,Null},{4.109 Second,Null}}
Regards,
Fred Simons
Eindhoven University of Technology
- References:
- Challenge: Fastest method to convert positive integers to 1 in a long list
- From: "Carl K. Woll" <carlw@u.washington.edu>
- Challenge: Fastest method to convert positive integers to 1 in a long list