SORU
19 Temmuz 2011, Salı


Dizeleri değişmez .NET, o zaman neden Alt O(n) zaman alır mı?

Bu dizeleri verilmiştir değişmez .NET, string.Substring() O alır böyle(substring.Length) sefer O(1) yerine tasarlanmıştır neden merak ediyorum?

yani ne varsa artıları ve eksileri vardı?

CEVAP
19 Temmuz 2011, Salı


Bu soru o kadar çok sevdim ki, ben sadece bir yazı yazdı. GÜNCELLEME: Strings, immutability and persistence bkz


Kısa cevap:O(n) Eğer n büyük büyümek mi yoksa O(1) ' dir.Çoğu insan karmaşıklığı, asimptotik olduğunu nasıl büyür tellerden küçük dizeleri, yani özütamamen alakasız.

Uzun cevap:

Değişmez bir veri yapısı inşa bu tür işlemleri üzerine bir örnek çalışma izni yeniden kullanma bellek aslı ile sadece küçük bir miktar (genellikle O(1) veya O(lg n)) kopyalanması veya yeni bir ayırma denir "kalıcı" değişmez bir veri yapısı. Dizeleri .NET değişmez; soru aslında "neden kalıcı olmayan onlar"?

İşlemleri baktığınızda çünkügenellikledizeleri üzerinde yapılır .NET programlar, ilgili her şekildepek kötüsadece tamamen yeni bir dizi yapmak için.Karmaşık verileri kalıcı bir yapı inşa masraf ve zorluk kendisi için ödeme yapmaz.

İnsanlar genellikle "" kısa bir dize ayıklamak için, On ya da yirmi karakterleri biraz daha uzun bir ip ... dışında belki bir kaç yüz karakter. -- dize kullanabilirsiniz Virgülle ayrılmış bir dosya içinde bir metin satırı var ve bir soyadı olan üçüncü alan, ayıklamak istediğiniz. Hattı bir kaç yüz karakter uzunluğunda belki olacak, adını birkaç düzine olacak. Elli bayt dize ayırma ve bellek kopyalamaşaşırtıcı derecede hızlımodern donanım. Varolan bir dize, artı bir uzunluk ortasına bir işaretçi içeren yeni bir veri yapısı yapıyorayrıcaşaşırtıcı derecede hızlı alakasız; yeterince "tanımı gereği yeterince hızlı." hızlı

Bu nedenle çıkarılan genellikle boyut olarak küçük ve boyu kısa; çöp toplayıcı yakında onları geri kazanmak için gidiyor, ve en başta yığını üzerinde fazla yer almak istemediler. Yani kullanarak kalıcı bir strateji bu teşvik yeniden en anısı değil de bir kazan; tüm yaptıkların yapılır çöp toplayıcı almak daha yavaş, çünkü artık endişe edecek işleme iç işaretçiler.

Eğer insanlar genellikle dizeleri mi dize işlemleri tamamen farklı olsaydı, o anlamda kalıcı bir yaklaşım ile gitmek olurdu. Eğer insanlar genellikle vardı milyon karakter dizeleri, ve açılan binlerce örtüşen dizeleri ile boyutlarda yüz-bin-karakter aralığı, ve bu nedenle uzun ömürlü bir zaman yığını, o zaman mükemmel yapardı duygusu ile kalıcı bir alt yaklaşım; olur gereksiz ve aptalca değil. Amaçoğu iş hattı programcılar bir şey bile belli belirsiz bu tür şeyleri sever. .NET İnsan Genom Projesi ihtiyaçları için uygun bir platform değil; DNA analizi programcılar bu dize kullanım özellikleri her gün sorunları çözmek için var; oran değil. Kimi birkaç yakından uyan kendi kalıcı veri yapıları oluşturmakonlarınkullanım senaryoları.

Örneğin, benim takım-the-fly üzerinde C analizi yapan programlar yazar# ve yazdığınız gibi VB kodu. Kod dosyaları bunlardan bazılarımuazzamve böylece(n) string işleme dizeleri ya da ekleme veya silme karakterleri ayıklamak için yapıyor olamayız. Bize izin veren bir metin tampon düzenlemeler temsil eden hızlı ve etkili bir şekilde yeniden kullanmak için kalıcı sabit veri yapıları bir avuç varolan dize veri toplu kurdukvetipik bir düzen üzerine sözcüksel ve sözdizimsel analizleri mevcut. Bunu çözmek için zor bir sorun olduğunu ve çözümünün dar C belirli bir etki alanı için özel tasarlanmış# ve kod düzenleme VB. Yerleşik dize türü bizim için bu sorunu çözmek için beklemek gerçekçi olacaktır.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • El SalvaLobo

    El SalvaLobo

    10 Temmuz 2006
  • Khan Academy

    Khan Academy

    17 Kasım 2006
  • sghaff1

    sghaff1

    23 Mart 2009