【问题标题】:lisp different length two listlisp不同长度的两个列表
【发布时间】:2017-02-22 14:46:15
【问题描述】:

我在处理两个不同长度的列表时遇到了困难。

(f '(8 1 2 3 23 12) '(2 9 4 6)) 应该返回 (1 2 3 4 6 8 9 12 23)

这是我尝试的代码。

(defun f (lst lst2)
  (cond ((or(null lst) (null lst2)) 0)
  (t (sort (cons (first lst) (cons (first lst2) (f (rest lst) (rest lst2)))) #'<))))

另外,您可以在 lisp 中处理重复项吗?

我将不胜感激。

【问题讨论】:

    标签: lisp common-lisp


    【解决方案1】:

    这可以通过标准函数轻松完成。要从两个列表中列出一个,您使用append,但是最后一个参数是共享的,所以我用copy-list 复制它,因为stable-sort 具有破坏性。 delete-duplicates 删除结果列表中的重复项。

    (defun f (lst1 lst2)
      (delete-duplicates (stable-sort (append lst1 (copy-list lst2)) #'<))))
    
    (f '(8 1 2 3 23 12) '(2 9 4 6))
    ; ==> (1 2 3 4 6 8 9 12 23)
    

    【讨论】:

    • 您是否认为首先删除重复项然后对可能较短的列表进行排序更有效
    • +1,但有两件事:(1)在这种情况下为什么要稳定排序? w.r.t. 相等的数字偏序&lt; 无法相互区分。 (此外,最终会删除重复项)。 (2) 你可以放心使用delete-duplicates
    • @coredump stable-sort 总是做正确的事。如果您只使用一种排序功能,这就是其中之一。我同意delete-duplicates
    • @MartinBuchmann 是的,但这是一个微优化。对于您确定这是需要修复的地方的性能问题,您可以通过一次通过来使其更快,但由于排序,结果仍然是 O(n logn)。要进一步解决这个问题,您需要更改规格,这经常发生。 IE。也许您只对 3 个最低值感兴趣...然后您可以这样做 O(n) 并且您不必删除、排序或追加。只需迭代并保留 3 个最低值(按顺序)。
    • @Sylwester 我明白了。我的观点是,如果你总是使用稳定排序,那么在阅读代码时就很难知道你是否真的需要稳定性。有时很容易:元素是从不提供任何保证的操作中获得的(例如从哈希表中迭代元素的顺序)。对此类集合进行稳定排序是没有意义的(而且成本很高)。此外,我通常一开始就不需要这样的保证:要么我需要强制执行顺序是完全的,在这种情况下稳定性无关紧要,要么我不关心等值之间的顺序。
    猜你喜欢
    • 2017-10-15
    • 2021-02-25
    • 1970-01-01
    • 1970-01-01
    • 2022-10-04
    • 2017-11-30
    • 2017-12-24
    • 1970-01-01
    • 2022-11-16
    相关资源
    最近更新 更多