Kümeler sıralanmış bağlantılı listeler olarak temsil edilirse, doğrusal tarama nasıl yapılacağını bildiğim en iyisidir. Çalışma süresi .O(|A|+|B|)
her bir öğesini her bir öğesiyle karşılaştırmanız gerekmediğini unutmayın . Bu , daha kötü olan çalışma süresine yol açacaktır . Bunun yerine, bu iki kümenin simetrik farkını hesaplamak için, her iki kümede ortak olan değerleri atlamak için uygun şekilde değiştirilmiş, mergesort'taki "birleştirme" işlemine benzer bir teknik kullanabilirsiniz.B O ( | A | × | B | )ABO(|A|×|B|)
Daha ayrıntılı olarak, hesaplamak için aşağıdakine benzer bir özyinelemeli algoritma ; ve değerleri sıralanmış düzende bağlantılı listeler olarak gösterildiği varsayılır :A BA∖BAB
difference(A, B):
if len(B)=0:
return A # return the leftover list
if len(A)=0:
return B # return the leftover list
if A[0] < B[0]:
return [A[0]] + difference(A[1:], B)
elsif A[0] = B[0]:
return difference(A[1:], B[1:]) # omit the common element
else:
return [B[0]] + difference(A, B[1:])
Bunu sahte Python'da temsil ettim. Python okumak yoksa, A[0]
bağlantılı liste başıdır A
, A[1:]
listenin geri kalanı ve +
listelerin birleştirme temsil eder. Verimlilik nedeniyle, Python'da çalışıyorsanız, muhtemelen tam olarak yukarıdaki gibi uygulamak istemezsiniz - örneğin, birçok geçici liste oluşturmaktan kaçınmak için jeneratörleri kullanmak daha iyi olabilir - ancak fikirleri mümkün olan en basit biçimde gösterir. Bu sahte kodun amacı sadece somut bir uygulama önermemek değil, algoritmayı açıklamaktır.
Kümeleriniz sıralı listeler olarak gösteriliyorsa ve çıktının sıralı bir liste olarak sunulmasını istiyorsanız, daha iyisini yapmanın mümkün olduğunu düşünmüyorum. Temel olarak ve her elementine bakmak zorundasınız . Gerekçe Gayri kroki: Eğer bakmadım dair herhangi bir unsur varsa, yapamazsın çıktı o, bunu hem mevcut olduğunu biliyorum eğer bir unsuru bakarak atlayabilirsiniz tek durum yani ve , ama değerine bakmadıysanız bunun mevcut olduğunu nasıl bilebilirsiniz?B A BABAB