【问题标题】:Is there a way to convert a list to a set in Scheme?有没有办法将列表转换为 Scheme 中的集合?
【发布时间】:2011-08-21 12:41:21
【问题描述】:

我想测试列表之间的相等性,但我真的只关心成员是否相同,而不是排序。有没有简单的运算符来检查这个?

一个简单的例子

(my-equal? (a b) (b a))

应该返回#t。

显然,这个特殊的例子可以很容易地通过检查两个列表然后反转第二个并再次检查来完成

(or (equal? (a b) (b a)) (equal? (a b) (reverse (b a)))

但是有一般的方法吗?我可以尝试编写一个函数,但我只能想象一些相当复杂的东西可以完成这项工作。我猜这一定是一个相当普遍的需求,我想知道 scheme 是否有一个内置的操作符可以在这里完成工作。

我正在使用 mit-scheme 9.0.1

【问题讨论】:

  • 请记住,在Scheme ... list 数据结构中写入(list 7 8) 或(cons 9 (cons null))。也许你应该写一个哈希映射来实现Set。从那里你可以建立起来。
  • 一个未指明的问题是您是否会考虑像 '(1 1 2) 和 '(2 1) 这样的列表是否相等。换句话说,重复是否有意义?
  • @john 如果是基本集,那么不,不应该计算重复。

标签: lisp scheme


【解决方案1】:

如果您的实现有SRFI 1 可用,那么有lset= 可以实现您想要的:

Set operations on lists

【讨论】:

  • 请注意,这不会“将列表转换为集合”——它只是将列表视为集合。 (这对于一些有限的情况很有用。)
  • 优秀。谢谢。这正是我想要的。
【解决方案2】:

如果您使用的是 Racket,我会将您指向 this page,它内置了对集合的支持。

不,我知道这不是在回答你的问题。

【讨论】:

    【解决方案3】:

    或者如果你想用老派的方式来做,你可以写几个小函数。

    我真诚地希望你不要用这个来做作业。

    (define (unordered-union-set set1 set2)
        (cond ((null? set2) set1)
            (else 
                (if (in-set? (car set2) set1)
                    (unordered-union-set set1 (cdr set2)) 
                    (cons (car set2) (unordered-union-set (cdr set2) set1))))))
    
    (define (in-set? item set)
        (cond ((null? set) #f)
            ((equal? item (car set)) #t)
            (else (in-set? item (cdr set)))))
    
    (define (set-equal? set1 set2)
        (if (equal? (length set1) (length set2))
            (if (equal? (length set1) (length (unordered-union-set set1 set2)))
                #t
                #f)
        #f))
    

    使用set-equal?任意两组。

    这基于一些简单的集合论。如果两个等价基数集的并集,产生一个基数等于第一个或最后一个集的基数的集,则这两个集是等价的。

    我写这篇文章的意思是说,没有简单的运算符,但如果你使用集合并集技巧,则不需要冗长的复杂过程。

    我的实现没有 SRFI 1,但我非常怀疑 lset= 会比这个函数快。

    但是现在我阅读了您的 cmets,您需要它对 '(1 1 2) 和 '(2 1) 有效。由于这些不是集合,因此此方法不起作用,但不难实现。所以,其实这个过程就相当于lset=。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-17
      • 1970-01-01
      • 2022-07-06
      • 2021-05-17
      • 1970-01-01
      • 2011-01-12
      • 2019-10-03
      相关资源
      最近更新 更多