Add a faster delete-duplicates function

Which is useful when deleting duplicates from large lists.
This commit is contained in:
Christopher Baines 2022-03-01 20:34:06 +00:00
parent 4a9d45aa16
commit 6cd3541d1a

View file

@ -33,7 +33,9 @@
chunk chunk
chunk! chunk!
chunk-for-each!)) chunk-for-each!
delete-duplicates/sort!))
(define (call-with-time-logging action thunk) (define (call-with-time-logging action thunk)
(simple-format #t "debug: Starting ~A\n" action) (simple-format #t "debug: Starting ~A\n" action)
@ -202,3 +204,23 @@
(do-one-iteration lsts))) (do-one-iteration lsts)))
#t) #t)
(define (delete-duplicates/sort! unsorted-lst less)
(if (null? unsorted-lst)
unsorted-lst
(let ((sorted-lst (sort! unsorted-lst less)))
(let loop ((lst (cdr sorted-lst))
(last-element (car sorted-lst))
(result (list (car sorted-lst))))
(if (null? lst)
result
(let ((current-element (car lst)))
(if (eq? current-element last-element)
(loop (cdr lst)
last-element
result)
(loop (cdr lst)
current-element
(cons current-element
result)))))))))