Sektörde çalışırken big-O gerçekten bu konuyla alakalı mı?


65

Yaptığım her röportajda, büyük O notasyonu da dahil olmak üzere, karmaşıklığın matematiksel analizi üzerine bir sınav yaptım.

Büyük O analizinin sanayideki gelişmeye ne kadar uygun olduğu Gerçekten ne sıklıkta kullanıyorsunuz ve sorun için bilenmiş bir zihniyetin olması ne kadar gerekli?


5
@ MM01 Lisede ve üniversitede okudum. Bunu, bir Programcı bilgisinin yapı taşı olarak kabul etmeme rağmen, hiçbir zaman işimde kullanmadım.
sistem kasası

27
Bunu sorarken tam olarak hangi endüstriyi düşünüyorsunuz? Bir ay rover'ı veya bir blog platformu için kontrol kodu mu yazıyorsunuz?
Tim Mesaj

14
@systempuntoout, daha önce hiç olmadığı kadar hızlı olan bir algoritmayı asla seçmediniz mi?

3
@ MM01 - Bununla mücadele ediyorsanız, en kolay (basitleştirilmiş de olsa) açıklamalardan biri burada bulunabilir: rob-bell.net/2009/06/a-beginners-guide-to-big-o-notation
Tim Post

6
@ Sistem uyarısı, O-notasyonu anlama ve kullanma katı matematiksel kanıt anlamına gelmez, fakat basit bir ifadeyle algoritmanızın nasıl davrandığını iletebilir. 1D'de sıralamaya ihtiyacınız varsa, O (n log n) algoritması istersiniz. Bir Fibbonacci numarası uygulaması istiyorsanız, O (n) 'de çalışanı seçin. Açıkça yüksek sesle söylemeseniz bile, bu yine de son derece kullanışlı olan döngü ve özyineleme sayılarının yoğunlaştırılmış halidir. Çok fazla kelime kaydeder . (Ve nitpicky için - evet, çok büyük veya küçükse k da önemlidir).

Yanıtlar:


76

Benim sorum şu; bu test sektördeki gelişme ile ne kadar alakalı?

Hesaplanabilir karmaşıklık teorisinin sağlam bir şekilde anlaşılması (örn. Büyük O notasyonu) ölçeklenebilir algoritmalar, uygulamalar ve sistemler tasarlamak için esastır. Ölçeklenebilirlik, sektördeki bilgi işlem ile oldukça ilgili olduğu için büyük O notasyonu da öyledir.

Ne sıklıkta reeeally kullanıyorsunuz ve problem için honlanmış bir zihniyetin olması ne kadar gerekli?

Ne demek istediğini "tekrar kullan". Bir yandan, yazdığım yazılım için hesaplamalı karmaşıklığın resmi kanıtlarını asla yapmam. Öte yandan, çoğu gün ölçeklenebilirliğin potansiyel bir sorun olduğu uygulamalarla uğraşmam gerekiyor ve tasarım kararları karmaşıklık özelliklerine bağlı olarak (örneğin) uygun koleksiyon türlerinin seçilmesini içeriyor.

(Ben sürekli ölçeklenebilir sistemlerini uygulamak mümkün olup olmadığını bilmiyorum olmadan karmaşıklık teorisi sağlam bir anlayış. Bunun olmadığını düşünüyorum eğiliminde olacaktır.)


+1, çünkü prensipler önemlidir. Sektör deneyimime göre, dikkate alınması gereken, çok fazla durmayacak bir şey değil. Dedi - size (örnek) liste ekleme veya dizi ekleme veya kabarcık sıralama vs quicksort bir karşılaştırma hakkında sorulduğunda o zaman görüşmeci bilginizi ölçmek hedefliyor. Ve eğer karmaşıklık / çalışma zamanı / ölçeklenebilirlik / performans hakkında bile düşünürseniz, takdir edin Bunları düşünmüyorsanız / düşünemiyorsanız, nasıl yapılacağını bilemeyeceğiniz bazı işler olacaktır. Nadir, ancak zaman zaman ortaya çıkıyor.
hızla_

6
Bu mümkün, bu yüzden zifiri karanlıkta hedeflere ateş ediyor. Yeterli mermi verildiğinde, sonunda boğanın gözüne çarpacaksınız. Ardından, bir dahaki sefere ihtiyaç duyulan daha az mermi ile sonuçlanan çeşitli tasarımların ve uygulama faktörlerinin sonucunun yaşanması. Kötü benzetme, muhtemelen, ancak bazı yazılımların yazılma şeklini doğru bir şekilde açıklar . Cevabını oyladım.
Tim Mesaj

Ancak, “reeeally” performansının, karmaşıklıkla hiçbir ilgisi olmayan, ancak kontrolünüz dışındaki siyah kutulardan etkilendiğinden daha sık etkilendiğine dikkat edin. Bu kutuların zihinsel bir modeli, her şeyi optimize etmek için bir zorunluluktur. Bu düşünceler muhtemelen N'nin asla tekrar uyandırmayacağı şekilde sonsuz yaklaşırken geçersiz sayılır.
Dr. Belisarius

@Tim Post - "... ölçeklenebilir sistemleri tutarlı bir şekilde uygulayın ..." dedim . Tabii ki şanslı olabilirsin, ama sürekli olarak şanslı olamazsın. Ancak, gerçekten zeki / tecrübeli bir kişinin , bir ders kitabı veya bilgisayar bilimi kursu yakınında herhangi bir yere gitmeden sezgisel bir karmaşıklık anlayışı geliştirebileceğini kabul etmeye hazırım .
Stephen C

Yan not, bir erkek iş arkadaşının bir kadın iş arkadaşına, "Bir Büyük O sorunun varmış gibi" deyince , terimin diğer anlamını anlamadan, işyerinde bazı iyi gülüşlere yol açtı . Kastettiği ruhu aldı, ama kıkırdamadan duramadı.
Paul

36

Bunun nedeni, ölçeklenebilirliği göstermesidir .

O (n ^ 2) olan bir işlem O (n log n) olandan daha kötü ölçeklenir, ancak O (n ^ 3) ve hatta O (n!) 'Den daha iyi ölçeklenir.

Farkları bilmiyorsanız ve ne zaman uygulandıklarını bilmiyorsanız, fonksiyonelliğin doğru uygulamalarını seçmek ve test performansını üretim performansına dahil etmek için daha az uygun olursunuz.


EDIT: http://www.codinghorror.com/blog/2007/09/everything-is-fast-for-small-n.html adresinden 48nn n 3 ile karşılaştırılması (sırasıyla Programlama İncilerinden)

görüntü tanımını buraya girin


8
+1: Prosesinizi ölçeklemenin en kötü yolu, aynı anda bir sürü çığlık atan müşterinin ortaya çıkmasıdır.
Larry Coleman

22
@Larry, en azından çığlıklar müşteri sayısına göre doğrusal ölçeklenir!

10
Sanırım bu sadece büyük O'nun ne kadar önemli olduğunu gösteriyor: ses aslında O(log Customers)dB.
MSalters

4
@ MSalters, tamam, düzeltilmiş duruyorum: " Çığlık NUMBER , müşteri sayısına göre doğrusal olarak ölçeklenir". Ses seviyesi farklı bir konudur.

1
@ Thorbjørn Ravn Andersen: Bunun bir logaritmik skala olduğunu ima eden bazı çalışmaları okudum, bu yüzden bazı müşteri şikayet sınıfları bu kadar önemli! Müşteri tabanı ne kadar büyük olursa, o kadar çok insanın bu sorunu olduğunu ve sadece bir şey söylemediğini veya rekabete girmediğini belirtiyorlar.
Steven Evers

32

Bu ne yaptığınıza bağlı.

Web geliştiricileri (benim gibi) için bu genellikle çok önemlidir. Web uygulamalarının ölçeklenmesini istiyorsunuz. Uygulamanızın O (n ^ 2) ile ölçeklendirildiği bir darboğaz varsa ve sunucunuzun 1000 eşzamanlı kullanıcıyı işleyebileceği için bunun iyi olduğunu düşünüyorsun, umrumda değil. Mesele şu ki, iki kat daha fazla ele almak (sadece bir gecede gerçekleşmesi makul bir ihtimal), hesaplama gücünün 4 katına ihtiyacınız olacak. İdeal olarak web uygulamalarının O (n) 'de ölçeklendirilmesini istiyorsunuz, çünkü donanım makul bir sabit kullanıcı / sunucu oranında ucuzdur.

Genellikle 100.000 nesneye sahip olduğunuz uygulamalarda, büyük O gelip sizi yer. Zirvelere karşı son derece savunmasızsın. Örneğin, şu anda çok fazla veri işleyen bir uygulama olan 3D bir oyun üzerinde çalışıyorum. Render dışında, çarpışma kontrolü, navigasyon vb. Var. Sadece bariz şekilde ilerleyemezsiniz. Etkili algoritmalara ihtiyacınız var, çok fazla önbelleklemeye ihtiyacınız var, böylece daha az verimli olanlar amorti olur. Ve bunun gibi.

Elbette, yaptığınız şey bir arayüz tasarımcısında bir GUI'yi bir araya getirerek bir mobil uygulama yapmak gibi bir şeyse, bazı web servisleriyle bağlantı kurar ve bu kadar işte o zaman, asla karmaşıklıkla ilgili sorunlarınız olmaz. Çünkü aradığınız web servisleri zaten ilgileniyor.


Bir mobil uygulama yapmak bir GUI'yi bir araya getirme durumu değildir, ancak 2010'da bu ifadeyi yaptığınız için sizi affedeceğim :) Mimaride, iş parçacılığında, veri deposunda, ağ kuyruklarında, mobilde karmaşıklık var. Ancak ham Big O ilgisizdir (en azından iOS'ta) çünkü yerel veri yapıları ve algoritmaları kullanıyor olmalısınız.
PostCodeism

21

Aslında çalışma hayatımda kuralı hiçbir zaman resmen uygulamadım.

Ancak, bu kavram hakkında bilgi sahibi olmanız ve bir algoritma her tasarladığınızda sezgisel bir şekilde uygulamanız gerekir.

Kural:

Belirli bir görev için, resmi olarak hesaplamak isteniyorsa veya sezgisel olarak değerlendirmek için yeterli mi yoksa tamamen atlamak için yeterli olup olmadığını belirlemek için O notasyonuna yeterince aşina olmalısınız. Tıpkı diğer birçok temel matematiksel kavram gibi.


10

Belki de küçük bir hikaye, NEDEN gerekli olduğunu neden aydınlatıyor:

Üzerinde çalıştığım bir projede, her türlü belgenin basılmasından (etiketler, toplama listeleri vb.) Sorumlu bir program vardı. .ini tarzı dosya ve bu dosyaları okuyan ve bunları şablonlara doldurmuş başka bir bölüm. Bu, etiketler ve küçük listeler için oldukça iyi çalıştı (sadece birkaç alana sahip), ancak ~ 20 sayfalık "büyük" bir liste yazdırması gerektiğinde neredeyse 10 dakika sürdü. Çünkü bu ini dosyalarına erişmek O (n²) erişim zamanına neden oldu ve n yazdırılacak alan sayısıydı.

Bu programın orijinal programcıları O-notasyonunu anlamış olsalardı, asla bu şekilde yapamazlardı. Bu aptallığı bir karma ile değiştirmek, soooooooo'yu çok daha hızlı yaptı.


8

Büyük O performansı önemlidir, ancak büyük ölçüde içselleştirilmiştir.

Büyük-O sıralama ve arama performansı önemli değildir, çünkü insanlar genellikle sistem tarafından sağlananları kullanırlar ve bunlar olabildiğince iyi olacaktır (genel olarak yararlı olmaları gerektiği için). Farklı şeyler için daha verimli olan veri yapıları vardır, ancak bunlar genellikle genel ilkelere göre seçilebilir (ve genellikle modern dillere inşa edilir). Ölçeklendiren veya ölçeklenmeyen bazı algoritmalar vardır.

Sonuç, biçimsel konuların pratikte nadiren ortaya çıkmasıdır, ancak uygulama aynı ilkelere dayanmaktadır.


Eğer gerçekten fark Nerede bu kişi tarafından yazılan kodun bakarken olduğu henüz Big-O içselleştirilmiş ve bunların alt sistemi üretiminde korkunç derecede performansa sahip olduğunu şaşırmıştır. Temel bir anlayış bile, aynı iki dev dizide dört yuvalanmış foreach döngüsünü sorgulamanız için yeterlidir ...
eswald

6

IMHO, birçok bilgisayar bilimi programı, yabancı otların arasında dolaşan birçok öğrenciyi terk ediyor. Bu programlar hiçbir zaman hesaplama biliminin neyle ilgili olduğuna dair büyük bir tabloyu asla paylaşmaz. Öğrenciler, öğrendikleri kavramları nasıl uygulayacakları ile boğuşarak, gerçek dünyayla olan ilişkilerini çok az kavramak suretiyle endüstriye girerler.

Hesaplama biliminin kalbinin hesaplama hakkında akıl yürütme yeteneği olduğunu söyleyebilirim. Ve bunu yapmak için çeşitli yöntemler ve teknikler öğreniyorsunuz ve bunları birçok gerçek dünya probleminde bulunan prototipik ilkel olan soyutlanmış problemlere uyguluyorsunuz. İşin püf noktası, bu prototipik ilkelleri gerçek dünyaya saptamak ve daha sonra endişelenmeniz gereken gerçek konular olan doğruluk, karmaşıklık, zaman vb. Parçaların nasıl davrandığına dair içgörü, sık sık, tümün nasıl davrandığıyla ilgili fikir verir. Ve aynı genel yöntem ve teknikler, daha küçük, iyi soyutlanmış, iyi tanımlanmış parçalara sağlanan aynı titizlikle değil, bütününe de uygulanabilir. Ama nihayetinde, hesaplama bilimi, size makul olanı sunma yeteneğine sahiptir. Çeşitli koşullar altında nasıl davranacağına dair gerçek bir içgörü ile hesaplamalarınızı nasıl yapacağınızla ilgili kararlar.


5

Memo kendine!

Ben ve diğerleri, bu soruyu kendilerine düzenli olarak soruyorlar.

Sanırım bunu sormamızın asıl sebebi tembelleşmemizdi.

Bu bilgi hiçbir zaman eskimez veya eskimiş olmaz. Günden güne doğrudan uygulayamazsınız, ancak bilinçaltında kullanacaksınız ve tasarım kararlarınız üzerinde olumlu bir etkisi olacak. Bir gün sizi veya başkalarını saatlerce kodlama gününden kurtarabilir.

Daha fazla sorun 3. parti kütüphaneler ve araçlar tarafından kapsandığından ve gittikçe daha fazla geliştiricinin kullanımına açık olduğundan, kendinizi diğerlerinden ayırmak ve yeni problemleri çözmenize yardımcı olmak için bu bilgiyi bilmeniz gerekecektir.


5

Pek sayılmaz. Temel olarak, şimdiye kadar düşündüğüm tek zaman, veritabanına erişim. Genelde koda bakacağım ve "Bu n + 1 sorgu yapıyor, sadece 1 veya 2 yapacak şekilde değiştirmelisin" derim.

Verilerimin tümü bir veritabanından okunup kullanıcıya gösterildiğinden, çalıştığım veri miktarını doğrusal ve O (n ^ 2) algoritması arasındaki farkın güzel olduğu noktaya indirgemeye çalışıyorum ihmal edilebilir.

Bir sorun varsa, daha sonra profillenir ve giderilir.


1
Aslında bu geçici "n + 1" sorgusu olayının tehlikeli olduğunu düşünüyorum. Özellikle, n ^ d sorguları yapan (d> = 2 olan) "n + 1" olarak bırakılan ve bu da gerçekten korkunç bir durumun sadece kötü görünmesini sağlayan bir kod gördüm.
philosodad

3

Sizlere sorduğunuz üç soru ve bence kısa formdaki cevaplar, şimdiye kadar verilen uzun tartışmalara yardımcı olabilir.

Bu test sektördeki gelişme ile ne kadar ilişkili?

Sektöre bağlı.

Kod hızı veya kod alanının bir sorun olduğu her yerde, söz konusu endüstri ile tamamen ilgilidir. Genellikle bir rutinin ne kadar süreceğini veya ne kadar hafıza gerektireceğini (çevrimdışı / çevrimdışı) bilmeniz gerekir.

Ne sıklıkla kullanıyorsun?

Sektöre bağlı.

Performans ve ölçeklendirme eldeki işle ilgilenmiyorsa, o zaman nadiren, sadece ciddi bir performans kaybı olduğunda. Çok kullanılan kritik bir sistem için mühendis iseniz, muhtemelen her gün.

Problem için honlanmış bir zihniyetin olması ne kadar gerekli?

Tamamen gerekli.

Her gün ya da sadece korkunç koşullarda kullanmak zorunda kalabilirsiniz; ama bazen buna ihtiyaç duyulacak. Tercihen bir sorun ortaya çıkmadan önce tasarım sırasında, bir boğulma sisteminin çaresiz bir şekilde profillenmesi yerine.


3

Çok sık olduğunu söyleyebilirim. Genelde bir şeyin belirli bir büyük O olduğunu kanıtlamıyoruz , ancak fikri içselleştirdik ve belirli veri yapıları ve algoritmaları için büyük O garantilerini ezberledik / tanıdık ve belirli bir kullanım için en hızlı olanları seçiyoruz. Java koleksiyon kütüphanesi veya C ++ STL gibi tüm seçeneklerle dolu bir kütüphaneye sahip olmanıza yardımcı olur. Sen örtük ve doğal olarak büyük-O kullanmak her gün bir kullanmayı seçerken java.util.HashMap( O(1)yerine alanlarında arama) java.util.TreeMap( O(lg n)lookup) ve kesinlikle genelinde bir doğrusal arama çalıştırmak için değil seçerek java.util.LinkedList( O(n)Eğer sıralı erişim gerekmez şey için arama).

Biri en alt düzeyde bir uygulamayı seçtiğinde ve daha iyisini bilen biri geldiğinde ve kodunu gördüğünde, onları düzeltmek için kullandığımız kelimelerin bir parçası "uygulamanız ikinci dereceden zaman alıyor ancak bunu yaparak n-log-n zamanını başarabiliriz. bunun yerine "doğal ve otomatik olarak bir pizza siparişi için İngilizce dilini kullanırdık.


3

Evet

Resmi analizler yapmanız gerekmeyebilir, ancak en azından algoritma karmaşıklığının sırasını - ve bunun etrafındaki iki algoritmayı nasıl karşılaştıracağınızı - anlamsız bir çalışma yapmak ve iyi sonuç almak istiyorsanız kritik bir önem taşır.

Erken gelişimde iyi görünen iki farklı sistem üzerinde çalıştım, ancak donanımın diz çökmesine neden oldu, çünkü birisi O (n ^ 2) algoritması kullandı. Ve her iki durumda da, düzeltme bir O (n) algoritmasında önemsiz bir değişiklikti.


1

Muhtemelen tüketim için API geliştirdikleri yerlerde kullanılır. C ++ STL, algoritmalarına getirilen karmaşıklık kısıtlamaları olan birkaç API'den biridir. Ancak günlük çalışan programcı / kıdemli programcı / tasarımcı / mimar için zihinlerini çok fazla geçmiyor.


Herhangi bir iyi koleksiyon API'si bu garantileri verir, örneğin Java koleksiyonları API'sinin belgelerinde de bu garantiler vardır.
Ken Bloom,

1

Fikir iletmek dışında önemli olduğunu bulamadım ve performans açısından kritik alanlarda çalışıyorum (ışın izleme, görüntü ve ağ işleme, parçacık sistemleri, fizik motorları, vb.) Ve birçok özel algoritma ve veri yapısı geliştirmek zorunda kaldım Ar-Ge'de çalışırken. Bu alanlarda, genellikle çok verimli veri yapıları ve algoritmaları bir avuç yepyeni üstün ürünler sunarken, dünün algoritmaları mevcut ürünleri eski hale getirir, bu yüzden her zaman işleri daha verimli yapma arayışı vardır. Yine de bir uyarı olarak, tasarladığım algoritmalar hakkında hiçbir makale yayınlamadım. Hepsi tescilliydi. Yapsaydım, kanıtları formüle etmek için bir matematikçinin yardımına ihtiyacım olurdu.

Yine de benim görüşüme göre, her yineleme için hesaplamalı çalışma miktarı, algoritma gerçekten zayıf bir şekilde ölçeklenmediği sürece, algoritmanın ölçeklenebilirliğinden çok daha fazla ilgi çekmektedir. Birisi ışın izleme için en son teknolojiyi kullanırsa, algoritmik karmaşıklıktan çok veriyi nasıl temsil ettiği ve eriştiği gibi hesaplama teknikleriyle daha fazla ilgilenirim çünkü makul ölçeklendirilebilirlik zaten bu rekabetçi ve yenilikçi senaryoda verilmiştir. Ölçeklemeyen algoritmalar ile rekabet edemezsin.

Tabii ki, ikinci dereceden karmaşıklığı lineermik ile karşılaştırıyorsanız, bu çok büyük bir farktır. Ancak alanımdaki çoğu insan epik bir girdiye kuadratik karmaşıklık algoritması uygulamaktan kaçınmaya yetecek kadar yetkin. Bu nedenle ölçeklenebilirlik genellikle derinden ima edilir ve daha anlamlı ve ilginç sorular şu şekilde olur: “GPGPU'yu kullandınız mı? SIMD? Paralel olarak mı çalışıyor? Verileri nasıl temsil ettiniz? Önbellek dostu erişim düzenleri için yeniden düzenlediniz mi? ne kadar sürer? Bu davayı güçlü bir şekilde ele alabilir mi? Belirli işlemleri mi yapıyorsunuz yoksa hepsini tek seferde mi yapıyorsunuz? ”

Doğrusal bir algoritma bile, eğer eski belleğe daha optimal bir şekilde erişirse, örneğin, çoklu okuma ve / veya SIMD için daha uygunsa, bir doğrusal zaman algoritmasından daha iyi bir performans sergileyebilir. Bazen doğrusal bir algoritma bile bu nedenlerden dolayı logaritmik bir algoritmadan daha iyi performans gösterebilir ve doğal olarak doğrusal zaman algoritmaları ufacık girdiler için logaritmik olanlardan daha iyi performans gösterir.

Bu yüzden benim için önemli olan, veri temsilleri (bellek düzenleri, sıcak / soğuk alan bölmeli erişim modelleri, vb.), Çoklu okuma, SIMD ve zaman zaman GPGPU gibi bazı kişilerin "mikro optimizasyonlar" olarak adlandırdığı şey. Her zaman yeni kağıtların yayınlandığı her şey için son teknoloji algoritmaları kullanmak için zaten herkesin yeteri kadar yetkin olduğu bir alanda, algoritmik sihirbazları yenmedeki rekabet üstünlüğünüz algoritmik karmaşıklıktaki gelişmelerden daha doğrudan gelmiyor hesaplamalı verimlilik.

Alanım mükemmel matematikçiler tarafından yönetiliyor, ancak her zaman yaptıklarının hesap maliyetini ya da kodu hızlandırmak için birçok alt düzey numarayı bilenler değil. Bu genellikle benim için çok daha az karmaşık olmasına rağmen daha hızlı ve daha sıkı algoritmalar ve veri yapıları geliştirmemde benim için bir avantaj. Donanımın neye benzediğini, bitlere ve baytlara karşı oynuyorum ve gerçekten karmaşık olan algoritmadan biraz daha fazla iş tekrarı yapıyor olsam bile, her işin yinelenmesini çok daha ucuz hale getiriyorum - benim durumumdaki iş çok daha ucuz. Yazdığım kod da çok daha basit olma eğilimindedir. İnsanlar basit algoritmaların ve veri yapılarının mikro-optimize edilmiş versiyonlarının anlaşılmasının ve sürdürülmesinin zor olduğunu düşünüyorsa,

Temel bir örnek olarak, çarpışma tespiti ve gereksiz noktaların giderilmesi için şirketimizde bir KD ağacından daha iyi performans gösteren basit bir ızgara yapısı ile karşılaştım. Aptal ham şebekem, algoritmik olarak çok daha az karmaşıktı ve medyan noktasını bulma yöntemiyle KD-ağacını uygulayan adamdan daha matematiksel ve algoritmik olarak daha aptalca davrandım, ancak sadece şebekemin bellek kullanımını ve erişim modellerini ayarladım. çok daha sofistike bir şeyi daha iyi yapmak için yeterliydi.

Benden daha zeki insanlar tarafından yönetilen bir alanda hayatta kalmama izin veren bir diğer avantaj, aynı şekilde geliştirdiğim yazılımı kullandığım için kullanıcının nasıl çalıştığını gerçekten anlamak. Bu bana gerçekten kullanıcı çıkarlarıyla hemen uyum sağlayan algoritmalar için fikirler veriyor. Temel bir örnek olarak, çoğu insan mekansal indeksleme kullanarak çarpışma tespiti gibi şeyleri hızlandırmaya çalışıyor. Örneğin, birkaç yıl önce organik modeller için basit bir kariyer şekillendirici gözlem yaptım, örneğin, eğer bir karakter ellerini yüzüne koyarsa, mekansal bir indeksleme yapısının düğümleri bölmek ve karakterden pahalı güncellemeler yapmak isteyeceği sonra elini onun yüzünden çıkardı. Bunun yerine, tepe konumlarından ziyade bağlantı verilerini temel alarak bölümlenirseniz, ağacı hızla bölmek ya da yeniden dengelemek için çok hızlı bir şekilde güncellenen ve asla yeniden dengelenmesi gerekmeyen kararlı bir hiyerarşik yapıya sahip olabilirsiniz (sadece sınırlayıcı kutuları her animasyon karesini güncellemek zorunda) Temel kavramı anladılarsa, ancak matematikçilerden kaçan, bir şeyi bir şey düşünemediklerinden, kullanıcıların nasıl çalıştığına ve sadece geometrinin özellikleri hakkında çok fazla düşündükleri ve ne kadar geometri düşündükleri ile ilgili olanları anlayabilirlerdi. yaygın olarak kullanıldı. Genel hesaplama bilgisine ve kullanıcı sonu bilgisine algoritmik sihirbazlıktan daha çok eğilerek yeterince iyi geçiniyorum. Her neyse, algoritmik karmaşıklığa odaklanmanın gerçekten önemli olduğunu bulamadım.


0

Evet, sektördeki karmaşıklık önemlidir. Kritik bir yolun N kare olarak ölçeklendirildiği bir şey tasarlarsanız (sistemin sayısını iki katına çıkarır), ölçekleme darboğazınıza N'de ölçeklenen bir şeye sahip olduğunuzdan çok daha hızlı bir şekilde vursunuz.

Ancak, genellikle bir şeyin belirli bir karmaşıklıkta olduğuna dair doğru, resmi, kanıt olarak yapılmaz, bu nedenle bir işlem modelinin ne kadar karmaşık olduğu konusunda iyi bir sezgiye sahip olmak iyi bir başlangıçtır.


0

Matematiksel bir perspektiften asla büyük O düşünmem, istenmediği sürece asla büyük O düşünmem. Sadece kafamda bir algoritma görüyorum ve bunun kötü olup olmadığını anlayabiliyorum, çünkü her N için hafızadan çoklu döngüler yapıyor, ya da bölüp fethetir ya da bunun gibi bir şey varsa. Gerekirse, birkaç saniye içinde bunu büyük O gösterimine çevirebilirim, ancak algoritma / kabın bellekte nasıl çalıştığını bilmek benim için matematiksel bakış açısını düşünmekten daha kolay.


-3

Görüşmelerde sorulan sorular, bir şeyler açıklayıp mantıklı bir şekilde düşünebildiğinizi öğrenmek için var . Görüşme yapan kişi ayrıca , ilgili bir sorunu çözmek için bildiklerinizi işe alıp alamayacağınızı da bulmaya çalışıyor .

Değerli bir yazılım mühendisliği incelemesi yapmış olan herkes “Big O” ile karşılaşacak, “Big O” hakkında iyi bir soruyu cevaplamak için standart veri yapılarını ve algoritmalarını da anlamalısınız.

Bir personel için mülakat yaparken, belirli bir ayrıntılı beceri kümesini zaten bilen birini değil, işi hızlı bir şekilde öğrenebilecek birini arıyorsunuz, bu nedenle hem görüşmecinin hem de görüşmecinin ortak bir anlayışa sahip olduğu soruları seçmek çok zor olabilir nın-nin.

Bu nedenle “büyük O” ile ilgili sorular görüşme süreciyle çok ilgili olabilir.

En azından her yıl bir bilgisayar programcısı olarak uzun zamandır, birisinin kullanması gereken doğru veri yapılarını ve algoritmalarını anlamadığı için yavaş olan kodu düzeltmek zorunda kaldım, ancak bu problemleri Big O'nun detaylı bir anlayışına sahip olmadan çözebilirsiniz. Ancak Büyük O çadırını anlayan insanlar, ilk başta bu sorunlardan kaçınmıyor.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.