Я ищу что-то вроде #'delete-duplicates
, но знаю, что все элементы списка уже отсортированы, или обратно отсортированы, или хотя бы расположены так, что дубликаты уже будут соседствовать друг с другом. Я хочу использовать эти знания, чтобы убедиться, что скорость выполнения не пропорциональна квадрату количества элементов в списке. Использование #'maplist
для расширения моего собственного решения тривиально, но есть ли что-то уже в языке? Было бы стыдно изобретать велосипед.
Чтобы было ясно, для больших длин списков я хотел бы, чтобы время выполнения удаления было пропорционально длине списка, а не пропорционально квадрату этой длины. Это поведение, которого я хочу избежать:
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
time
для определения времени ( после того, как вы скомпилируете свою функцию)? - person Joshua Taylor   schedule 04.11.2013time
. - person Bill Evans at Mariposa   schedule 04.11.2013delete-duplicates
. Реализация может правильно выполнить один проход по списку, создав хэш-таблицу элементов, чтобы проверить, есть ли какие-либо повторяющиеся элементы, а затем, если их нет, просто вернуть список. Это было бы линейно по длине списка и правильно. В вашем тестовом списке нет повторяющихся элементов, поэтому на самом деле он не проверяет основные функцииdelete-duplicates
. - person Joshua Taylor   schedule 05.11.2013