のようなものを探してい#'delete-duplicates
ますが、リストのすべての要素が既にソートされているか、逆にソートされているか、少なくとも重複が互いに隣接するように配置されていることを知っています。その知識を使用して、実行速度がリスト内の要素数の 2 乗に比例しないようにしたいと考えています。#'maplist
自分のソリューションを成長させるために使用するのは簡単ですが、言語にはすでに何かがありますか? 車輪を再発明するのは恥ずかしいことです。
明確にするために、リストの長さが長い場合、削除の実行時間は、その長さの2乗に比例するのではなく、リストの長さに比例するようにしたいと思います。これは私が避けたい動作です:
1 (defun one-shot (cardinality)
2 (labels ((generate-list (the-count)
3 (let* ((the-list (make-list the-count)))
4 (do ((iterator 0 (1+ iterator)))
5 ((>= iterator the-count))
6 (setf (nth iterator the-list) iterator))
7 the-list)))
8 (let* ((given-list (generate-list cardinality))
9 (stripped-list)
10 (start-time)
11 (end-time))
12 (setf start-time (get-universal-time))
13 (setf stripped-list (delete-duplicates given-list :test #'eql))
14 (setf end-time (get-universal-time))
15 (princ "for n = ")
16 (princ cardinality)
17 (princ ", #'delete-duplicates took ")
18 (princ (- end-time start-time))
19 (princ " seconds")
20 (terpri))))
21 (one-shot 20000)
22 (one-shot 40000)
23 (one-shot 80000)
for n = 20000, #'delete-duplicates took 6 seconds
for n = 40000, #'delete-duplicates took 24 seconds
for n = 80000, #'delete-duplicates took 95 seconds