Re: Re: List complement operator
- To: mathgroup at smc.vnet.net
- Subject: [mg85047] Re: [mg85032] Re: List complement operator
- From: János <janos.lobb at yale.edu>
- Date: Fri, 25 Jan 2008 05:05:08 -0500 (EST)
- References: <fn1ndi$97t$1@smc.vnet.net> <fn21s3$irs$1@smc.vnet.net> <200801240949.EAA15085@smc.vnet.net>
On Jan 24, 2008, at 4:49 AM, zac wrote:
> Thanks for all who replied.
>
> I've got several alternatives now, and would like to publish testing
> results, perhaps some of you are interested in them too. (I've made
> some modifications to the functions, like formatting the output to the
> desired format, etc.)
>
> (* Szabolcs *)
> f1[a_List, b_List] :=
> Join @@ (Table[#1, {#2}] & @@@
> Transpose@
> With[{u = Union[a, b]}, {u,
> Last /@ Sort@Tally@Join[a, u] -
> Last /@ Sort@Tally@Join[b, u]}]);
>
> (* Bob *)
> f2[a_List, b_List] :=
> Fold[Delete[#1, Position[#1, #2][[1, 1]]] &, a,
> Fold[DeleteCases[#1, #2] &, b, Complement[a, b]]];
>
> (* Daniel *)
> f3[a_List, b_List] := Module[{t},
> t = Join @@ (Split@Sort[#] & /@ {a, b});
> t = t /. x1 : {x_ ..} :> {x, Length[x1]};
> t = t //. {x1___, {x2_, x3_}, x4___, {x2_, x5_},
> x6___} :> {x1, {x2, x3 - x5}, x4, x6};
> Flatten@(Table[#[[1]], {#[[2]]}] & /@ Select[t, #[[2]] > 0 &])
> ];
>
> (* own *)
> f4[a_List, b__List] := Module[{tmp = a, pos},
> Scan[If[(pos = Position[tmp, #, 1, 1]) =!= {},
> tmp = Delete[tmp, pos[[1, 1]]]] &, Join[b]]; tmp];
>
>
> Results:
> 1. With test data:
>
> a = RDI[10] & /@ Range[1000];
> b = RDI[10] & /@ Range[1000];
>
> all functions return the same results (if sorted) except Bob's Fold-
> code, which fails. Since I don't have much time, and - to be honest -
> I could not understand fully his function, I did not try to solve the
> error.
> 2. Only the last function f4 returns the complement list in an
> unsorted way. This was not necessary, as I've stated it previously,
> although I'm interested in the way it can be made more efficient
> (because at the moment this piece of code labeled (* own *) is
> extremely sluggish)
> 3. Time results using test data:
>
> a = RDI[10] & /@ Range[1000000];
> b = RDI[10] & /@ Range[1000000];
>
> f1: 1.98sec
> f2: not tested due to some error
> f3: 1.125sec
> f4: more than 10 minutes
>
> Results speak for themselves. Both Szabolcs's and Daniel's code are
> very efficient, but sort data. Function f4 does not sort output, but
> is not usable for larger lists. Can anyone come up with an unsorted
> version of this list complement function?
>
> Thanks again for the suggestions and codes!
> Istvan
>
>
Istv=E1n,
Here is a plain algorithmic newbie approach that keeps the order
In[83]:=
While[Length[b] > 0,
b1 = First[b];
If[MemberQ[a, b1],
a = DeleteCases[a, b1, 2,
1], Null];
b = Rest[b]; ]
Print[a];
=46rom In[83]:=
{1, 1, 3, 5, 5, 5, 6, 7}
I am on 5.2, so I do not have RDI to check for speed. with toy data
it is {0.00033 Second, Null} on a G5.
Best,
J=E1nos
----------------------------------------------
Trying to argue with a politician is like lifting up the head of a
corpse.
(S. Lem: His Master Voice)
- References:
- Re: List complement operator
- From: zac <replicatorzed@gmail.com>
- Re: List complement operator