2010-10-20 13 views
7

Anlayabildiğim kadarıyla inplace_merge, sıralama ile aynı şeyi yapar, yalnızca belirli durumlarda çalışır (Kapsayıcı zaten iki ayrı parçada olduğunda).C++ STL :: inplace_merge ile sort arasındaki fark nedir?

int first[] = {1,3,5,7}; 
int second[] = {2,4,6,8}; 
vector<int> v(8); 
vector<int>::iterator it; 
copy(first,first+4, v.begin()); 
copy(second,second+4, v.begin()+4); 

inplace_merge(v.begin(), v.begin()+4, v.end()) 

:

Diğer bir deyişle, bu ikisi arasında bir fark yoktur.

int first[] = {1,3,5,7}; 
int second[] = {2,4,6,8}; 
vector<int> v(8); 
vector<int>::iterator it; 
copy(first,first+4, v.begin()); 
copy(second,second+4, v.begin()+4); 

sort(v.begin(), v.end()) 

Tek fark verimlilik mi olacak?

cevap

10

Onların karmaşıklığı aynı değildir:

  • sort() STL uygulanması kullandığı sıralama algoritması bağlı O(N²) bir kötü durum vardır.

  • inplace_merge()O(N*log(N)) bir kötü durum ve O(N-1) bir iyi kutuya sahip, bu nedenle (aynı girişli) daha yavaş sort() olmayacak. Diğerleri işaret olarak

Ayrıca, inplace_merge()stable şudur: kimin sıralama anahtarı aynıdır öğelerin sıralamasını korur. sort() bunu garanti etmez. stable_sort() yapar ve en kötü durum karmaşıklığı O(N*log(N)²)'dir.

+1

-1 Soru, OP'nin algoritmalardan biri için en kötü durumu önerdiği senaryo mu? Belirli bir senaryo düşünüldüğünde, en kötü durum karmaşıklıklarının karşılaştırılması mantıklı değildir. –

+1

@ Space_c0wb0y katılmıyorum, soru daha genel gibi görünüyor ve daha sonra bir örnek olarak, karmaşıklıkların inplace_merge asla sıralamadan daha yavaş olmayacağı anlamına gelmediğini ve bu cevabın istikrarı dikkate almadığını söyleyen bir örnek olarak kullandığını görüyoruz. –

+0

Teşekkürler. Bu cevabı koyduğum diğer tek şey, inplace_merge'ın kararlı olması, sıralama (stabil_sort değil) ise nasıl sıralanabileceğidir. Ama soruyu cevapladığın şey. Cplusplus.com adresinde "manual" yazısını okumalıyım :) –

5

İki fark:

  • kararlılık: inplace_merge istikrarlı algoritmadır (aynı sırayla iki orijinal aralığı arasında her iki alt aralıklara içinde ve eşit öğeleri tutacak).
    Bu nedenle, ilkel olmayan türlerdeki kaplarla ya da sıralama işleviniz tükendiğinde, sonuçta küçük bir fark olabilir. , Herhangi bir farklılık :)
  • verimliliği fark etmez int egers haznesiyle Tabii : Eğer söylediği gibi, zaten iki sıralı alt-gruba sahip olduğu gerçeği göz önüne alındığında, inplace_merge farklı bir şekilde uygulanacak ve irade olmalıdır bu nedenle muhtemelen daha verimli olur. Bu işlevin var olduğu tek gerçek, çok şey anlatıyor.
+0

_ "inplace_merge" farklı bir şekilde uygulanmalı ve bu nedenle muhtemelen daha verimli olacaktır "_. Bu yanlış. Standart, inplace_merge için algoritmanın sadece alt çizgi etkisi ve karmaşıklığı için özel bir algoritma uygulamamaktadır. Ayrıca, aslında 'sort', inproduct_ inge_merge'den daha verimli olacaktır. Yani, 'inplace_merge' 'sort''den daha iyi bir kötü durum garantisine sahiptir, fakat' sort'', istatistiksel bir bakış açısından, çok çeşitli girdilerden daha iyi bir performansa sahiptir. Ancak bu bir Standart garanti değildir: Vurgu _probably_ üzerindedir. – wilhelmtell

+0

@wilhelmtell, ne demek istediğimi söylüyorum * * * gibi bir şey olmalı *. – Benoit

+0

@wilhelmtell: "inplace_merge" kelimesinin her zaman std :: sort' den daha hızlı olmasını beklerdim. Standart, tam performansı (derleyici, rasgele uyku ifadeleri ekleyebilir) zorunlu kılmaz, ancak derleyici yazarları kasıtlı olarak kötü kod yazmadığından, "inplace_merge" uygulamasının açık uygulaması hiçbir zaman std :: sort 'uygulamasından daha kötü olmaz. . –

3

sort yöntem sıralar 2 artan sırayla aralığı (ilk, son) içerisinde elemanları kriteri.
inplace_search kombine sıralanmış bir aralığı içine 2 kriteri aralığı (ilk, orta) ve (orta, son) (ilk, son) birleştirir.


inplace_merge etkili olması için inplace_merge

  • sort
    • , sıralanmış olmalıdır 2 alt-aralıklar, (bu fark). Ayrıca, inplace_merge teorik olarak unstable, (fakat C++ 'da stable), ancak yapmak için verimli bir bellek gerektirir (son - ilk) - 1 karşılaştırmaya benzer (yani O (n log n) karşılaştırmaları yapar) karşılaştırmalar.

  • +0

    -1 Frèdèric ile aynıdır: Algoritmanın en kötü durum karmaşıklıklarının karşılaştırılması, belirli bir senaryo düşünüldüğünde mantıklı değildir, bu, herhangi bir algoritma için en kötü durum olmayabilir. –

    +0

    İyi düzenleme, -1 kaldırıldı. –

    +0

    Teşekkürler, garip, hala -1 var ve benim puan hala aynı (4493) ... sadece söyleyerek, ..... lol –

    İlgili konular