Mengapa seleksi lebih cepat daripada sortir gelembung?

28

Ditulis di Wikipedia bahwa "... jenis seleksi hampir selalu mengungguli jenis gelembung dan jenis gnome." Adakah yang bisa menjelaskan kepada saya mengapa pemilihan semacam dianggap lebih cepat daripada semacam gelembung meskipun keduanya memiliki:

  1. Kompleksitas waktu kasus terburuk :O(n2)

  2. Jumlah perbandingan : O(n2)

  3. Kompleksitas waktu kasus terbaik :

    • Sortir gelembung:O(n)
    • Sortir pilihan:O(n2)
  4. Kompleksitas waktu kasus rata-rata :

    • Sortir gelembung:O(n2)
    • Sortir pilihan:O(n2)
RYO
sumber

Jawaban:

32

Semua kompleksitas yang Anda berikan benar, namun mereka diberikan dalam notasi Big O , sehingga semua nilai aditif dan konstanta dihilangkan.

Untuk menjawab pertanyaan Anda, kami perlu fokus pada analisis terperinci dari kedua algoritma tersebut. Analisis ini dapat dilakukan dengan tangan, atau ditemukan di banyak buku. Saya akan menggunakan hasil dari Seni Pemrograman Komputer Knuth .

Jumlah perbandingan rata-rata:

  • Sortir gelembung : 12(N2NlnN(γ+ln21)N)+O(N)
  • Jenis sisipan : 14(N2N)+NHN
  • Sortir pilihan : (N+1)HN2N

Sekarang, jika Anda memplot fungsi-fungsi itu Anda mendapatkan sesuatu seperti ini: merencanakan plot2

Seperti yang bisa Anda lihat, bubble sort jauh lebih buruk karena jumlah elemen meningkat, meskipun kedua metode sortasi memiliki kompleksitas asimptotik yang sama.

Analisis ini didasarkan pada asumsi bahwa inputnya acak - yang mungkin tidak selalu benar. Namun, sebelum kita mulai menyortir, kita dapat secara acak mengubah urutan input (menggunakan metode apa pun) untuk mendapatkan kasus rata-rata.

Saya menghilangkan analisis kompleksitas waktu karena tergantung pada implementasi, tetapi metode serupa dapat digunakan.

Bartosz Przybylski
sumber
Saya memiliki masalah dengan "kita dapat secara acak mengubah urutan input untuk mendapatkan kasus rata". Mengapa itu bisa dilakukan lebih cepat dari waktu yang dibutuhkan untuk menyortir?
Sasho Nikolov
1
NNO(NlogN)N
Saya kira saya mengantuk, Anda benar, urutannya dapat dirubah dalam waktu linier.
Sasho Nikolov
HN=Θ(logN)
Gamma = 0,577216 adalah konstanta Euler-Mascheroni. Bab yang relevan adalah "Seni Pemrograman" vol 3 bagian 5.2.2 hal. 109 dan 129. Bagaimana Anda memetakan case sorting gelembung persis terutama istilah O (sqrt (N))? Apakah Anda mengabaikannya?
mxmlnkn
11

O

Fungsi itu sendiri, misalnya jumlah perbandingan dan / atau swap, mungkin berbeda untuk dua algoritma dengan biaya asimptotik yang sama, asalkan mereka tumbuh dengan tingkat yang sama.

n/41

k×nkn/2(n-1)×(n-2)/2

Singkatnya, batas asimptotik memberi Anda perasaan yang baik tentang bagaimana biaya suatu algoritma tumbuh sehubungan dengan ukuran input, tetapi tidak mengatakan apa-apa tentang kinerja relatif dari berbagai algoritma dalam set yang sama.

Pedro
sumber
1
ini bahkan jawaban yang sangat bagus
Grijesh Chauhan
buku mana yang Anda sukai?
Grijesh Chauhan
@GrijeshChauhan: Buku adalah masalah selera, jadi ambillah rekomendasi apa pun dengan sebutir garam. Saya pribadi menyukai Cormen, Leiserson, dan Rivest "Introduction to Algorithms", yang memberikan tinjauan umum yang baik tentang sejumlah topik, dan seri "The Art of Computer Programming" karya Knuth jika Anda membutuhkan lebih banyak / semua perincian tentang topik tertentu. Anda mungkin ingin memeriksa apakah pertanyaan tentang buku telah ditanyakan di sini sebelumnya, atau memposting pertanyaan itu jika belum.
Pedro
Bagi saya, para ketiga dalam jawaban Anda adalah jawaban yang sebenarnya. Bukan grafik untuk input besar, yang diberikan dalam jawaban lain.
overexchange
3

Bubble sort menggunakan lebih banyak waktu swap, sementara sort sort menghindari ini.

Saat menggunakan memilih, sortirlah npaling banyak bertukar kali. tetapi ketika menggunakan semacam gelembung, itu bertukar hampir n*(n-1). Dan jelas waktu membaca kurang dari waktu menulis bahkan dalam memori. Waktu bandingkan dan waktu berjalan lainnya dapat diabaikan. Jadi waktu swap adalah hambatan utama dari masalah.

simonmysun
sumber
Saya pikir jawaban lain oleh Bartek lebih masuk akal tapi saya tidak bisa memilih atau berkomentar ... BTW Saya masih berpikir waktu menulis mempengaruhi lebih besar dan berharap dia bisa mempertimbangkan ini jika dia melihat ini dan setuju.
simonmysun
Anda tidak bisa begitu saja mengabaikan jumlah perbandingan, karena ada kasus penggunaan di mana waktu yang dihabiskan untuk membandingkan dua item dapat jauh melebihi waktu yang dihabiskan untuk menukar dua item. Pertimbangkan daftar tautan string yang sangat panjang (katakan masing-masing 100k karakter). Membaca di setiap string akan memakan waktu lebih lama daripada melakukan penugasan kembali pointer.
Irvin Lim
@IrvinLim Saya pikir Anda mungkin benar tetapi saya mungkin harus melihat data statistik sebelum saya berubah pikiran.
simonmysun