找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1406|回复: 6

[求助]:随机排列数组的问题!

[复制链接]

已领礼包: 8121个

财富等级: 富甲天下

发表于 2007-1-18 17:43:16 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
例如有一个数组,元素可能有上百万个,现在要对这个数组的元素随机排列,就像洗牌那样。生成这样一个函数,以供调用。算法上最好能对空间和时间都有照顾!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 6个

财富等级: 恭喜发财

发表于 2007-1-20 20:42:47 | 显示全部楼层
这个难吗?
一新数组记为newlst
{
原数组记为lst , 数组长为记为n
在0~n-1间生成一随机数记为rnd
用rnd为索引取lst中的一个元素出来放入newlst
在lst中删除取出来的元素
}
重做以上{ }中的步骤直到lst中的元素被全转移到newlst中来
newlst就是所求,
对于你说的:算法上最好能对空间和时间都有照顾
偶知识有限不知道是什么为事呢?请详解

突然想到一新解法了

原表记为lst , 表长为记为n
随机生成n个数组成表rndlst
对rndlst用vl-sort-i排序后记为sortrndlst
再(mapcar 'nth sortrndlst lst)就是所求了
呵呵相信这个方法的效率非常之好!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 8121个

财富等级: 富甲天下

 楼主| 发表于 2007-1-21 15:31:16 | 显示全部楼层
最初由 fsxm 发布
[B]这个难吗?
一新数组记为newlst
{
原数组记为lst , 数组长为记为n
在0~n-1间生成一随机数记为rnd
用rnd为索引取lst中的一个元素出来放入newlst
在lst中删除取出来的元素
}
重做以上{ }中的步骤直到lst中的... [/B]

to fsxm:
    谢谢你提供的思路。
    你的第一个方法很好,但是对于第二个方法来说,你可能没有考虑到随机可能生成重复的数目的情况。
    我说的是算法上最好能对空间和时间都有照顾是指:
    1、lisp语言没有求随机数函数,如果要通过VB之类的调用的话,可能速度要慢不少,如果用autolisp编写随机函数,则要考虑不能效率太低。
    2、如果这个数组有一个百万级以上的元素的话,就不得不考虑在调用随机函数时候存储空间的问题了。
    无痕 斑竹在明经发了一个lisp程序,跟你的第一个思路有些类似。可以参阅。
http://www.mjtd.com/BBS/dispbbs. ... mp;star=2&page=
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 6个

财富等级: 恭喜发财

发表于 2007-1-21 17:05:46 | 显示全部楼层
我强烈认为第二方法才是最好的!也是最快的!
话不多说传上我写的:
[php]
(defun rndsortlst (lst / rndlst)
  (repeat (length lst)
    (setq rndlst (cons (rnd) rndlst))
  )
  (setq rndlst (vl-sort-i rndlst '>))
  (mapcar '(lambda (a) (nth a lst)) rndlst)
)
调用语法:(rndsortlst lst) 如:(rndsortlst '(0 1  2 3 4 5 6 7 8 9))                ------fsxm2007/01/21
[/php]
rnd生成随机数函数请自己写~
下面我给出一个完整的函数包
里面也加上了rnd生成随机数函数和rndsortlst函数!
可以直接使用!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 2个

财富等级: 恭喜发财

发表于 2007-1-22 08:44:38 | 显示全部楼层
最初由 fsxm 发布
[B]对于你说的:算法上最好能对空间和时间都有照顾
偶知识有限不知道是什么为事呢?请详解[/B]

<br>
关于空间与时间复杂度[/COLOR]的解释,参见杨富贵老师在《科幻世界》(2005.05期)卷首特辑中所说:
“计算机科学把完成某个任务(比如搜索)的算法执行所需要的时间量级称为时间复杂度;而把这个算法在运行中数据结构和所需要额外占用的空间的量度,称为空间复杂度。对一个任务,找到空间复杂度和时间复杂度都很小的算法,正是计算机科学家的任务之一。”[/FONT]

这里有全文,可供欣赏:
http://zml84.blog.sohu.com/27261124.html
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 8121个

财富等级: 富甲天下

 楼主| 发表于 2007-1-22 12:51:46 | 显示全部楼层
最初由 fsxm 发布
[B]我强烈认为第二方法才是最好的!也是最快的!
话不多说传上我写的:
[php]
(defun rndsortlst (lst / rndlst)
  (repeat (length lst)
    (setq rndlst (cons (rnd) rndlst))
  )
  (setq rndlst (vl-sort-i... [/B]


的确比无痕的快,谢谢fsxm!但还没明白怎么回事,不知能否把那个rnd函数的源码贴上来呢?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2007-1-23 00:21:39 | 显示全部楼层
;; 试试这个

  1. (defun C:TT2 (/ ETIME LST N STIME X)
  2.   (setq        N   0
  3.         LST NIL
  4.   )
  5.   (repeat 10000
  6.     (setq LST (cons (setq N (1+ N)) LST))
  7.   )
  8.   (setq STIME (getvar "date"))
  9.   ;(setq LST (mapcar '(lambda (X) (nth X LST)) (rndsi (length lst))))
  10.   (setq lst(rndlst lst))
  11.   (setq ETIME (getvar "date"))
  12.   (prompt
  13.     (strcat
  14.       "\n程式共耗用時間: "
  15.       (rtos (* 86400.0 (- (- ETIME STIME) (fix (- ETIME STIME))))
  16.             2
  17.             3
  18.       )
  19.       "秒\n"
  20.     )
  21.   )
  22.   LST
  23. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-5-24 06:47 , Processed in 0.407252 second(s), 44 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表