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