MathGroup Archive 2006

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

Search the Archive

Speed challenge: Improve on integer frequencies from Count?

  • To: mathgroup at smc.vnet.net
  • Subject: [mg67739] Speed challenge: Improve on integer frequencies from Count?
  • From: Gareth Russell <russell at njit.edu>
  • Date: Thu, 6 Jul 2006 06:52:41 -0400 (EDT)
  • Sender: owner-wri-mathgroup at wolfram.com

Hi,

A challenge for the efficiency gurus:

Given a list of integers whose possible values lie in the range 0 to 
maxInt, with any given integer represented 0, 1 or multiple times, 
e.g., what you would get from

Table[Random[Integer, {0, maxInt}], {1000}]

create a list of frequencies of values including ALL possible values 
(i.e., not the basic output of Frequencies[], because that only 
includes values present in the list.

The fastest I have been able to come up with is the obvious use of Count[]...

In[256]:=
myFrequencies=Compile[{{myList,_Integer,1},{
    maxInt,_Integer}},Table[Count[myList,i],{i,0,maxInt}]]

Out[256]=
CompiledFunction[{myList,maxInt},Table[Count[myList,i],{i,0,maxInt}],-\
CompiledCode-]

In[278]:=
testList=Table[Random[Integer,{0,500}],{1000}];

In[281]:=
Timing[Do[myFrequencies[testList,500];,{1000}]]

Out[281]=
{2.3103 Second,Null}

However, it seems to me that this should be able to be improved upon, 
because it scans the whole list maxInt times. One should be able to 
scan the list once, and increment a frequency list in the right places, 
perhaps with a For[] loop. But try as I might, I can't come up with a 
version that is faster than the compiled Count[] version above.

Can anyone do it?

Gareth

-- 
Gareth Russell
NJIT


  • Prev by Date: Re: Re: finite differencing of a PDE system
  • Next by Date: Re: Re: finite differencing of a PDE system
  • Previous by thread: Re: Repost --- Another limit problem
  • Next by thread: Re: Speed challenge: Improve on integer frequencies from Count?