如何在列表中找到不常见的项目(互斥)
How to find the uncommon items in a list (mutually exclusive)
我的任务是编写一个方案函数,该函数可以生成一个新列表,其中包含仅存在于两个输入列表之一中的元素。
我设法创建了一个可行的解决方案:
(define remove
(lambda (l item)
(filter (lambda (x) (not (equal? x item))) l)))
(define uncommon_list
(lambda (list1 list2)
(cond
((null? list2) list1)
((null? list1) list2)
((memv (car list1) list2)
(uncommon_list (cdr list1) (remove list2 (car list1))))
(else
(append (list (car list1)) (uncommon_list (cdr list1) list2))))))
但是我觉得我把它复杂化了,而且 O 复杂度不是很好?任何使它变得更好的指示都会很棒!谢谢
(define a_minus_b(
lambda (lista listb) (
cond
((null? lista) `())
((memv (car lista) (cdr lista)) (a_minus_b (cdr lista) listb))
((memv (car lista) listb) (a_minus_b (cdr lista) listb))
(else (cons (car lista) (a_minus_b (cdr lista) listb)))
)
)
)
(define symmetric_diff(
lambda (list1 list2) (
append (a_minus_b list1 list2) (a_minus_b list2 list1)
)
)
)
对于最好的大 O,即 O(n),您需要创建集合,在 Scheme 中这意味着哈希表。解决方案是更新散列,以便知道它是否在第一个、第二个或两个列表中找到。然后由不在两者中的元素组成一个列表:
#!r6rs
(import (rnrs base)
(srfi :69))
(define (uncommon-elements l1 l2)
(define hash (make-hash-table eqv?))
(define (update-elements proc default lst)
(for-each
(lambda (e)
(hash-table-update! hash e proc (lambda () default)))
lst))
(update-elements values 1 l1)
(update-elements (lambda (e) (if (= e 2) 2 3)) 2 l2)
(hash-table-fold hash
(lambda (k v acc)
(if (= v 3)
acc
(cons k acc)))
'()))
(uncommon-elements '(1 2 3 4 5) '(3 4 5 6 7 8))
; ==> (1 2 6 7 8)
(uncommon-elements '(1 1 2 2 3 3 4 5) '(3 4 5 6 7 8))
; ==> (1 2 6 7 8)
我的任务是编写一个方案函数,该函数可以生成一个新列表,其中包含仅存在于两个输入列表之一中的元素。 我设法创建了一个可行的解决方案:
(define remove
(lambda (l item)
(filter (lambda (x) (not (equal? x item))) l)))
(define uncommon_list
(lambda (list1 list2)
(cond
((null? list2) list1)
((null? list1) list2)
((memv (car list1) list2)
(uncommon_list (cdr list1) (remove list2 (car list1))))
(else
(append (list (car list1)) (uncommon_list (cdr list1) list2))))))
但是我觉得我把它复杂化了,而且 O 复杂度不是很好?任何使它变得更好的指示都会很棒!谢谢
(define a_minus_b(
lambda (lista listb) (
cond
((null? lista) `())
((memv (car lista) (cdr lista)) (a_minus_b (cdr lista) listb))
((memv (car lista) listb) (a_minus_b (cdr lista) listb))
(else (cons (car lista) (a_minus_b (cdr lista) listb)))
)
)
)
(define symmetric_diff(
lambda (list1 list2) (
append (a_minus_b list1 list2) (a_minus_b list2 list1)
)
)
)
对于最好的大 O,即 O(n),您需要创建集合,在 Scheme 中这意味着哈希表。解决方案是更新散列,以便知道它是否在第一个、第二个或两个列表中找到。然后由不在两者中的元素组成一个列表:
#!r6rs
(import (rnrs base)
(srfi :69))
(define (uncommon-elements l1 l2)
(define hash (make-hash-table eqv?))
(define (update-elements proc default lst)
(for-each
(lambda (e)
(hash-table-update! hash e proc (lambda () default)))
lst))
(update-elements values 1 l1)
(update-elements (lambda (e) (if (= e 2) 2 3)) 2 l2)
(hash-table-fold hash
(lambda (k v acc)
(if (= v 3)
acc
(cons k acc)))
'()))
(uncommon-elements '(1 2 3 4 5) '(3 4 5 6 7 8))
; ==> (1 2 6 7 8)
(uncommon-elements '(1 1 2 2 3 3 4 5) '(3 4 5 6 7 8))
; ==> (1 2 6 7 8)