home *** CD-ROM | disk | FTP | other *** search
- Path: sparky!uunet!cs.utexas.edu!sdd.hp.com!hplabs!ucbvax!UX1.CSO.UIUC.EDU!gaylord
- From: gaylord@UX1.CSO.UIUC.EDU
- Newsgroups: sci.math.symbolic
- Subject: translating the APL 'deal' function into M recursively, procedurally and
- functionally - one-liners are faster
- Message-ID: <199208201030.AA04285@ux1.cso.uiuc.edu>
- Date: 20 Aug 92 10:30:31 GMT
- Sender: daemon@ucbvax.BERKELEY.EDU
- Lines: 64
-
- on p.200 in nancy blachman's book, an exercise (#11.4) is given to
- translate the APL function 'deal' which randomly selects elements from a
- list without replacement into M. it is recommended to do this recursively.
-
- from the manuscript of a text, another person has written the deal function
- in M both procedurally and as a recursive rewrite rule and found that the
- procedural program runs 4 times faster than the recursive program:
-
- it seems to me that the deal function is an obviously candidate for a
- one-liner: here it is:
-
- deal1[lis_List,n_Integer]
- :=Complement[lis,Nest[Delete[#,Random[Integer,{1,Length[#]}]]&,lis,n]]
-
- -----------------------------------------------
-
- to clarify what's going on here:
-
- SeedRandom[0]
- deal1[Range[9],4]
- {2, 5, 6, 7}
-
- we can look at the actual selection process using NestList
-
- SeedRandom[0]
- NestList[Delete[#,Random[Integer,{1,Length[#]}]]&,Range[9],4]
- {{1, 2, 3, 4, 5, 6, 7, 8, 9}, {1, 2, 3, 4, 5, 6, 8, 9},
-
- {1, 2, 3, 4, 5, 8, 9}, {1, 2, 3, 4, 8, 9},
-
- {1, 3, 4, 8, 9}}
-
- ---------------------------------------------
-
- i ran timing test on the recursive program[deal3], the procedural
- program[deal2] and the one-liner program[deal1] with the following results
-
- {Timing[deal1[Range[200],60];],
- Timing[deal2[Range[200],60];],
- Timing[deal3[Range[200],60];]}
- {{0.866667 Second, Null}, {1.01667 Second, Null}, {5.25 Second, Null}}
-
-
- $RecursionLimit = 1000;
-
-
- {Timing[deal1[Range[200],200];],
- Timing[deal2[Range[200],200];],
- Timing[deal3[Range[200],200];]}
- {{2.01667 Second, Null}, {2.78333 Second, Null}, {14.3667 Second, Null}}
-
- i can't say that the recursive or the procedural programs (which i did not
- write) are the best programs that can be written in those styles but i do
- think that the speed of the one-liner confirms the general view that the
- more compact the M program and and more built-in M functions that are used,
- the faster the code will run.
-
- richard j. gaylord, university of illinois, gaylord@ux1.cso.uiuc.edu
-
- "if you're not programming functionally, then you must be programming
- dysfunctionally"
-
-
-
-