Services & Resources / Wolfram Forums
-----
 /
MathGroup Archive
2004
*January
*February
*March
*April
*May
*June
*July
*August
*September
*October
*November
*December
*Archive Index
*Ask about this page
*Print this page
*Give us feedback
*Sign up for the Wolfram Insider

MathGroup Archive 2004

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: Re: Counting Runs

  • To: mathgroup at smc.vnet.net
  • Subject: [mg51998] Re: [mg51934] Re: [mg51890] Counting Runs
  • From: DrBob <drbob at bigfoot.com>
  • Date: Sat, 6 Nov 2004 02:08:59 -0500 (EST)
  • References: <200411040650.BAA18131@smc.vnet.net> <200411050717.CAA06890@smc.vnet.net> <opsg0lmi1fiz9bcq@monster.cox-internet.com> <opsg0pe8woiz9bcq@monster.cox-internet.com> <D9733954-2F93-11D9-85F1-000A95ED10EE@yale.edu>
  • Reply-to: drbob at bigfoot.com
  • Sender: owner-wri-mathgroup at wolfram.com

And the new winner -- for both speed and simplicity -- is:

brt4[v_List] := Frequencies@Split[v][[All, 1]]

It returns each pair in opposite order to the other methods, but that's not a significant drawback, I don't think.

Bobby

On Fri, 5 Nov 2004 20:33:23 -0500, János <janos.lobb at yale.edu> wrote:

> 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
>>> <sh2.7183 at misspelled.erthlink.net> wrote:
>>>
>>>> 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
>>>> (edit reply-to to reply)
>>>>
>>>>
>>>> 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
>
>
>
>



-- 
DrBob at bigfoot.com
www.eclecticdreams.net


  • Prev by Date: Re: Re: Counting Runs
  • Next by Date: Re: Re: Counting Runs
  • Previous by thread: Re: Re: Counting Runs
  • Next by thread: Re: Re: Counting Runs