How to get the difference between two lists?

Dick Kriesel dick.kriesel at mail.com
Mon Apr 4 03:31:55 EDT 2005


On 4/3/05 7:49 PM, "Richard Gaskin" <ambassador at fourthworld.com> wrote:
> 
> With 10,000 lines in my main list and 5,000 lines in my exclude list, it
> takes only 25 milliseconds to use this on my single-processor PBG4 1MHz:
> 
> 
> function ShortList pList, pExcludelist
>    repeat for each line tLine in pList
>      if tLine is not among the lines of pExcludeList then
>        put tLine & cr after tNulist
>      end if
>    end repeat
>    delete last char of tNuList
>    return tNuList
> end ShortList

Wow, that's fast.  So I decided to compare it to an implementation of Dar's
second suggestion, which I've been using for a long time. The test I tried
yields times very different from Richard's.  Even though my machine is a
dual 2 GHz G5, function "Shortlist" took almost a hundred times longer than
Richard reported.  I wonder why the times are so different.

But the other function ran almost 70 times faster than function "Shortlist."

Here are the other function, the "test" handler, and the test results:

function difference pList1,pList2
  split pList1 with return and tab
  repeat for each line tLine in pList2
    delete variable pList1[tLine]
  end repeat
  return the keys of pList1
end difference
---------------------
on test
  repeat with i = 3 to 30000 step 3 -- 10000 multiples of 3
    put i & cr after tBig
  end repeat
  delete last char of tBig
  put "number of lines in tBig:" && number of lines in tBig & cr
  
  repeat with i = 2 to 10000 step 2 -- 5000 multiples of 2
    put i & cr after tLittle
  end repeat
  delete last char of tLittle
  put "number of lines in tLittle:" && number of lines in tLittle \
      & cr after msg
  
  put the milliseconds into tBefore
  put shortList(tBig,tLittle) into tDiff1
  put the milliseconds into tAfter
  put "elapsed milliseconds for Shortlist:" && (tAfter - tBefore) \
      & cr after msg
  
  put the milliseconds into tBefore
  put difference(tBig,tLittle) into tDiff2
  put the milliseconds into tAfter
  put "elapsed milliseconds for difference:" && (tAfter - tBefore) \
      & cr after msg
  
  sort tDiff2 numeric
  put "matching results:" && (tDiff1 = tDiff2) & cr after msg
end test
---------------------
number of lines in tBig: 10000
number of lines in tLittle: 5000
elapsed milliseconds for Shortlist: 2423
elapsed milliseconds for difference: 35
matching results: true








More information about the use-livecode mailing list