Penyegaran algoritma. Mengapa heapsort merupakan algoritma insort?

15

Saya tidak bisa melihat mengapa heapsort dianggap sebagai algoritma penyortiran inplace .

Maksud saya struktur data ekstra diisi dengan elemen-elemen array yang akan diurutkan yaitu heap, digunakan untuk membantu dalam ekstraksi nilai min dan proses penyortiran.

Jadi mungkin saya salah paham definisi inplace di sini?

Tetapi jenis penyisipan misalnya jelas bahwa itu adalah algoritma inplace, yaitu tidak ada memori tambahan yang diperlukan untuk elemen.

Jadi mengapa itu dianggap tidak benar?

pengguna10326
sumber

Jawaban:

12

Maksud saya struktur data ekstra diisi dengan elemen-elemen array yang akan diurutkan yaitu heap, digunakan untuk membantu dalam ekstraksi nilai min dan proses penyortiran.

Tidak. Array ditransformasikan agar sesuai dengan batasan heap tanpa menggunakan lebih dari O (1) memori tambahan. (Sebenarnya yang Anda butuhkan adalah memori tambahan yang cukup untuk menampung satu elemen array, untuk tujuan swap, ditambah satu atau dua boolean dan satu atau dua variabel loop).

Ok, secara teknis mungkin heapsort biasanya dijelaskan menggunakan heap terpisah, tetapi sangat mungkin untuk mengimplementasikannya di tempat.

Peter Taylor
sumber
3
Satu-satunya tempat yang saya harapkan untuk melihat "heapsort" dengan heaport terpisah (dalam kode) adalah dalam bahasa fungsional seperti Haskell, untuk alasan yang sama bahwa fungsional "Quicksort" yang biasa tidak ada di tempat juga - programmer fungsional seperti daftar mereka banyak, dan semacam di tempat adalah stateful - itu mengubah keadaan array / apa pun yang berisi data. Takut-kutip karena saya tidak benar-benar menerima bahwa quicksort out-of-place adalah quicksort sama sekali, atau bahwa heapsort out-of-place adalah heapsort sama sekali - setidaknya tidak tanpa jelas mengatakan bahwa itu bukan in-place tempat.
Steve314
1
@ Steve314, saya pikir saya telah melihat beberapa bahan pengajaran yang mengatakan sesuatu dengan efek "letakkan di tumpukan dan kemudian tarik elemen keluar satu per satu dan letakkan di dalam array". Tetapi setelah baru saja memeriksa CLR saya dapat melaporkan bahwa mereka menunjukkan versi di tempat.
Peter Taylor
2
@PeterTaylor: Ya, buku yang saya tinjau (Skiena) menyajikan heapsort dengan membangun heaport tambahan.
user10326
4

Anda mungkin kehilangan pemahaman mendasar bahwa array dapat digunakan untuk menentukan tata letak pohon.

Misalkan Anda memiliki pohon biner, dan simpul interior berada pada indeks i dari array. Kemudian indeks array dari orang tua dan anak-anak dari simpul itu dapat ditemukan oleh:

Parent(i) = floor(i/2)
Left child(i) = 2i
Right child(i) = 2i + 1

Lihat:

http://www.personal.kent.edu/~rmuhamma/Algorithms/MyAlgorithms/Sorting/heapSort.htm

Karena heap dapat disimpan dan diatur seluruhnya dalam sebuah array, maka heapsort dapat berjalan di tempat dengan menggerakkan elemen-elemen di dalam array input. Memang, heap dibangun dan dimanipulasi menggunakan array input asli.

stackoverflowuser2010
sumber
: Saya tahu tentang ini. Masalahnya tampaknya bahwa buku yang saya baca disajikan heapsort menggunakan heaport terpisah. Saya tidak mengerti atau berpikir bahwa presentasi ini adalah untuk membuatnya lebih mudah untuk memahami algoritma (mungkin? Tidak yakin mengapa itu disajikan seperti itu)
user10326
Saya akan sangat menyarankan Anda membeli buku "Pengantar Algoritma" oleh Cormen, et al. Itu jelas menjawab semua pertanyaan terkait algoritma. Jika Anda serius tentang karier sebagai ilmuwan komputer atau insinyur perangkat lunak, maka Anda perlu memiliki buku ini.
stackoverflowuser2010
1

Jika, seperti yang Anda katakan, seseorang benar-benar membutuhkan struktur tambahan untuk membangun heap maka heapsort TIDAK akan menjadi algoritma pengurutan inplace.

Namun, ini bukan masalahnya. Anda dapat membangun heap pada array yang sama seperti yang Anda inginkan, dan setelah itu Anda menerapkan algoritma heapsort, jadi itu semacam inplace.

Daniel Scocco
sumber
Pada dasarnya, ada algoritma "heapify" yang digunakan untuk memesan ulang data dalam array sehingga sesuai dengan aturan heap dalam waktu IIRC O (n). Lihat pseudocode di programmers.stackexchange.com/questions/116904/… . Setelah itu, sebagian besar masalah melakukan ekstrak akar tumpukan berulang dan melacak berapa banyak array masih "tumpukan" dan berapa banyak diurutkan hasil akhir.
Steve314
0

Dalam ilmu komputer, algoritma in-place (atau dalam bahasa Latin in situ) adalah algoritma yang mengubah input menggunakan struktur data dengan jumlah ruang penyimpanan ekstra yang kecil dan konstan. Input biasanya ditimpa oleh output saat algoritma dijalankan. Algoritma yang tidak di tempat kadang-kadang disebut tidak di tempat atau di luar tempat.

Wikipedia - Algoritma in-place

Rein Henrichs
sumber
Jadi mengapa mergesort dianggap sebagai algoritma yang tidak ada?
user10326
3
Ini bukan balasan yang berguna. Itu tidak ada hubungannya dengan heapsort dan tidak menjawab pertanyaan.
stackoverflowuser2010
Tentu saja ada hubungannya dengan heapsort. Heapsort adalah algoritma pengurutan di tempat, sebagaimana harus jelas dari definisi. Bahkan, itu ditautkan dari halaman heapsort.
Rein Henrichs
0

Ini dianggap ada karena persyaratan ruangnya dapat diabaikan (konstan atau tidak sama sekali jika Anda menggunakan operasi bitwise untuk menukar item). MergeSort, misalnya, tidak ada di tempat karena set input tidak diubah di setiap iterasi dari contoh pencarian.

Cara terbaik untuk menggambarkan perbedaan antara algoritma in-place dan algoritma out-of-place mungkin dengan melihat kode pembalikan string C / C ++ berikut yang membuatnya ada di tempat (dari K&R):

void reverse(char s[])
{
      int c, i, j;

      for (i = 0, j = strlen(s)-1; i < j; i++, j--) {
         c = s[i];
         s[i] = s[j];
         s[j] = c;
      }
}

Jika Anda, misalnya, membaca string input dari ujung dan menempatkan karakter dalam buffer lain, itu akan menjadi algoritma pembalikan string out-of place.

rdasxy
sumber
1
Mergesort sangat menyebalkan - mudah untuk secara salah meyakinkan diri sendiri bahwa Anda memiliki strategi di tempat. Biasanya, ini hanya berfungsi untuk array kecil. Namun, saya pikir saya pernah mengunduh makalah di mana seseorang berhasil mengerjakan varian in-place dari algoritma merge-sort. Saya akan melihat apakah saya dapat menemukannya lagi.
Steve314