Re: Complement replacement
- To: mathgroup at smc.vnet.net
- Subject: [mg58624] Re: Complement replacement
- From: Jean-Marc Gulliet <jeanmarc.gulliet at gmail.com>
- Date: Sun, 10 Jul 2005 16:51:46 -0400 (EDT)
- Organization: The Open University, Milton Keynes, England
- References: <daqosi$6d8$1@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
konstantpi at mail15.com wrote:
> hi
> in the list:
> pp=Table[Random[Integer, {1, 1000}], {i, 1000}];
> how could i know which numbers from 1 to 1000 does not exist in the
> pp List.
> but without using:
> Complement[Table[i,{i,1000}],pp]
> regards
>
Hello,
I am not sure to understand why you would not like to use such an
efficient function as *Complement* to solve your problem (homework
assignment perhaps?); anyway rather than a functional approach such as
In[1]:=
pp = Table[Random[Integer, {1, 10}], {i, 10}]
Out[1]=
{9, 1, 8, 4, 7, 2, 8, 3, 10, 8}
In[2]:=
Complement[Range[10], pp]
Out[2]=
{5, 6}
you could use a procedural design for instance
In[3]:=
res = {};
i = 1;
While[i <= Length[pp], j = 1; notInPP = True;
While[j <= Length[pp] && notInPP == True,
If[i == pp[[j]], notInPP = False]; j++; ]*
If[notInPP == True, AppendTo[res, i]]; i++; ]
res
Out[6]=
{5, 6}
Now if you are looking for speed of execution (and also of coding), the
functional approach is definitely better and much much faster. For example,
In[7]:=
pp = Table[Random[Integer, {1, 1000}], {i, 1000}];
In[8]:=
Timing[Complement[Range[Length[pp]], pp]; ]
Out[8]=
{0.*Second, Null}
In[9]:=
Timing[res = {}; i = 1; While[i <= Length[pp],
j = 1; notInPP = True;
While[j <= Length[pp] && notInPP == True,
If[i == pp[[j]], notInPP = False]; j++; ]*
If[notInPP == True, AppendTo[res, i]]; i++; ]*
res; ]
Out[9]=
{4.141*Second, Null}
and here with a code slightly optimized (we sort the list pp and discard
any duplicates before the main loop and also we use the functions *Reap*
and *Sow* rather than *AppendTo*)
In[10]:=
Timing[i = 1; pp = Union[pp];
Reap[While[i <= 1000, j = 1; notInPP = True;
While[j <= Length[pp] && notInPP == True,
If[i == pp[[j]], notInPP = False]; j++; ]*
If[notInPP == True, Sow[i]]; i++; ]]; ]
Out[10]=
{2.8120000000000003*Second, Null}
In[11]:=
$Version
Out[11]=
"5.1 for Microsoft Windows (January 27, 2005)"
Hope this helps,
/J.M.