2013-05-31 7 views
7

Bir dizi N öğesini aradığınızı ve karşılık gelen anahtarları bulmak için dizi değerlerinde Y Aramaları yaptığınızı düşünün; Ya Y array_search'u yapabilir ya da bir array_flip ve Y doğrudan aramaları yapabilirsiniz. İlk yöntem neden ikinci yönteme göre daha yavaştır? İlk yöntemin ikincisinden daha hızlı olduğu bir senaryo var mı? Anahtarların ve değerlerin benzersiz olduğunu farz edebilirsiniz.Dizi_search'in ardışık array_flip ve doğrudan aramadan daha hızlı olduğu bir senaryo var mı?

+0

Bu ilginç bir soru. Bunu kanıtlayan herhangi bir performans testiniz var mı? Ek olarak, bu kontrolü yaparken katı seçeneği kullanıyor musunuz? –

+0

@Daryl Gill soruyu neden düzenlediniz? Aslında N aramaları ve N aramaları yaptım, şimdi onu orijinal haline geri döndürürsem, tüm bu tartışma geçersiz olacak. – EnJayz

+1

Sadece şunu söylemek istiyorum: 'Anahtarların ve değerlerin benzersiz olduğunu varsayabilirsin: Bu çok önemli: eğer değerler eşsiz değilse,' array_flip' yaparken çeşitli değerler yüzünden bazı öğeleri kaybedersiniz. Aynı tuşta, ikinci olanlar eski olanların üzerine yazacaktır. –

cevap

7

Dizi anahtarları karmadır, bu nedenle onlara bakmak, karma işlevini çağırmak ve karma tablosuna dizine eklemeyi gerektirir. Yani array_flip(), O (N) 'dir ve bir dizi anahtarın O (1) olması, yani Y aramalarının O (Y) + O (N) olduğunu.

Dizi değerleri karma değil, bu nedenle arama yapmak için doğrusal arama gerekir. Bu O (N), yani Y aramaları O (N * Y).

Aranan değerlerin diziden eşit olarak dağıtıldığı varsayıldığında, ortalama doğrusal arama durumu N/2 öğelerini karşılaştırmalıdır. Yani, array_flip(), N elemanlarını incelemek zorunda olduğu için, 2 array_search() çağrısının zamanını almalıdır.

Karma masanın oluşturulmasında ekstra ek yük vardır. Ancak, PHP yazma üzerine yazma kullanır, bu nedenle array_flip() sırasında anahtarları veya değerleri kopyalamak zorunda kalmaz, bu yüzden çok da kötü değildir. Az sayıda arama için, ilk yöntem daha hızlı olabilir. Koparma noktasını bulmak için kıyaslamak zorundasın.

+0

Hiçbir zaman * tamamen * bir dizi anahtarının neden sabit zaman olduğunu anladım, ama bir dizi değeri ararken doğrusal (her ikisi de yıkanabilir olduğu varsayılarak)? –

+2

@Asad Değerler hashed olmadığından. Konumlara değer vermek için yine başka bir karma yapı eşleme değerine ihtiyacınız olacaktır. – Corbin

+1

Bunu açıklamak için cevabımı güncelledi. – Barmar

İlgili konular