2010-11-05 28 views

Trả lời

2

Theo Steele "sự khác biệt thiết lập trả về danh sách các phần tử của danh sách1 không xuất hiện trong danh sách2. Thao tác này không phá hoại."

Vì vậy, nếu thiết khác biệt là trống rỗng và độ dài đều giống nhau ...

http://www.cs.cmu.edu/Groups/AI/html/cltl/clm/node152.html#SECTION001950000000000000000

+1

để bạn có thể nói rằng '(1 2 2) có cùng các yếu tố như' (1 1 2)? – 6502

+0

Phụ thuộc vào ý bạn của 'cùng một yếu tố'. Tôi thấy quan điểm của bạn, mặc dù: nếu tôi trả lời 'có', thì chiều dài không quan trọng. Nếu tôi trả lời 'không', sự khác biệt thiết lập không giải quyết được vấn đề. – philosodad

6

Nếu đơn đặt hàng không quan trọng, bạn có thể sử dụng như nhau. Ví dụ:

(equal (list 1 2) (list 1 2)) 

là đúng. Vì vậy, một cách để làm điều đó sẽ là (sắp xếp) danh sách và sau đó sử dụng bình đẳng. Lưu ý rằng sắp xếp là phá hoại vì vậy nếu thứ tự quan trọng, bạn có thể muốn sao chép nó trước.

+1

Việc đặt hàng có quan trọng hay không - SORT có thể hủy (không sắp xếp tại chỗ!) Danh sách gốc, vì vậy sao chép một ý tưởng hay trong cả hai trường hợp. –

+0

Nếu thứ tự quan trọng, việc sắp xếp (và do đó bản sao) sẽ không cần thiết; (bằng X Y) sẽ là đủ. Tôi nghĩ đó là vấn đề. – Kevin

2

Nếu các mục lặp lại không quan trọng, hãy xem SET-EXCLUSIVE-OR.

4
(defun same-bag-p (bag1 bag2 &key (test #'eql)) 
    (let ((table (make-hash-table :test test))) 
    (loop for key in bag1 do (incf (gethash key table 0))) 
    (loop for key in bag2 do (decf (gethash key table 0))) 
    (loop for val being each hash-value of table always (= val 0)))) 
+0

+1 để xử lý các bản sao. –

0

Sắp xếp cả hai danh sách, sau đó so sánh:

(equal (sort l1 #'<) (sort l2 #'<)) 
+1

Không thực sự thích hợp nhưng hãy cẩn thận rằng sắp xếp sẽ phá hủy danh sách ban đầu, vì vậy mã này trông có vẻ xấu như trong hầu hết các trường hợp, bạn nên tạo bản sao trước với ví dụ: '(sắp xếp (bản sao danh sách l1) # '<)' hoặc bạn nên lưu trữ kết quả sắp xếp lại thành l1 và l2. Ngoài ra cách tiếp cận này đòi hỏi các yếu tố có thể sắp xếp (bảng băm không). – 6502

+0

Cảm ơn người đứng đầu. Tôi đã ở vùng đất chức năng thuần khiết khi tôi viết điều này. –

2

Nếu đơn đặt hàng không quan trọng bạn có thể sử dụng "bộ bằng nhau":

(tương đương-bộ (1 2) (1 2)) -> T

(tương đương-bộ (1 2) (2 1)) -> T

(tương đương-bộ (1 2 5) (1 2)) -> NIL

(bộ ngang (1 2) (1 5 2)) -> NIL

+0

Tôi không thể tìm thấy chức năng này trong thông số kỹ thuật. Bạn có thể liên kết với nó không? – tsikov

Các vấn đề liên quan