SORU
18 Mayıs 2010, Salı


Nasıl Perl bir dizi belirli bir değeri varsa kontrol edebilirim?

Dizi boyunca yineleme olmadan bir dizide bir değerin varlığını kontrol etmenin bir yolunu bulmaya çalışıyorum.

Bir parametre için bir dosya okuyorum. Uğraşmak istemiyorum parametrelerin uzun bir listesi var. 1* *Bir dizide bu istenmeyen parametreleri yerleştirdim.

Yeni bir parametre okumak istiyorum ve eğer @badparams, içinde varsa değil bu süreç. Eğer varsa @badparams sonraki okuma gidin.

CEVAP
25 HAZİRAN 2011, CUMARTESİ


En iyi genel amaçlı - Özellikle kısa diziler (1000 parça) ve ihtiyaçlarına en uygun iyileştirmeleri ne emin isteyen programcılar.

# $value can be any regex. be safe
if ( grep( /^$value$/, @array ) ) {
  print "found it";
}

Grep eğer dizideki ilk değer ile eşleşiyorsa bile tüm değerleri geçtiği belirtilmiştir. Bu doğru, ancakgrep hala son derece hızlı çoğu durumda. Kısa diziler hakkında konuşuyorsun (1000'den daha az bileşen) sonra en algoritmalar oldukça hızlı zaten olacak. Eğer çok uzun diziler (1,000,000 öğeleri) bahsediyorsan grep kabul edilebilir hızlı, maddenin ilk bağımsız olup olmadığı ya da dizideki orta ya da son.

Artık diziler için optimizasyon Durumlarda:

Eğer dizi sıralanmışkullanın". ikili arama

Eğeraynı diziyi tekrar tekrar aranırbirçok kez, bir karma ilk kopyalayın ve karma kontrol edin. Eğer hafıza önemli ise, o zaman karma dizideki her bir öğeyi taşıyın. Daha verimli bellek ama orijinal dizi yok.

Eğeraynı değerleri tekrar tekrar aradıdizi içinde, tembel bir önbellek oluşturmak. her madde aranır gibi, ilk arama sonucu olmadığını kontrol edin, bir karma kalıcı olarak depolanan. eğer arama sonucunda karma bulunursa, o zaman dizi arama ve bu yüzden karma bulmak ve arama geçelim bir dahaki sefere karma) kalıcı sonuç koy.

Not: bu iyileştirme yalnızca uzun diziler ile uğraşırken daha hızlı olacaktır. Üzerinde optimize yok.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • jesiel santos

    jesiel santo

    15 Ocak 2009
  • MovieZoneET

    MovieZoneET

    22 Aralık 2009
  • WK

    WK

    9 Ocak 2006