Saya perlu menambahkan satu bilangan bulat ke daftar yang sudah diurutkan, sehingga masuk di tempat yang tepat. Orang pertama saya kira-kira seperti itu
(sort (cons newelt list) #'<)
Namun, mengingat yang list
sudah diurutkan, hanya satu penyisipan benar-benar diperlukan, yang berarti solusi ini bisa sangat tidak cocok tergantung pada algoritma yang digunakan oleh sort
.
Jadi, algoritma apa yang sort
digunakan?
Akankah saya lebih baik melakukan sesuatu seperti yang berikut ini?
(let ((tail list))
;; The first element is never less-than
(while (and tail (< newelt (cadr tail)))
(setq tail (cdr tail)))
(setcdr tail (cons newelt (cdr tail)))
list)
elisp
performance
emacs-internals
Malabarba
sumber
sumber
B
menjadi awal sudah diurutkanlist
danA
danC
awalnya kosong daftar. DibagiB
dua bagianB1
,B2
panjangm
danm
ataum+1
danm
, bandingkannewelt
dengan elemen pertamaB2
. Jikanewelt
yaitu≥
memperluasA
ke kanan denganB1
dan menggantiB
denganB2
, lain memperluasC
ke kiri denganB2
dan menggantiB
denganB1
. SetelahO(log n)
langkah-langkah tersebut tidak ada yang tersisaB
. KemudianA
berisi hal-hal≤ newelt
, danC
itu> newelt
, dan rangkaian menghasilkan daftar diurutkan diperpanjang. Permintaan maaf untuk bahasa yang tidak terlalue-lisp
suka.Jawaban:
Jika Anda memasang kode sumber Emacs, Anda dapat menemukan kode sumbernya
sort
denganM-x find-function
.Di sana Anda dapat melihat bahwa
sort
melakukan semacam penggabungan. Ia memeriksa panjang daftar, memecah daftar menjadi setengah, mengurutkan bagian "depan" dan "belakang" secara terpisah melalui rekursi, dan kemudian menggabungkan keduanya.Adapun apakah implementasi Anda akan lebih cepat - ukurlah! Ini lebih efisien dalam teori (O (n) vs O (n log n)), tetapi
sort
memiliki keuntungan karena ditulis dalam C, sehingga hasilnya mungkin berjalan baik. (Tentu saja, jangan lupa byte-compile fungsi Anda.)sumber