Verilen, n ve m ile T türündeki a , b dizileridir . İki diziyi yeni bir dizide birleştiren bir algoritma arıyorum (en fazla n + m boyutunda).
Ucuz bir karşılaştırma işleminiz varsa, bu oldukça basittir. Dizilerden biri veya her ikisi de tamamen geçinceye kadar, en düşük ilk elemanı olan diziyi alın, sonra kalan elemanları ekleyin. Bunun gibi bir şey /programming/5958169/how-to-merge-two-sorted-arrays-into-a-sorted-array
Ancak, iki öğeyi karşılaştırırken durum değişir, bir öğeyi kaynak diziden hedef diziye kopyalamaktan çok daha pahalıdır . Örneğin, bir karşılaştırmanın oldukça pahalı olabileceği bir dizi büyük rasgele hassas tamsayıya veya dizgelere sahip olabilirsiniz. Dizileri yaratmanın ve öğeleri kopyalamanın ücretsiz olduğunu ve maliyetleri karşılayan tek şeyin öğeleri karşılaştırmak olduğunu farz edin.
Bu durumda, iki diziyi minimum sayıda öğe karşılaştırmasıyla birleştirmek istiyorsunuz . Basit birleştirme algoritmasından çok daha iyisini yapabileceğiniz bazı örnekler:
a = [1,2,3,4, ... 1000]
b = [1001,1002,1003,1004, ... 2000]
Veya
a = [1,2,3,4, ... 1000]
b = [0,100,200, ... 1000]
Gibi basit birleştirme algoritması en uygun olacağı bazı durumlar vardır
a = [1,3,5,7,9,....,999]
b = [2,4,6,8,10,....,1000]
Bu nedenle, algoritmalar ideal olarak incelikle bozunmalı ve dizilerin birleştirilmesi veya en azından önemli ölçüde daha kötü olmaması durumunda maksimum n + m-1 karşılaştırması yapmalıdır.
Büyük boyut farkına sahip listeler için oldukça iyi yapılması gereken şeylerden biri, daha küçük dizinin öğelerini daha büyük diziye eklemek için ikili arama kullanmak olacaktır. Ancak, her iki listenin de aynı boyutta ve serpiştirilmiş olması durumunda, bu incelikle bozulmaz.
Elemanlar için mevcut olan tek şey (toplam) bir sıralama işlevidir, bu nedenle karşılaştırmaları daha ucuz yapan herhangi bir şema mümkün değildir.
Herhangi bir fikir?
Scala'da bu bit ile geldim . Karşılaştırma sayısında en iyisi olduğuna inanıyorum, ancak kanıtlama yeteneğimin ötesinde. En azından literatürde bulduğum şeylerden çok daha basit.
Orijinal gönderimden bu yana, bunun nasıl çalıştığı hakkında bir blog yazısı yazdım .