motee-z 发表于 2022-7-6 06:13:56

列表中的最大数

你好
如何在包含实数的列表中获得最大数
说(setq lst’(5.2 6.7 8.9)

BlackBox 发表于 2022-7-6 06:25:38


_$ (vl-load-com)

_$ (setq lst '(5.2 6.7 8.9 )
(5.2 6.7 8.9

_$ (setq newLst (vl-sort lst '>))
(8.9 8 6.7 5.2)

_$ (car newLst)
8.9
_$

Kowal 发表于 2022-7-6 06:39:36

(apply 'max lst)
实例
(apply 'max '(1 2 3 -4 5))
回报:5

BlackBox 发表于 2022-7-6 06:45:41

荣誉我忘记了最小值/最大值。
 
FWIW-通过使用MAX(尽可能小)有轻微的速度增益:
 

_$ (defun _max (lst) (apply 'max lst))
_MAX

_$ (defun _vl-sort (lst) (car (vl-sort lst '>)))
_VL-SORT

_$ (bench '(_max _vl-sort) (list '(5.2 6.7 8.9 ) 100000)

_MAX
Elapsed: 452
Average: 0.0045

_VL-SORT
Elapsed: 483
Average: 0.0048
_$

motee-z 发表于 2022-7-6 06:58:49

感谢KOWal和blackbox的回复

David Bethel 发表于 2022-7-6 07:04:11

apply的更详细形式是:
 

(eval (cons 'max lst))

 
-大卫

irneb 发表于 2022-7-6 07:15:21

FWIW-列表越长,速度增益越大。排序为O(N log N),最大值为O(N)。因此,对于10个排序列表,需要(大约)10*log(10)2次迭代=10*3.321928≈ 33次;最多需要10次。100等于100*6.643856≈ 665对100。这些都是最坏的情况,所以区别并不是“那么”大。但是看看这个:;;; -------------------------------------------------------------------------------------
;;; Pseudo random number generator
;;; -------------------------------------------------------------------------------------
;;; seed : A number as the seed, nil to auto-generate
;;; Result: real value between 0.0 and 1.0
;;; -------------------------------------------------------------------------------------
(defun Random(seed /)
(/ (setq *random:seed*
         (setq seed (rem (+ (* 25173
                                 (cond (seed)
                                       (*random:seed*)
                                       ((getvar "DATE"))))
                              13849)
                           65536)))
    65536.))

(defun _max (lst) (apply 'max lst))
(defun _vl-sort (lst) (car (vl-sort lst '>)))

(defun doMaxBench (num / lst)
(repeat num (setq lst (cons (Random nil) lst)))
(princ "Calculating benchmark between max and sort for list of ")
(princ num)
(princ " items.\n")
(quickbench '((_max lst) (_vl-sort lst))))下面是测试:
_$ (doMaxBench 10)
Calculating benchmark for finding max number in a list of 10 items.
Benchmarking .. done for 32768 iterations. Sorted from fastest.
Statement                              IncrementTime(ms) NormalizeRelative
--------------------------------------------------------------------------------
(_MAX LST)                                 32768      1076      1076      1.09
(_VL-SORT LST)                               32768      1171      1171      1.00
--------------------------------------------------------------------------------
_$ (doMaxBench 100)
Calculating benchmark for finding max number in a list of 100 items.
Benchmarking .. done for 32768 iterations. Sorted from fastest.
Statement                              IncrementTime(ms) NormalizeRelative
--------------------------------------------------------------------------------
(_MAX LST)                                 32768      1186      1186      3.68
(_VL-SORT LST)                              8192      1091      4364      1.00
--------------------------------------------------------------------------------
_$ (doMaxBench 1000)
Calculating benchmark for finding max number in a list of 1000 items.
Benchmarking .. done for 32768 iterations. Sorted from fastest.
Statement                              IncrementTime(ms) NormalizeRelative
--------------------------------------------------------------------------------
(_MAX LST)                                 32768      1981      1981   26.72
(_VL-SORT LST)                              1024      1654   52928      1.00
--------------------------------------------------------------------------------
页: [1]
查看完整版本: 列表中的最大数