明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 4315|回复: 16

请教一下关于lisp表排序的问题。[求助]

  [复制链接]
发表于 2002-9-14 17:56:00 | 显示全部楼层 |阅读模式
本帖最后由 作者 于 2002-9-14 17:56:31 编辑

碰到个棘手的问题——我想构造一个顺序结构的表,不断有新的表项加入,然后和表里已有的表项比较,按照一定的关系排序。使最后这个表的子项是顺序排列的。
  始终找不到好的方法,我用了直接交换排序,但是在交换时老是出状况,:把 2 赋给temp,把 1 赋给 2 ,然后把 temp 赋给 1, 就这么简单的操作都完成不了——我用subst temp 1 时,结果1 和 2 都被替换了。   能不能指定替换第几项(而不是根据第几项的内容)? 还有,谁能告诉我有没有更好的排序的算法? 谢谢。
发表于 2002-9-14 21:48:00 | 显示全部楼层

不能用subst,可以把元素全部读出来处理,然后在重新构成表。

如果用Vlisp就简单了,有相关的函数,好像是Vl-sort。
发表于 2002-9-15 08:54:00 | 显示全部楼层

还是把您的表的格式说明白,这样无法讨论...

 楼主| 发表于 2002-9-15 18:58:00 | 显示全部楼层

就说说普通的表吧,不失问题的一般性。如下......

就像这样: (setq data (list x y)) (setq data (cons z data))
x、y 、z 都是赋值的数字,且x>y>z 现在加入z后,表data 为(z x y),现在就该交换排序了,得到表(x y z).  然后又加了一个m, (x>m>y) 然后就该得到表(x m y z) 如此继续。按照LL_J的办法,重新构造。当这个表很多项的时候,效率就低了。我想能不能利用链表指针来排序。不知LISP有没有指针这一说。
发表于 2002-9-16 08:14:00 | 显示全部楼层

这样做...

(VL-Sort 表 关系式)
对<表>的内容按照<关系式>的要求进行重新排序,返回新表。<表>中各项的数据类型应当相匹配。
例:(vl-sort '(1.5 2 4 66.4 3 1.5 0.78 1.5) '<)        返回:(0.78 1.5 1.5 1.5 2 3 4 66.4)                 
例:(SetQ newl (vl-sort '(("a" 2) ("b" 4) ("c" 3) ("d" 1))
                     (function (lambda (e1 e2) (< (cadr e1) (cadr e2))))
             )
)
返回:(("d" 1) ("a" 2) ("c" 3) ("b" 4))

摘自《Visual LISP 程序设计——技巧与范例》
发表于 2002-9-16 08:42:00 | 显示全部楼层

我认为:

我认为,list结构的底层实现应该本来就是一个双向链表,所以排序不会引起数据的移动,只是指针变化。反倒是nth之类的函数,效率比较低,因为会引起遍历
 楼主| 发表于 2002-9-16 12:48:00 | 显示全部楼层

VL- !!? 又是VISUAL!! 晕....看来一定要学学了。

 楼主| 发表于 2002-9-16 13:02:00 | 显示全部楼层

那该如何控制指针勒?给段代码吧,就一小段....ok?

发表于 2002-9-16 22:04:00 | 显示全部楼层

就是陈老师的那段啊。指针是内部实现。实际应用中可以考虑用quote模拟指针。

本帖最后由 作者 于 2002-9-16 22:04:11 编辑

比如,定义一个函数:swap
可以使用类似于C语言的指针返回参数,达到修改参数的目的。
;;; Swap
(defun Swap (_Swap_A _Swap_B / tmp)
  (setq tmp (eval _Swap_A))
  (set _Swap_A (eval _Swap_B))
  (set _Swap_B tmp)
  nil
)

测试:

Command: (setq a "This is A")
"This is A"

Command: (setq b "This is B")
"This is B"

Command: (swap 'a 'b)
nil

Command: !a
"This is B"

Command: !b
"This is A"
发表于 2002-9-16 22:13:00 | 显示全部楼层

;;; Swap

;;; Swap
(defun Swap (_Swap_A _Swap_B)
  (mapcar 'set
          (list _Swap_A _Swap_B)
          (mapcar 'eval (list _Swap_B _Swap_A)))
)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2025-8-28 00:22 , Processed in 0.192366 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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