Re: Re: Counting Runs

• To: mathgroup at smc.vnet.net
• Subject: [mg51995] Re: [mg51934] Re: [mg51890] Counting Runs
• From: János <janos.lobb at yale.edu>
• Date: Sat, 6 Nov 2004 02:08:47 -0500 (EST)
• References: <200411040650.BAA18131@smc.vnet.net> <200411050717.CAA06890@smc.vnet.net> <opsg0lmi1fiz9bcq@monster.cox-internet.com> <opsg0pe8woiz9bcq@monster.cox-internet.com>
• Sender: owner-wri-mathgroup at wolfram.com

It must be machine or OS dependent.

I re-discovered Hanlon3 method :) and  ran it with Bobby's newest.  I
don't have Bobby's data so I generated random didgits in the 0-9 range

Here are the results:

In[28]:=
v = Table[Random[Integer,
{0, 9}], {i, 1, 10^7}];

In[29]:=
Timing[({First[#1],
Length[#1]} & ) /@
Split[Sort[First /@
Split[v]]]]
Out[29]=
{35.58*Second, {{0, 898901},
{1, 899397}, {2, 901191},
{3, 899449}, {4, 900824},
{5, 900262}, {6, 899338},
{7, 900293}, {8, 900196},
{9, 901311}}}

In[32]:=
Timing[({First[#1],
Length[#1]} & ) /@
Split[Sort[Split[v][[All,
1]]]]]
Out[32]=
{38.67999999999998*Second,
{{0, 898901}, {1, 899397},
{2, 901191}, {3, 899449},
{4, 900824}, {5, 900262},
{6, 899338}, {7, 900293},
{8, 900196}, {9, 901311}}}

My machine is a 1.25Ghz G4 with 2G Ram and with OSX 10.3.5.

János
On Nov 5, 2004, at 7:38 PM, DrBob wrote:

> I found an even faster (rather obvious) solution:
>
> hanlonTreat[v_] := {First@#, Length@#} & /@ Split@Sort[Split[v][[All,
> 1]]]
>
> It about 80% faster than hanlon4.
>
> Bobby
>
> On Fri, 05 Nov 2004 17:16:56 -0600, DrBob <drbob at bigfoot.com> wrote:
>
>> I timed the posted methods except Andrzej's -- it's the only one that
>> works only for +1/-1 data -- plus a couple of my own that I haven't
>> posted. David Park's method seems the same as the fastest method,
>> hanlon3. I modified all methods to return a pair {x, number of runs
>> in x} for each x in the data.
>>
>> Two of Bob Hanlon's methods beat all the rest of us -- but one of his
>> is the slowest method, too.
>>
>> I've posted a notebook at the Run Counts link at:
>>
>> http://eclecticdreams.net/DrBob/mathematica.htm
>>
>> Bobby
>>
>> On Fri, 5 Nov 2004 02:17:54 -0500 (EST), Selwyn Hollis
>>
>>> Hi Greg,
>>>
>>> The following seems to work pretty well:
>>>
>>>    runscount[lst_?VectorQ] :=
>>>      Module[{elems, flips, counts},
>>>        elems = Union[lst];
>>>        flips = Cases[Partition[lst, 2, 1], {x_, y_} /; x =!= y];
>>>        counts = {#, Count[Most[flips], {#, _}]} & /@ elems;
>>>        {x1, x2} = Last[flips];
>>>        counts /. {{x1, y_} -> {x1, y+1}, {x2, y_} -> {x2, y+1}}]
>>>
>>> Example:
>>>
>>>   Table[Random[Integer, {1, 5}], {20}]
>>>   runscount[%]
>>>
>>>       {2, 2, 3, 1, 3, 2, 2, 3, 1, 1, 2, 3, 1, 1, 3, 1, 1, 2, 2, 2}
>>>
>>>       {{1, 4}, {2, 4}, {3, 5}}
>>>
>>>
>>> -----
>>> Selwyn Hollis
>>> http://www.appliedsymbols.com
>>>
>>>
>>> On Nov 4, 2004, at 1:50 AM, Gregory Lypny wrote:
>>>
>>>> Looking for an elegant way to count runs to numbers in a series.
>>>> Suppose I have a list of ones and negative ones such as
>>>> 	v={1,1,1,-1,1,1,1,1,1,-1,-1,-1,-1,1}.
>>>> I'd like to create a function that counts the number of runs of 1s
>>>> and
>>>> -1s, which in this case is 3 and 2.
>>>>
>>>> 	Greg
>>>>
>>>>
>>>
>>>
>>>
>>>
>>
>>
>>
>
>
>
> --
> DrBob at bigfoot.com
> www.eclecticdreams.net
>
>

-------------------------------------------------------------------
János Löbb
Yale University School of Medicine
Department of Pathology
Phone: 203-737-5204
Fax:      203-785-7303
E-mail: janos.lobb at yale.edu

• Prev by Date: Re: Re: Problems about Graphics
• Next by Date: Re: Re: Counting Runs
• Previous by thread: Re: Re: Counting Runs
• Next by thread: Re: Re: Counting Runs