Salt okunur yığınları kullanarak sıralama


14

Aşağıdaki ayarı göz önünde bulundurun:

  • bir yığın verilir içerir , n ürün.sn
  • sabit sayıda ekstra yığın kullanabiliriz.O(1)
  • bu yığınlara aşağıdaki işlemleri uygulayabiliriz:
    1. bir yığının boş olup olmadığını kontrol edin,
    2. iki yığının üst öğelerini karşılaştırır,
    3. bir yığındaki üst öğeyi sil,
    4. üstteki öğeyi bir yığının içine bas,
    5. bir yığının üst öğesini başka bir yığına kopyalayın,
    6. bir yığının içeriğini başka bir yığına kopyalayın.

Bunlara izin verilen tek işlem olduğunu unutmayın. Öğeleri değiştiremeyiz ve üst öğeyi bir yığına kopyalama dışında herhangi bir öğeyi yığınların üzerine itmemize izin verilmez (bundan sonra hedef yığının önceki içeriği atılır ve yalnızca kopyalanan öğeyi içerir) .

Yığınları karşılaştırmalarıyla sıralamak için bir algoritma :O(n2)

last := empty
for i from 1 to n
  min := empty
  w := s
  while w is not empty
    if w.top > last and w.top < min
      min := w.top
    delete w.top
  print min
  last := min

Daha iyisini yapabilir miyiz?

Yığınlardaki öğelerin sıralı listesini yalnızca karşılaştırmaları kullanarak yazdıran bir program var mı ?O(nlogn)


2
Kayıtlar yığın gibi davranıyor mu? Kulağa itme ve pop operasyonlarından bahsediyormuşsunuz gibi geliyor. Bu senin soruların mı? Birkaç yığını ve yığın işlemlerini kullanarak bir yığını nasıl sıralarsınız?
AturSams

2
İle kayıtları yapabilirsiniz: sadece bir kayıt (her numara koymak Ç ( n ) ) ve daha sonra her zamanki sıralama algoritması (uygulamak Ç ( n lg n ) ). nO(n)O(nlgn)
Kaveh

1
kayıtlarını kullanmak istiyor musunuz ? Aksi takdirde, Kaveh tarafından yorumlandığı gibi sorun önemsizleşir. O(1)
Yuval Filmus

1
Rica ederim. Sadece bir tane değil, bir yığın yığın verildiğini düşündüm, düzelteceğim.
Kaveh

2
@akappa, bu görüşte kullanılabileceğinden emin misin? Herhangi bir keyfi kayıp boyutunu 1'den büyük tutamayız. Sıralanan blokları saklamanız gerekmez mi?
Kaveh

Yanıtlar:


1

O(logn)ST=Ω(n2)n2/logn

Biraz daha ayrıntılı olarak: Yukarıdaki 5. operasyondan vazgeçebiliriz. Gevşek bir şekilde, zaten iki listenin kafalarını karşılaştırabilir ve bir listenin kafasını yazdırabilirsek, bir listenin başlığını belirli bir kayıtta izole etmemize gerek yoktur. Bu varsayımla, makinedeki her kaydın girişin yalnızca son bir alt dizesini sakladığını görüyoruz.

kX1,,Xk

nn(i,d1,,dk)1i0d1,,dkn(i,d1,,dk)iXidi

i

Xu<Xvi1i2

d1,,dk(i,d1,,dk)dudv(i1,d1,,dk)(i2,d1,,dk)

i

X1tail(X2)i

(i,d1,,dk)(i,d21,,dk)

i

print(head(Xu))i

(i,d1,,dk)(i,d1,,dk)du

nkO(logn)


0

Elemanları sayabiliyor musunuz? Sonra, bence, oldukça kolay bir Mergesort uygulaması var. Yığına ek semboller koyabilirseniz, bunu aşağıdaki gibi 3 yığınla çözebilirsiniz:

Yalnızca bir öğemiz varsa, liste zaten sıralanmıştır. Şimdi yığının üst yarısını zaten sıraladığımızı varsayın. Üst yarıyı (ters sırayla) ikinci yığına kopyalayabilir ve üstüne bir ayırma sembolü yerleştirebiliriz. Şimdi yine 3 Yığımız var (ayırma sembolünün altında zaten sıralanmış sembolleri göz ardı edebileceğimizden) ve alt yarıyı sıralayabiliyoruz. Son olarak, sıralanan alt yarıyı tersine sırayla üçüncü bir yığına kopyalayabilir ve her iki yarıyı da orijinal yığına geri birleştirebiliriz.

Tüm işlemler doğrusal süreye mal olur, bu nedenle listeyi sıraladıkO(nlogn)

nlogn


Yığına yeni öğeler koyamayacağınız için ayırma noktalarında sorunlar yaşayabilirsiniz. Bunu çözmek için bazı ek yığınlarla aşağıdakileri yapabilirsiniz:

n2logn

lognccnlogn+cn2logn2+cn4logn4+ ...=O(nlogn)O(nlogn)


Anladığımdan emin değilim. Örneğin, herhangi bir öğeyi asla yığının üzerine itemediğimizde, yığının üst yarısını ters sırada nasıl başka bir yığına kopyalayabiliriz?
Siddharth

Yığına herhangi bir yeni eleman itemeyiz, ancak 5'e göre bir yığının üst elemanını diğerine itebiliriz. Bu nedenle, yığını ters sırada kopyalamak en fazla doğrusal zaman gerektirir. Sanırım istediğin şey bu değildi?
cero

Soruda açıklandığı gibi diğer öğelerin üzerine hiçbir şey itemezsiniz.
Kaveh
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.