Mathematica 9 is now available
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: Re: Counting Runs


Here is another method,; not as fast as some of the others but quite 
amusing. In TraditionalForm the form of the answer is pleasanlty 
compact:

Times @@ (HoldForm /@ Split[v][[All, 1]])

Andrzej


On 6 Nov 2004, at 16:09, DrBob wrote:

> *This message was transferred with a trial version of CommuniGate(tm) 
> Pro*
> I've updated my notebook again, under the Run Counts link at:
>
> http://eclecticdreams.net/DrBob/mathematica.htm
>
> I'm not sure whether solver performance depends mostly on the number 
> of runs, or the number of different values in a data list. The two are 
> somewhat inversely related, of course.
>
> The fastest solvers are brt4 (using Frequencies) and hanlonTreat 
> (hanlon3, with Part instead of Map).
>
> 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: MathGroup /: Descriptive headings
  • Next by Date: Re: Zero divided by a number...
  • Previous by thread: Re: Re: Counting Runs
  • Next by thread: Re: Counting Runs