Algoritma tazeleme. Yığın sıralaması neden bir aşağılama algoritmasıdır?


15

Yığın dizisinin neden bir yerinde sıralama algoritması olarak kabul edildiğini göremiyorum .

Demek istediğim, sıralanacak dizinin elemanları ile doldurulmuş bir ek veri yapısı yani bir yığın, min değerinin ve sıralama işleminin çıkarılmasına yardımcı olmak için kullanılır.

Öyleyse burada inplace'in tanımını yanlış anlayabilir miyim?

Ancak yerleştirme sıralaması örneğin, yerinde algoritma olduğu açıktır, yani elemanlar için fazladan bellek gerekmez.

Peki neden yerinde düşünülüyor?

Yanıtlar:


12

Demek istediğim, sıralanacak dizinin elemanları ile doldurulmuş bir ek veri yapısı yani bir yığın, min değerinin ve sıralama işleminin çıkarılmasına yardımcı olmak için kullanılır.

Hayır. Dizi, O (1) 'den fazla ek bellek kullanılmadan yığın kısıtlamasına uyacak şekilde dönüştürülür. (Aslında ihtiyacınız olan tek şey, takas amaçları için dizinin bir öğesini, artı bir boole veya iki ve bir döngü değişkeni veya iki tutmak için yeterli ek bellektir).

Tamam, bir teknik özellikte, yığının genellikle ayrı bir yığın kullanılarak açıklanması olabilir, ancak yerinde uygulanması mükemmel bir şekilde mümkündür.


3
Ayrı bir yığın (kod içinde) ile "heapsort" görmeyi beklediğim tek yer, her zamanki fonksiyonel "Quicksort" 'un da yerinde olmaması nedeniyle Haskell gibi fonksiyonel bir dildir - fonksiyonel programcılar gibi listelerini çok fazla ve yerinde bir sıralama durumlu - dizinin durumunu / verileri içeren her şeyi değiştirir. Korkutmak-alıntılar, çünkü bir yer dışı quicksort'un bir çabukort olduğunu ya da bir yer-dışı yığınının hiç de bir yığın olduğunu kabul etmiyorum - en azından açıkça değil- yer.
Steve314

1
@ Steve314, sanırım "bir yığın içine koyun ve sonra öğeleri birer birer dışarı çekin ve bir dizi koymak" etkisi bir şeyler söyleyen bazı öğretim materyalleri gördüm. Ancak CLR'yi kontrol ettikten sonra, yerinde bir sürüm gösterdiklerini bildirebilirim.
Peter Taylor

2
@PeterTaylor: Evet, gözden geçirdiğim kitap (Skiena) ekstra bir yığın oluşturarak yığınını sundu.
user10326

4

Bir ağacın düzenini belirtmek için bir dizinin kullanılabileceği temel anlayışını kaçırıyor olabilirsiniz.

İkili bir ağacınız olduğunu ve bir iç düğümün dizinin i dizininde olduğunu varsayalım. Daha sonra bu düğümün üst öğesinin ve alt öğelerinin dizi dizinini şu şekilde bulabilirsiniz:

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

Görmek:

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

Yığın tamamen bir dizide tutulabildiğinden ve organize edilebildiğinden, yığın, öğeleri giriş dizisinin içinde hareket ettirerek yerinde çalışabilir. Aslında, yığın orijinal girdi dizisi kullanılarak oluşturulur ve işlenir.


: Bunu biliyorum. Sorunlar, okuduğum kitabın ayrı bir yığın kullanarak heapsort sunduğu gibi görünüyor. böyle sunuldu)
user10326 30:11

Cormen ve ark. Tarafından "Algoritma Giriş" kitabını satın almanızı şiddetle tavsiye ederim. Algoritma ile ilgili tüm soruları açıkça cevaplıyor. Bir bilgisayar bilimcisi veya yazılım mühendisi olarak kariyer konusunda ciddi iseniz, bu kitaba sahip olmanız gerekir.
stackoverflowuser2010

1

Dediğiniz gibi, gerçekten yığın oluşturmak için ekstra bir yapıya ihtiyaç duyarsanız, o zaman yığın gerçekten bir yerinde sıralama algoritması DEĞİLDİR.

Ancak, durum böyle değil. Yığını, sıralamak istediğiniz dizinin aynısı üzerine oluşturabilir ve bundan sonra da heapsort algoritmasını uygulayabilirsiniz, böylece yerinde sıralar.


Temel olarak, bir dizideki verileri IIRC O (n) zamanında bir yığının kurallarına uygun olacak şekilde yeniden sıralamak için kullanılan bir "heapify" algoritması vardır. Programcılar.stackexchange.com/ questions/116904/… adresindeki sözde koda bakın . Bundan sonra, çoğunlukla tekrarlanan yığın kök-özütleri yapmak ve dizinin ne kadarının "yığın" olduğunu ve sonuçta ne kadar sıralandığını takip etmek meselesidir.
Steve314

0

Bilgisayar bilimlerinde, yerinde bir algoritma (veya Latince yerinde), küçük, sabit miktarda fazladan depolama alanına sahip bir veri yapısı kullanarak girişi dönüştüren bir algoritmadır. Algoritma yürütüldüğünde giriş genellikle çıktı tarafından yazılır. Yerinde olmayan bir algoritmaya bazen yerinde değil veya yerinde değil denir.

Wikipedia - Yerinde algoritma


Öyleyse neden mergesort yerinde olmayan bir algoritma olarak kabul ediliyor?
user10326

3
Bu yararlı bir cevap değil. Yığın ile ilgisi yoktur ve soruya cevap vermez.
stackoverflowuser2010

Tabii ki yığın ile ilgili bir şey var. Yığın sıra tanımından da anlaşılacağı gibi yerinde bir algoritmadır. Aslında, yığın sayfasından bağlanmıştır.
Rein Henrichs

0

Yer gereksinimleri göz ardı edilebilir olduğu için dikkate alınır (öğeleri değiştirmek için bitsel işlemler kullanıyorsanız sabit veya hiç yok). Örneğin, MergeSort, arama örneğinin her yinelemesinde girdi kümesi değiştirilmediğinden yerinde değildir.

Yerinde algoritmalar ve yer dışı algoritmalar arasındaki farkları göstermenin en iyi yolu, büyük olasılıkla yerinde yapan (K&R'den) aşağıdaki C / C ++ dize tersine koduna bakmaktı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;
      }
}

Örneğin, giriş dizesini sondan okuyorsanız ve karakterleri başka bir arabellekte yerleştirseydiniz, yer dışı bir dizgi tersine çevirme algoritması olurdu.


1
Mergesort sinir bozucu - yerinde bir stratejiniz olduğu konusunda kendinizi yanlış bir şekilde ikna etmek kolaydır . Genellikle, sadece küçük diziler için çalışır. Ancak, birisi nerede bir kez kağıt indirilen düşünüyorum did birleştirme-sort algoritması yerinde varyantı dışarı işi. Tekrar bulabilir miyim bakalım.
Steve314
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.