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.