[Date Index]
[Thread Index]
[Author Index]
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**
| |