Re: Re: Re: Counting Runs
- To: mathgroup at smc.vnet.net
- Subject: [mg52013] Re: [mg52000] Re: [mg51934] Re: [mg51890] Counting Runs
- From: Andrzej Kozlowski <akoz at mimuw.edu.pl>
- Date: Sun, 7 Nov 2004 01:03:33 -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> <200411060709.CAA26082@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
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 >
- References:
- Counting Runs
- From: Gregory Lypny <gregory.lypny@videotron.ca>
- Re: Counting Runs
- From: Selwyn Hollis <sh2.7183@misspelled.erthlink.net>
- Re: Re: Counting Runs
- From: DrBob <drbob@bigfoot.com>
- Counting Runs