it-swarm.dev

Big-O endüstride çalışırken gerçekten bu kadar önemli mi?

İçinde bulunduğum her röportajda, big-O gösterimi de dahil olmak üzere karmaşıklığın matematiksel analizine karıştım.

Big-O analizi endüstrideki gelişmeyle ne kadar ilgilidir? Gerçekten ne sıklıkla kullanıyorsunuz ve sorun için honlanmış bir zihniyete sahip olmak ne kadar gerekli?

66
MM01

Benim sorum şu, bu test endüstrideki gelişmeyle ne kadar ilgili?

Hesaplanabilir karmaşıklık teorisinin (örn. Büyük O gösterimi) sağlam bir şekilde anlaşılması, ölçeklenebilir algoritmalar, uygulamalar ve sistemler tasarlamak için gereklidir. Ölçeklenebilirlik endüstride bilgi işlemle yüksek oranda alakalı olduğundan, büyük O gösterimi de geçerlidir.

Ne sıklıkta kullanıyorsunuz ve sorun için honlanmış bir zihniyete sahip olmak ne kadar gerekli?

Ne demek istediğini "gerçekten kullan" ile bağlıdır. Bir yandan, yazdığım yazılım için hiçbir zaman hesaplama karmaşıklığının resmi kanıtını yapmam. Öte yandan, çoğu gün ölçeklenebilirliğin potansiyel bir endişe kaynağı olduğu uygulamalar ile uğraşmak zorundayım ve tasarım kararları, karmaşıklık özelliklerine göre (örneğin) uygun toplama türlerinin seçilmesini içerir.

(Ölçeklenebilir sistemlerin tutarlı bir şekilde uygulanmasının mümkün olup olmadığını bilmiyorum olmadan karmaşıklık teorisinin sağlam bir şekilde anlaşılması. Bunun olmadığını düşünmeye meyilli olurum.)

76
Stephen C

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

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

Farklılıkları bilmiyorsanız ve ne zaman uygulandıklarında, doğru işlevsellik uygulamalarını seçmenin yanı sıra test performansını üretim performansına tahmin etmek için daha az uygun olursunuz.


EDIT: 48n n ^ 3 ile http://www.codinghorror.com/blog/2007/09/everything-is-fast-for-small-n.html (içinde dönüş Programlama İncileridir)

enter image description here

36
user1249

Ne yaptığınıza bağlıdır.

Web geliştiricileri için (benim gibi) bu genellikle çok önemlidir. Web uygulamalarının ölçeklendirilmesini istiyorsunuz. Uygulamanızda O (n ^ 2) ile ölçeklenen bir darboğaz varsa ve bunun iyi olduğunu düşünüyorsanız, sunucunuz aynı anda 1000 kullanıcıyı işleyebileceğinden, umursamanıza gerek yok gibi görünüyor. Mesele şu ki, sadece iki kat daha fazla işlemek (gece boyunca gerçekleşmesi makul), hesaplama gücünün 4 katına ihtiyacınız olacak. İdeal olarak web uygulamalarının O (n) değerinde ölçeklendirilmesini istersiniz, çünkü donanım makul bir sabit kullanıcı/sunucu oranında ucuzdur.

Genellikle 100.000 nesnenin olduğu uygulamalarda, büyük O gelir ve sizi yer. Zirvelere karşı oldukça savunmasızsınız. Örneğin, şu anda bir sürü veri üzerinde çalışan bir uygulama olan bir 3D oyun üzerinde çalışıyorum. Render dışında, çarpışma kontrolü, navigasyon vb. Var. Etkili algoritmalara ihtiyacınız var, daha az verimli olanları amortize etmek için çok fazla önbelleğe ihtiyacınız var. Ve bunun gibi.

Tabii ki yaptığınız şey, bir arayüz tasarımcısında bir GUI'yi bir araya getirerek bir mobil uygulama yapmak gibi bir şeyse, bunu bazı web hizmetleriyle bağlayın ve işte o zaman, karmaşıklıkla ilgili hiçbir zaman sorun yaşamayacaksınız. Çünkü aradığınız web hizmetleri zaten bununla ilgileniyor.

32
back2dos

Çalışma hayatımda hiçbir zaman resmi olarak kuralı uygulamadım.

Bununla birlikte, bu konsepti tanımanız ve her algoritma tasarladığınızda bunu sezgisel bir şekilde uygulamanız gerekir.

Kural şudur:

Belirli bir görev için, resmi olarak hesaplamak gerekiyorsa veya bunu sezgisel olarak değerlendirmek ya da tamamen atlayabilirseniz, O gösterimini tanımlayabilecek kadar aşina olmalısınız. Tıpkı diğer birçok temel matematiksel kavram gibi.

22
Wizard79

Belki de küçük bir hikaye size neden KESİNLİKLE IS gereklidir:

Çalıştığım bir projede, her türlü belgeyi yazdırmaktan sorumlu bir program vardı (etiketler, toplama listeleri vb.) Bu program, biri veritabanından gerekli tüm verileri okuyan ve bir belgeye yazmaktan oluşan iki bölümden oluşuyordu. .ini tarzı dosya ve bu dosyaları okuyan ve şablonlara dolduran başka bir bölüm. Bu, etiketler ve küçük listeler (sadece birkaç alanla) için oldukça iyi çalıştı, ancak ~ 20 sayfalık "büyük" bir liste yazdırmak zorunda kaldığında neredeyse 10 dakika çalıştı. Bu ini dosyalarına erişim O (n²) erişim süreleriyle sonuçlandığından, n yazdırılacak alan sayısıdır.

Bu programın orijinal programcıları O gösterimini anlamış olsaydı, bunu asla bu şekilde yapmazlardı. Bu aptallığı bir hashtable ile değiştirmek, soooooooo'yu çok daha hızlı hale getirdi.

10
user281377

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

Sıralama ve aramanın Big-O performansı önemli değildir, çünkü insanlar genellikle sistem tarafından sağlananları kullanırlar ve bunlar olabildiğince iyi olacaktır (genellikle yararlı olmaları gerektiği göz önüne alındığında). Farklı şeyler için daha verimli olan veri yapıları vardır, ancak bunlar genellikle genel ilkelere göre seçilebilir (ve tipik olarak modern dillere yerleştirilir). Ölçeklenen veya ölçeklemeyen bazı algoritmalar vardır.

Sonuç olarak, resmi konular nadiren uygulamada ortaya çıkmaktadır, ancak uygulama aynı prensipler üzerine inşa edilmiştir.

8
David Thornley

IMHO birçok bilgisayar bilimi programı, birçok öğrenciyi otların arasında dolaşmaya bırakıyor. Bu programlar hiçbir zaman hesaplama biliminin neyle ilgili olduğunun büyük resmini iletmez. Öğrenciler, öğrendikleri kavramların nasıl uygulanacağıyla boğuşarak sektöre girer ve gerçek dünyayla olan ilişkilerine dair çok az fikir sahibi olurlar.

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 öğrenir ve bunları birçok gerçek dünya probleminde bulunan prototip ilkel olan soyutlanmış problemlere uygularsınız. İşin püf noktası, bu prototip ilkelleri gerçek dünyada tespit etmektir ve daha sonra doğruluk, karmaşıklık, zaman vb. Parçaların nasıl davrandığına dair fikir, sık sık bütünün nasıl davrandığına dair fikir verir. Ve aynı genel yöntemler ve teknikler, daha küçük, iyi soyutlanmış, iyi tanımlanmış parçalara verilen titizlikle değil, bütüne de uygulanabilir. Ama sonuçta, hesaplama bilimi, çeşitli koşullar altında nasıl davranacağına dair gerçek bir kavrayışla, hesaplamanızı nasıl düzenleyeceğiniz konusunda makul kararlar verme yeteneğine sahiptir.

7
Ziffusion

Kendine not !:

Ben ve daha birçokları kendilerine bu soruyu düzenli olarak soruyoruz.

Bence bunu sormamızın asıl nedeni tembelleşmemiz.

Bu bilgi asla tarih alamaz veya modası geçmez. Doğrudan günlük bazda uygulayamazsınız, ancak bilinçaltında kullanacaksınız ve tasarım kararlarınız üzerinde olumlu bir etkisi olacaktır. Bir gün sizi veya başkalarını saatlerce ve günlerce kodlamadan kurtarabilir.

Üçüncü taraf kütüphaneler ve araçlar tarafından daha fazla sorun kapsandığından ve daha fazla geliştirici tarafından kullanılabilir olduğundan, kendinizi diğerlerinden ayırmak ve yeni sorunları çözmeye yardımcı olmak için bu bilgiyi bilmeniz gerekecektir.

5
Conor

Pek sayılmaz. Temelde bu konuda sadece düşündüğüm zaman veritabanına erişirken. Genellikle koda bakacağım ve "Bu n + 1 sorgu yapıyor, sadece 1 veya 2 yapmak için değiştirmelisin" diyorum

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

Bir sorun varsa daha sonra profil oluşturur ve düzeltiriz.

5
Greg

Üç soru sordunuz ve bence kısa biçimli cevaplar şimdiye kadar verilen uzun tartışmalara yardımcı olabilir.

Bu test endüstrideki gelişmeyle ne kadar ilgili?

Sektöre bağlı.

Kod hızının veya kod alanının bir sorun olduğu her yerde, ilgili sektörle tamamen ilgilidir. Genellikle bir rutinin ne kadar süreceğini veya ne kadar bellek (açık/çevrimdışı) gerektireceğini bilmeniz gerekir.

Ne sıklıkla kullanıyorsunuz?

Sektöre bağlı.

Performans ve ölçeklendirme, eldeki iş için çok az endişe ediyorsa, nadiren, ancak ciddi bir performans eksikliği olduğunda. Çok kullanılan bir kritik sistem için mühendisseniz, muhtemelen her gün.

Sorun için honlanmış bir zihniyete sahip olmak ne kadar gereklidir?

Tamamen gerekli.

Her gün veya sadece korkunç koşullarda kullanmak zorunda kalabilirsiniz; ancak bazen buna ihtiyaç duyulacaktır. Tercihen bir sorun gelmeden önce tasarım sırasında, bir boğulma sistemini umutsuzca profillemekten daha.

3
Orbling

Çok sık olduğunu söyleyebilirim. Genelde bir şeyin belirli bir büyük O'ya sahip olduğunu kanıtlamıyoruz , ancak fikri içselleştirdik ve büyük O garantilerini ezberledik/tanıdık belirli veri yapıları ve algoritmalar için 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. Örtük ve doğal olarak big-O her gün kullanınJava.util.HashMap (O(1) araması yerine Java.util.TreeMap (O(lg n) arama) kullanmayı seçtiğinizde ve kesinlikle çalıştırmamayı seçtiğinizde sıralı erişime ihtiyacınız olmayan bir şey için Java.util.LinkedList (O(n) arama) arasında doğrusal bir arama.

Birisi yetersiz bir uygulama seçtiğinde ve daha iyisini bilen biri gelir ve kodunu görürse, bunları düzeltmek bizim kelime dağarcığımızın bir parçasıdır "uygulamanız ikinci dereceden zaman alır, ancak bunu bunu yaparak n-log-n zamanına indirebiliriz bunun yerine "pizzayı sipariş etmek için İngilizceyi doğal ve otomatik olarak kullanırız.

3
Ken Bloom

Evet

Resmi analizler yapmak zorunda kalmayabilirsiniz, 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ı anlamak için önemsiz bir iş yapmak ve iyi sonuç vermek istiyorsanız kritiktir.

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

3
Bob Murphy

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

1
sashang

Fikirleri iletmek dışında önemli bulmadım ve performans açısından kritik alanlarda (ışın izleme, görüntü ve ağ işleme, parçacık sistemleri, fizik motorları, vb.) Çalışıyorum ve çok sayıda özel algoritma ve veri yapısı tasarlamak zorunda kaldım Ar-Ge'de çalışırken. Bu alanlarda, genellikle bir avuç çok verimli veri yapısı ve algoritması yepyeni yeni ürünler sunabilirken, dünün algoritmaları mevcut ürünleri geçersiz kılar, bu nedenle her zaman işleri daha verimli bir şekilde yapma arayışı vardır. Ancak bir uyarı olarak, geliştirdiğim algoritmalarla ilgili hiç bir makale yayınlamadım. Hepsi tescilliydi. Eğer yapsaydım, kanıtları formüle etmek için bir matematikçinin yardımına ihtiyacım olurdu.

Ancak bence, algoritma gerçekten zayıf ölçeklenmedikçe, yineleme başına hesaplamalı çalışma miktarı algoritmanın ölçeklenebilirliğinden daha fazla ilgi çekmektedir. Birisi raytracing için son teknoloji bir teknik bulursa, algoritmik karmaşıklıktan ziyade verileri nasıl temsil ettikleri ve verilere eriştikleri gibi hesaplama teknikleriyle daha fazla ilgileniyorum, çünkü bu rekabetçi ve yenilikçi senaryoda makul ölçeklenebilirlik zaten verilmiştir. Ölçeklenmeyen algoritmalar üreterek rekabet edemezsiniz.

Tabii ki kuadratik karmaşıklığı lineeritmik ile karşılaştırıyorsanız, bu büyük bir farktır. Ancak alanımdaki çoğu insan destansı bir girdiye kuadratik karmaşıklık algoritması uygulamaktan kaçınacak kadar yetkin. Dolayısıyla ölçeklenebilirlik genellikle derinden ima edilir ve daha anlamlı ve ilginç sorular şöyle olur: "GPGPU kullandınız mı? SIMD? Paralel çalışıyor mu? Verileri nasıl temsil ettiniz? Önbellek dostu olarak yeniden düzenlediniz mi? erişim kalıpları? Ne kadar bellek gerekiyor? Bu durumu sağlam bir şekilde ele alabilir mi? Belirli işlemleri erteliyor musunuz veya hepsini tek seferde mi yapıyorsunuz? "

Birincisi belleğe daha uygun bir düzende, örneğin çok iş parçacıklı ve/veya SIMD için daha uygun bir şekilde erişirse, bir doğrusal-zaman algoritması bile bir doğrusal-zaman algoritmasından daha iyi performans gösterebilir. Bazen doğrusal bir algoritma bile bu nedenlerle bir logaritmik 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.

Bana göre daha önemli olan, veri temsili (bellek düzenleri, sıcak/soğuk alan bölmeli erişim modelleri, vb.), Çoklu iş parçacığı, SIMD ve bazen GPGPU gibi bazı kişilerin "mikro optimizasyon" olarak adlandırabileceği şeydir. Herkesin her zaman yeni kağıtların yayınlandığı her şey için son teknoloji algoritmaları kullanmaya yetecek kadar yetkin olduğu bir alanda, algoritmik sihirbazları yenmek için rekabet gücünüz, algoritmik karmaşıklıktaki gelişmelerden daha doğrudan gelmez. hesaplama verimliliği.

Alanım parlak matematikçiler tarafından yönetiliyor, ancak her zaman yaptıkları şeyin hesaplama maliyetini veya kodu hızlandırmak için daha düşük seviye hileleri bilenler değil. Bu, benim çok daha az karmaşık olmasına rağmen, daha hızlı ve daha sıkı algoritmalar ve veri yapıları tasarlama konusunda benim üstünlüğüm. Donanımın sevdiği şeylere, bitlere ve baytlara doğru oynuyorum ve gerçekten sofistike algoritmadan daha fazla iş yinelemesi yapıyor olsam bile, işin her yinelemesini çok daha ucuz hale getiriyorum - benim durumumdaki çalışma büyük ölçüde daha ucuz. Yazdığım kod da çok daha basittir. İnsanlar basit algoritmaların ve veri yapılarının mikro optimize edilmiş sürümlerinin anlaşılması ve sürdürülmesinin zor olduğunu düşünüyorlarsa, adımlarını matematiksel olarak tanımlayan 20 sayfalık belgelerle sektörde daha önce hiç görülmemiş egzotik örgü ile ilgili algoritmalar ve veri yapıları koleksiyonunu anlamaya ve sürdürmeye çalışın. .

Temel bir örnek olarak, çarpışma tespiti ve yedek nokta kaldırma için şirketimizde bir KD ağacından daha iyi performans gösteren basit bir ızgara yapısı buldum. Aptal ham ızgaram algoritmik olarak çok daha az karmaşıktı ve KD-ağacını medyan noktayı bulmanın yeni yolu ile uygulayan adamdan matematiksel ve algoritmik olarak çok daha fazla saygıyım, ancak ızgaramın bellek kullanımını ve erişim kalıplarını ayarladım ve çok daha sofistike bir şeyden daha iyi performans göstermek için yeterliydi.

Benden çok daha zeki insanların egemen olduğu bir alanda hayatta kalmamı sağlayan başka bir Edge de, 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ı ilgi alanlarına çok yakın hizalanan algoritmalar için fikirler veriyor. Orada temel bir örnek olarak, çoğu insan mekansal indeksleme kullanarak çarpışma algılama gibi şeyleri hızlandırmaya çalışır. Organik modeller için neredeyse birkaç on yıl önce basit bir kariyer şekillendirme gözlemi yaptım, örneğin, bir karakter ellerini yüzüne yerleştirirse, bir uzamsal indeksleme yapısı düğümleri ayırmak ve karakter varsa pahalı güncellemeler yapmak zorunda kalacaktı sonra elini yüzünden çıkarttı. Bunun yerine, köşe konumlarından ziyade bağlantı verilerine dayalı olarak bölümleme yaparsanız, çok hızlı güncellenen ve ağacı ayırmak veya yeniden dengelemek zorunda kalmayacak sabit bir hiyerarşik yapı elde edebilirsiniz (yalnızca animasyonun her karesini sınırlayıcı kutuları güncellemeniz gerekir). .. bunun gibi şeyler - ağır matematiksel altyapıya sahip olmayan bir çocuk temel kavramı anladılarsa ortaya çıkabilirler, ancak matematiği kullananlardan şeyleri kullanıcıların nasıl bu kadar yakın bir şekilde düşünmediklerinden kaçındılarsa geometrinin yaygın olarak nasıl kullanıldığı değil, sadece geometrinin özellikleri hakkında çok fazla düşünüyorlardı. Genel hesaplama bilgisine ve kullanıcı sonu bilgisine algoritmik sihirbazdan daha fazla eğilerek yeterince iyi geçiniyorum. Her neyse, algoritmik karmaşıklığa odaklanmayı gerçekten önemli bulmadım.

1
user204677

Büyük O'yu asla matematiksel bir perspektifle düşünmüyorum, sormadıkça büyük O'yu asla düşünmüyorum. Sadece kafamda bir algoritma görüyorum ve bunun kötü olup olmadığını anlayabiliyorum çünkü her N için bellekte birden fazla döngü yapıyor mu, yoksa bölünüyor ve fethediyor mu yoksa böyle bir şey. Gerekirse, bunu birkaç saniye içinde büyük O notasyonuna çevirebilirim, ancak algoritma/kabın bellekle nasıl çalıştığını bilmek, matematik perspektifini düşünmekten daha kolay.

0
Coder

Evet, endüstride karmaşıklık önemlidir. Kritik bir yolun N kare olarak ölçeklendiği bir şeyi tasarlarsanız (bir şeyin sayısının iki katına çıkarılması sistemi yüklü olarak dört kez yapar), ölçekleme darboğazınızı N'de ölçeklenen bir şeyden çok daha hızlı vurursunuz.

Bununla birlikte, genellikle bir şeyin belirli bir karmaşıklıkta olduğu doğru, resmi, bir kanıt olarak yapılmaz, bu nedenle bir operasyon modelinin ne kadar karmaşıklığına sahip olduğu için iyi bir sezgiye sahip olmak iyi bir başlangıçtır.

0
Vatine