2016-09-19 21 views
5

Aynı boyuttaki sonuçların listelerini döndüren iki işlevi var ve sonuçların aynı olup olmadığını kontrol etmeye çalışıyorum. Listelerdeki sıralar farklı olabilir. Şu anda aşağıdaki işlevi kullanıyorum: Sonuç boş liste iseİki listenin aynı öğelerden oluşup oluşmadığını kontrol edin

lists_are_the_same(List1, List2) -> 
    List1 -- List2 =:= []. 

Bu fonksiyon, diğer ve çekler itibaren bir listesini çıkarır. Sorun şu ki, bu yöntem çok yavaş ve benim durumumdaki listeler oldukça büyük olabilir.

İki listenin tam olarak aynı öğelerden oluşup oluşmadığını kontrol etmek için daha hızlı bir yol var mı?

cevap

6

daha hızlı yolu her liste sıralama ve aşağıdaki gibi sonra bunları karşılaştırmak olduğunu: Steve ait yorumum

lists_are_the_same(List1, List2) -> 
    lists:sort(List1) =:= lists:sort(List2). 

dayanarak, Erlang tüm değerler sıralanabilir olduğunu biliyoruz ve defined order olması önemlidir, Bu yüzden olası tüm liste öğeleri için çalışır.

+7

, türler [tanımlanmış toplam düzen] 'e sahip olduklarından (http://erlang.org/doc/reference_manual/expressions.html#id81064). –

+0

@SteveVinoski Doğru. Cevapla ilgili bilgilendirici yorumunuzdan bahsetmiştim. Teşekkürler. –

2

Tüm öğeleriniz benzersiz durumunda lists yerine ordsets kullanmak isteyebilirsiniz. Sen A -- B operasyonu kullanma konusunda da documentation görebilirsiniz: lists:subtract(A, B) karmaşıklığı length(A)*length(B) orantılıdır

, A ve B hem uzun listeleri ise çok yavaş olduğu anlamına gelir. Her iki listeleri uzunsa (bu sipariş listeleri ve ordsets:subtract/2 kullanmak çok daha iyi bir seçimdir onlar aracılığıyla eşitse

Sonra kontrol edebilirsiniz.

tüm değerler sıralanabilir Erlang ise
ordsets:is_subset(List1,List2) andalso ordsets:is_subset(List2,List1) 
+1

+1 Bu, sıralamadan çok daha hızlı gibi gözüküyor, daha sonra eşit fakat karıştırılmış tamsayılar listesindeki mikro ölçütlerimi karşılaştırıyor. – Dogbert

İlgili konular