{"id":1294,"date":"2012-06-28T01:41:31","date_gmt":"2012-06-27T17:41:31","guid":{"rendered":"https:\/\/www.highflybird.com\/blog\/?p=130"},"modified":"2012-06-28T01:41:31","modified_gmt":"2012-06-27T17:41:31","slug":"%e4%ba%8c%e5%8f%89%e6%a0%91","status":"publish","type":"post","link":"https:\/\/www.highflybird.com\/blog\/?p=1294","title":{"rendered":"\u4e8c\u53c9\u6811"},"content":{"rendered":"<p>\u8fd9\u4e2a\u662f\u7528lisp\u6765\u6784\u5efa\u4e8c\u53c9\u6811\u3002<br \/>\n\u5bf9autolisp\u6765\u8bf4\uff0c\u6784\u5efa\u4e8c\u53c9\u6811\u662f\u4e00\u4e2a\u96be\u9898\uff0c\u56e0\u4e3alisp\u6ca1\u6709\u6307\u9488\uff0c\u6240\u4ee5\u6bd4\u8f83\u56f0\u96be\u3002<br \/>\n\u4e0b\u9762\u662f\u5b9e\u73b0\u7684\u4ee3\u7801\u3002<br \/>\n<!--more--><\/p>\n<p>[codesyntax lang=&#8221;lisp&#8221;];;;=============================================================<br \/>\n;;;\u7528AutoLISP\u6784\u5efa\u4e00\u4e2a\u4e8c\u53c9\u6811(Construct a Binary Search tree)<br \/>\n;;;\u4ece\u4e2d\u95f4\u5206\u5f00\uff0c\u76f4\u5230\u5206\u5f97\u53ea\u662f\u5269\u4e0b\u4e24\u4e2a\u5143\u7d20\u6216\u8005\u4e00\u4e2a<br \/>\n;;;\u6b64\u7ed3\u6784\u7528\u4e8e\u67e5\u627e\u4e00\u4e2a\u5143\u7d20\uff0c\u4f7f\u5f97\u5355\u6b21\u67e5\u627e\u7684\u65f6\u95f4\u4e3aO(n) = log(n)<br \/>\n;;;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br \/>\n;;;\u8f93\u5165: Lst \u4e00\u4e2a\u5df2\u7ecf\u6392\u5e8f\u7684\u8868\uff0c\u53ef\u4ee5\u62d3\u5c55\u6b64\u8868\u4e3a\u70b9\u8868\u6216\u5176\u4ed6\u8868\u3002<br \/>\n;;;\u8f93\u51fa: \u4e00\u4e2a\u4e8c\u53c9\u67e5\u627e\u6811<br \/>\n;;;Author:Highflybird              in Shenzhen,China,2012-06-15<br \/>\n;;;=============================================================<br \/>\n(defun BTree (lst \/ L R)<br \/>\n  (cond<br \/>\n    ( (cddr lst)                                                ;the length of list &gt; 2<br \/>\n      (setq R lst)<br \/>\n      (repeat (\/ (length lst) 2)                                ;Split it<br \/>\n        (setq L (cons (car R) L))                               ;Left part of list<br \/>\n        (setq R (cdr R))                                        ;Right part of list<br \/>\n      )<br \/>\n      (cons (car R)                                             ;middle number as the first.<br \/>\n            (cons (BTree (reverse L))                           ;recurse Left part<br \/>\n                  (BTree (cdr R))                               ;recurse Right part<br \/>\n            )<br \/>\n      )<br \/>\n    )<br \/>\n    ( (cdr lst)                                                 ;just two elements<br \/>\n      (cons (cadr lst) (car lst))                               ;the right node is empty.<br \/>\n    )<br \/>\n    ( lst<br \/>\n      (car lst)                                                 ;if just one,the node is an element.<br \/>\n    )<br \/>\n  )<br \/>\n)<\/p>\n<p>;;;=============================================================<br \/>\n;;;\u7528AutoLISP\u4ece\u4e8c\u53c9\u6811\u4e2d\u67e5\u627e\u4e00\u4e2a\u5143\u7d20(Search a key in binary tree)<br \/>\n;;;\u6bcf\u6b21\u67e5\u627e\u603b\u662f\u4ece\u4e2d\u95f4\u5f00\u59cb\uff0c\u5982\u679c\u4e0d\u662f\uff0c\u5927\u4e8e\u4e2d\u95f4\u7684\u5c31\u67e5\u627e\u53f3\u8fb9\uff0c\u5c0f\u4e8e<br \/>\n;;;\u4e2d\u95f4\u5219\u67e5\u627e\u5de6\u8fb9\uff0c\u76f4\u5230\u539f\u5b50\u6216\u8005\u70b9\u5bf9\u8868\u3002<br \/>\n;;;\u56e0\u4e3a\u6811\u7684\u6700\u5927\u6df1\u5ea6\u4e0d\u8d85\u8fc7log(n)\uff0c\u6545\u5355\u6b21\u67e5\u627e\u7684\u65f6\u95f4\u4e3aO(n)&lt;=log(n)<br \/>\n;;;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br \/>\n;;;\u8f93\u5165: \u8981\u67e5\u627e\u7684Key\uff0c\u5df2\u7ecf\u6784\u5efa\u597d\u7684\u4e8c\u53c9\u67e5\u627e\u6811\uff0cn\u67e5\u8be2\u7684\u6700\u5927\u8282\u70b9\u6570<br \/>\n;;;\u8f93\u51fa: \u5982\u679c\u627e\u5230\uff0c\u8fd4\u56de\u627e\u5230\u7684Key\u7684\u4f4d\u7f6e\u3002\u5426\u5219\u8fd4\u56denil<br \/>\n;;;Author:Highflybird              in Shenzhen,China,2012-06-15<br \/>\n;;;=============================================================<br \/>\n(defun BFind (key Tree n \/ L R i)<br \/>\n  (if (atom Tree)                                               ;if it&#8217;s an atom,<br \/>\n    (if (= key Tree) 0)                                         ;set the index as 0<br \/>\n    (if (= (setq L (car Tree)) key)                             ;if left node = key<br \/>\n      (\/ n 2)                                                   ;the index is the middle number.<br \/>\n      (if (atom (setq R (cdr Tree)))                            ;if the right node is an atom<br \/>\n        (if (= R key) 0)                                        ;and right node = key, set the index as 0<br \/>\n        (if (&gt; L key)                                           ;if left node &gt; key<br \/>\n          (BFind key (car R) (\/ n 2))                           ;recurse Left<br \/>\n          (if (setq i (BFind key (cdr R) (\/ (1- n) 2)))         ;otherwise recurse right<br \/>\n            (1+ (+ (\/ n 2) i))                                  ;must add the index<br \/>\n          )<br \/>\n        )<br \/>\n      )<br \/>\n    )<br \/>\n  )<br \/>\n)<\/p>\n<p>;;;=============================================================<br \/>\n;;;\u4ee5\u4e0b\u7528\u4e8e\u6d4b\u8bd5\uff0c\u7528\u4e86\u51e0\u79cd\u529e\u6cd5\u5bf9\u4e00\u4e2a\u6709\u5e8f\u7684\u6570\u7ec4\u67e5\u627e(For test)<br \/>\n;;;\u6570\u7ec4\u4e3a\u7b49\u5dee\u6570\u5217\uff0c\u4ece2.5\u5f00\u59cb\uff0c\u5dee\u4e3a1, \u4f8b\u5982:(2.5 3.5 4.5 5.5 &#8230;.)<br \/>\n;;;\u67e5\u627e\u65b9\u6cd5:\u5305\u62ec\u4e8c\u53c9\u6811,\u6298\u534a\u67e5\u627e,vl-position,member,assoc,\u76f4\u63a5\u67e5.<br \/>\n;;;\u5982\u679c\u6b64\u7a0b\u5e8f\u7528\u4f18\u5316\u7f16\u8bd1\uff0c\u5219\u662f\u66f4\u80fd\u63d0\u9ad8\u4e8c\u53c9\u6811\u7684\u67e5\u627e\u548c\u6784\u5efa\u901f\u5ea6<br \/>\n;;;=============================================================<br \/>\n(defun c:test (\/ e j k n lst lst1 Tree v x)<br \/>\n  (initget 7)<br \/>\n  (setq v (getvar &#8220;LOCALE&#8221;))<br \/>\n  (if (= v &#8220;CHS&#8221;)<br \/>\n    (setq j (fix (getreal &#8220;n\u8bf7\u8f93\u5165\u4e00\u4e2a\u6570\u7ec4\u5927\u5c0f(\u5982\u679c\u8f93\u5165\u6570\u7ec4\u8fc7\u5927\uff0c\u53ef\u80fd\u4f1a\u5bfc\u81f4\u505c\u6b62\u54cd\u5e94): &#8220;)))<br \/>\n    (setq j (fix (getreal &#8220;nPlease enter the length of a list (a big number maybe cause nonresponse): &#8220;)))<br \/>\n  )<\/p>\n<p>  (setq x (+ 1.5 j))<br \/>\n  (setq k (1- j))<br \/>\n  (setq lst nil)<br \/>\n  (setq lst1 nil)<br \/>\n  (repeat j<br \/>\n    (setq lst (cons x lst))<br \/>\n    (setq lst1 (cons (cons x k) lst1))<br \/>\n    (setq x (1- x))<br \/>\n    (setq k (1- k))<br \/>\n  )<br \/>\n  (Benchmark &#8216;(setq lst (vl-sort lst &#8216;&lt;) N (length lst)) &#8220;Vl-sort&#8221; 1)<br \/>\n  (Benchmark &#8216;(setq Tree (BTree lst) N N) &#8220;Construct Binary tree&#8221; 1)<br \/>\n  (benchmark &#8216;(setq Array (makearr lst vlax-vbdouble)) &#8220;Construct Safearray&#8221; 1)<\/p>\n<p>  (setq k (\/ N 10))<br \/>\n  (princ (strcat &#8220;n\u4ee5\u4e0b\u5bf9\u6bcf\u4e2a\u51fd\u6570\u91cd\u590d\u4e86&#8221; (itoa K) &#8220;\u6b21\u6d4b\u8bd5\u3002&#8221;))<\/p>\n<p>  (setq x -7.5)<br \/>\n  (Benchmark &#8216;(repeat k (setq e (BFind x Tree N)) (setq x (+ x 10))) &#8220;BinaryTree&#8221; 1)<\/p>\n<p>  (setq x -7.5)<br \/>\n  (Benchmark &#8216;(repeat k (setq e (bfind1 x Tree N)) (setq x (+ x 10))) &#8220;BinaryTree1&#8221; 1)<\/p>\n<p>  (setq x -7.5)<br \/>\n  (benchmark &#8216;(repeat k (setq e (HalfSeek x Array)) (setq x (+ x 10))) &#8220;HalfSeek&#8221; 1)<\/p>\n<p>  (setq x -7.5)<br \/>\n  (Benchmark &#8216;(repeat k (vl-position x lst) (setq x (+ x 10))) &#8220;vl-position&#8221; 1)<\/p>\n<p>  (setq x -7.5)<br \/>\n  (Benchmark &#8216;(repeat k (cdr (assoc x lst1)) (setq x (+ x 10))) &#8220;Assoc&#8221; 1)<\/p>\n<p>  (setq x -7.5)<br \/>\n  (Benchmark &#8216;(repeat k (- N (length (member x lst))) (setq x (+ x 10))) &#8220;Member&#8221; 1)<\/p>\n<p>  ;(setq x -2.5)<br \/>\n  ;(benchmark &#8216;(repeat N (Search x lst) (setq x (1+ x))) &#8220;Search Directly&#8221; 1)           ;\u8fd9\u4e2a\u65b9\u6cd5\u8fc7\u6162<\/p>\n<p>  ;;\u4ee5\u4e0b\u663e\u793a\u90e8\u5206\u67e5\u627e\u7ed3\u679c<br \/>\n  (princ &#8220;n\u4ee5\u4e0b\u663e\u793a\u7528\u4e8c\u53c9\u6811\u5bf9\u5341\u4e2a\u6570\u5b57\u7684\u67e5\u627e\u7ed3\u679c\u3002&#8221;)<br \/>\n  (setq x -2.5)<br \/>\n  (repeat 20<br \/>\n    (if (setq e (BFind x Tree j))<br \/>\n      (princ (strcat &#8220;n\u53d1\u73b0\u5728&#8221; (itoa e)))<br \/>\n      (princ (strcat &#8220;n\u6ca1\u53d1\u73b0&#8221; (rtos x)))<br \/>\n    )<br \/>\n    (setq x (1+ x))<br \/>\n  )<br \/>\n  (gc)<br \/>\n  (princ)<br \/>\n)<\/p>\n<p>;;;============================================================<br \/>\n;;;\u7528AutoLISP\u6298\u534a\u6cd5\u67e5\u627e<br \/>\n;;;\u9996\u5148\u6784\u9020\u4e86\u4e00\u4e2a\u5b89\u5168\u6570\u7ec4\uff0c\u8fd9\u6837\u4f7f\u5f97 nth\u66f4\u5feb\u3002<br \/>\n;;;\u7136\u540e\u4ece\u4e2d\u95f4\u627e\u8d77\uff0c\u5982\u679c\u5927\u4e8e\u4e2d\u95f4\uff0c\u5c31\u627e\u53f3\u8fb9\uff0c\u5c0f\u4e8e\u5219\u627e\u5de6\u8fb9\uff0c\u76f4\u5230\u627e<br \/>\n;;;\u627e\u5b8c\u3002\u8fd9\u4e2a\u6ca1\u7528\u9012\u5f52\uff0c\u5728\u5185\u5b58\u4e0a\u53ef\u80fd\u4f1a\u7a0d\u5fae\u6709\u4f18\u52bf\uff0c\u4f46\u662f\u5bf9\u4e8e\u901f\u5ea6\uff0c<br \/>\n;;;\u5176\u5b9e\u8ddf\u4e8c\u53c9\u6811\u76f8\u5dee\u4e0d\u5927\u3002<br \/>\n;;;\u4f18\u70b9: \u53ef\u4ee5\u4e0d\u7528\u9012\u5f52\uff0c\u6548\u7387\u53ef\u4ee5\u66f4\u9ad8\u3002<br \/>\n;;;\u7f3a\u70b9: \u662f\u8981\u6784\u7b51\u5b89\u5168\u6570\u7ec4\uff0c\u4e0d\u662f\u6240\u6709\u7684\u8868\u90fd\u53ef\u4ee5\u8f6c\u5316\u4e3a\u5b89\u5168\u6570\u7ec4.<br \/>\n;;;\u8f93\u5165: \u8981\u67e5\u627e\u7684key\uff0c\u548c\u5b89\u5168\u6570\u7ec4L\u3002<br \/>\n;;;\u8f93\u51fa: \u5982\u679c\u627e\u5230\uff0c\u8fd4\u56de\u627e\u5230\u7684Key\u7684\u4f4d\u7f6e\u3002\u5426\u5219\u8fd4\u56denil<br \/>\n;;;Author:Highflybird              in Shenzhen,China,2012-06-15<br \/>\n;;;============================================================<br \/>\n(defun MakeArr (L DataType \/ n a)<br \/>\n  (setq n (length L))<br \/>\n  (setq a (vlax-make-safearray DataType (cons 0 (1- n))))<br \/>\n  (vlax-safearray-fill a L)<br \/>\n)<br \/>\n(defun HalfSeek (key L \/ Nmin Nlen Nmax Nmid Nval)<br \/>\n  (setq Nmin 0)<br \/>\n  (setq NLen (1+ (vlax-safearray-get-u-bound L 1)))<br \/>\n  (setq Nmax (1- NLen))<br \/>\n  (setq Nmid (\/ Nlen 2))<br \/>\n  (setq Nval (vlax-safearray-get-element L Nmid))<br \/>\n  (while (and (\/= Nval key) (&lt;= Nmin Nmax))<br \/>\n    (if (&gt; Nval key)<br \/>\n      (setq Nmax (1- Nmid))<br \/>\n      (setq Nmin (1+ Nmid))<br \/>\n    )<br \/>\n    (setq Nmid (\/ (+ Nmax Nmin) 2)<br \/>\n          Nval (vlax-safearray-get-element L Nmid)<br \/>\n    )<br \/>\n  )<br \/>\n  (if (= nval key)<br \/>\n    Nmid<br \/>\n  )<br \/>\n)<\/p>\n<p>;;;============================================================<br \/>\n;;;\u7b80\u5355\u7684LISP\u641c\u5bfb\uff0c\u6328\u4e2a\u5730\u627e\uff0c\u627e\u5230\u4e3a\u6b62\uff0c\u5bf9\u6392\u5e8f\u548c\u672a\u6392\u5e8f\u7684\u5747\u53ef\u7528\u3002<br \/>\n;;;\u4f46\u662f\u5355\u6b21\u67e5\u627e\u5e73\u5747\u65f6\u95f4\u4e3aO(n)<br \/>\n;;;============================================================<br \/>\n(defun Search (key lst \/ i x)<br \/>\n  (setq x lst)<br \/>\n  (setq i -1)<br \/>\n  (while (and x (\/= (car x) key))<br \/>\n    (setq x (cdr x))<br \/>\n    (setq i (1+ i))<br \/>\n  )<br \/>\n)<\/p>\n<p>;;;============================================================<br \/>\n;;;\u6d4b\u8bd5\u7528\u51fd\u6570<br \/>\n;;;============================================================<br \/>\n(defun Benchmark (func funName times \/ t0 t1 res)<br \/>\n  (setq t0 (getvar &#8220;TDUSRTIMER&#8221;))<br \/>\n  (repeat times<br \/>\n    (setq res (eval func))<br \/>\n  )<br \/>\n  (setq t1 (* (- (getvar &#8220;TDUSRTIMER&#8221;) t0) 86400))<\/p>\n<p>  (princ (strcat &#8220;nnIt takes: &#8221; (rtos t1 2 6) &#8221; Seconds for &#8221; funName))<br \/>\n  (princ (strcat &#8220;.nTotal times: &#8221; (itoa times)))<br \/>\n  (princ (strcat &#8220;.nSpeed is: &#8221; (rtos (\/ t1 times) 2 6) &#8221; Seconds\/times.&#8221;))<br \/>\n  (princ &#8220;nThe result is: &#8220;)<br \/>\n  (princ res)<br \/>\n)<\/p>\n<p>;;;\u5982\u679c\u7528cond\u51fd\u6570\uff0c\u901f\u5ea6\u76f8\u5dee\u5f88\u5c11\uff0c\u6545\u53ea\u505a\u4fdd\u7559<br \/>\n(defun BFind1 (key lst n \/ x k)<br \/>\n  (cond<br \/>\n    ( (atom lst)<br \/>\n      (if (= key lst)<br \/>\n        0<br \/>\n      )<br \/>\n    )<br \/>\n    ( (and (atom (car lst)) (atom (cdr lst)))<br \/>\n      (cond<br \/>\n        ( (= key (car lst)) -1)<br \/>\n        ( (= key (cdr lst)) 1)<br \/>\n      )<br \/>\n    )<br \/>\n    ( (= (setq x (car lst)) key)<br \/>\n      (\/ n 2)<br \/>\n    )<br \/>\n    ( (&gt; x key)<br \/>\n      (bfind1 key (cadr lst) (\/ n 2))<br \/>\n    )<br \/>\n    ( (setq k (bfind1 key (cddr lst) (\/ (1- n) 2)))<br \/>\n      (1+ (+ (\/ n 2) k))<br \/>\n    )<br \/>\n  )<br \/>\n)<\/p>\n<p>(defun c:ccc()<br \/>\n  (setq n 0 )<br \/>\n  (repeat 10<br \/>\n    (princ &#8220;nN is :&#8221;)<br \/>\n    (princ (- n (\/ n 2) 1))<\/p>\n<p>    (princ &#8220;na N is :&#8221;)<br \/>\n    (princ (\/ (1- n) 2))<br \/>\n    (setq n (1+ n))<br \/>\n  )<br \/>\n  (princ)<br \/>\n)<br \/>\n[\/codesyntax]<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u8fd9\u4e2a\u662f\u7528lisp\u6765\u6784\u5efa\u4e8c\u53c9\u6811\u3002 \u5bf9autolisp\u6765\u8bf4\uff0c\u6784\u5efa\u4e8c\u53c9\u6811\u662f\u4e00\u4e2a\u96be\u9898\uff0c\u56e0\u4e3alisp\u6ca1\u6709\u6307\u9488\uff0c\u6240\u4ee5\u6bd4\u8f83\u56f0<\/p>\n<p class=\"more-link\"><a href=\"https:\/\/www.highflybird.com\/blog\/?p=1294\" class=\"themebutton2\">Read More<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"ngg_post_thumbnail":0,"footnotes":""},"categories":[9],"tags":[15],"class_list":["post-1294","post","type-post","status-publish","format-standard","hentry","category-programming","tag-15"],"_links":{"self":[{"href":"https:\/\/www.highflybird.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/1294","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.highflybird.com\/blog\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.highflybird.com\/blog\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.highflybird.com\/blog\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.highflybird.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1294"}],"version-history":[{"count":0,"href":"https:\/\/www.highflybird.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/1294\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.highflybird.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1294"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.highflybird.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1294"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.highflybird.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1294"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}