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)

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.


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.


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.


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.