Hesaplanabilirlik Teorisine ve Karmaşıklığa Giriş
Yayınlanan: 2022-03-11Hiç merak ettiniz mi: Bu makaleyi okuduğunuz cihaz tam olarak nedir? Bilgisayar nedir?
Hesaplamalı bilim, bu modern bilgi işlem cihazlarının hayal edilmesinden çok önceye kadar uzanır. Daha sık sorulan soruların programlama dilleri, çerçeveler ve kitaplıklar etrafında döndüğü bir sektörde, genellikle bir bilgisayarı harekete geçiren temel kavramları sorgusuz sualsiz kabul ettik.
Ancak sonsuz bir potansiyele sahip gibi görünen bu bilgisayarların herhangi bir sınırlaması var mı? Bilgisayarların çözmek için kullanılamayacağı sorunlar var mı?
Bu yazıda, programlama dilleri ve bilgisayar mimarilerinin özelliklerinden uzaklaşarak bu soruları ele alacağız. Bilgisayarların ve algoritmaların gücünü ve sınırlarını anlayarak, düşünme şeklimizi geliştirebilir ve farklı stratejiler hakkında daha iyi akıl yürütebiliriz.
Bilgisayarın soyut görünümü, 1970'lerde ilk geliştirildiğinde olduğu kadar bugün de bizim için değerli olan, zamana dayanan sonuçlar üretir.
hesaplanabilirlik
Bilgisayar nedir? Sorun nedir?
Okulda, bize genellikle şuna benzer bir şekilde giden zihinsel bir problem ve işlev modeli öğretilir:
Bir fonksiyon, bir f(x) çıktısı bulmak için bir x girdisine uyguladığınız bir prosedürdür.
Matematiksel tanımın farklı olduğu ortaya çıktı:
Bir fonksiyon, her bir çiftin ilk elemanı bir X kümesinden (alan adı verilir), her çiftin ikinci elemanı bir Y kümesinden (kod alanı veya aralık olarak adlandırılır) ve her bir elemanın bir sıralı çiftler kümesidir. etki alanı, aralığın tam olarak bir öğesiyle eşleştirilir.
Bu oldukça ağız dolusu oldu. Ama bu tam olarak ne anlama geliyor?
Bu tanım bize bilgisayarın bilgi işlem işlevleri için bir makine olduğunu söyler.
Niye ya?
Çünkü bilgisayarlar rastgele girdileri bazı çıktılara dönüştürür. Başka bir deyişle, sorunları çözerler. Çok aşina olduğumuz ve resmi olan iki fonksiyon tanımı, birçok pratik amaç için örtüşmektedir.
Ancak matematiksel tanım, hesaplanamayan fonksiyonların (yani çözülemeyen problemlerin) varlığı gibi ilginç sonuçlara ulaşmamızı sağlar:
Çünkü her fonksiyon bir algoritma olarak nitelendirilemez.
Oyunun kuralları
Argümanlarımızı oluşturmaya yardımcı olmak için, bilgisayarları bir miktar girdi alan, bir dizi işlem gerçekleştiren ve bir süre sonra çıktı veren makineler olarak hayal edelim.
Girişi makinenin alfabesi olarak adlandıracağız; yani, bazı sonlu kümelerden bir dizi karakter dizisi. Örneğin, makinenin alfabesi ikili (0'lar ve 1'ler) olabilir veya ASCII karakter kümesi olabilir. Herhangi bir sonlu karakter dizisi bir dizedir; örneğin, "0110".
Ayrıca, bir makinenin çıktısını, makine (umarım) hesaplamasını bitirdiğinde verilen ikili kabul-red kararı olarak sunacağız. Bu soyutlama, daha önceki fonksiyonların matematiksel tanımıyla uyumludur.
Bu parametreler göz önüne alındığında, bir türü daha karakterize etmek önemlidir: bir dizi dizi. Belki bazı makinelerin kabul ettiği dizileri önemsiyoruz veya belki belirli bir dizideki dizileri kabul eden ve diğerlerini kabul etmeyen bir makine yapıyoruz ya da belki bazılarında her şeyi kabul eden bir makine tasarlamanın mümkün olup olmadığını soruyoruz. belirli bir set ve diğerleri yok.
Tüm bu durumlarda, bir dizi diziye dil denir; örneğin, çift sayıları temsil eden tüm ikili diziler kümesi veya çift sayıda karaktere sahip dizeler kümesi. Sayılar gibi dillerin de birleştirme, birleştirme, kesişme ve benzeri operatörlerle çalıştırılabileceği ortaya çıktı.
Önemli bir operatör, normal ifadelerle de kullanılan Kleene yıldız operatörüdür. Bu, dilin tüm olası güçlerinin birliği olarak düşünülebilir. Örneğin, A dilimiz { '01', '1' } dizileri kümesiyse, A* 'nın bir üyesi '0101111' dizesidir.
sayılabilirlik
Tüm fonksiyonların hesaplanamaz olduğu iddiamızı kanıtlamadan önce yapbozun son parçası sayılabilirlik kavramıdır. Sezgisel olarak, kanıtımız daha fazla dil olduğunu gösterecektir; yani, onları çözmek için olası programlardan daha fazla sorun. Bu işe yarar, çünkü bir dizgenin bir dile ait olup olmadığı (Evet/Hayır) sorusunun kendisi bir problemdir.
Daha doğrusu, kanıtımız, olası programlar kümesinin sayılabilir sonsuz olduğunu, bir alfabe üzerindeki dillerin kümesinin ise sayılamayacak kadar sonsuz olduğunu iddia eder.
Bu noktada, “Sonsuzluk başlı başına yeterince tuhaf bir fikirdir; şimdi ikisiyle uğraşmak zorundayım!”
O kadar da kötü değil. Sayılabilir sonsuz bir küme, numaralandırılabilen bir kümedir. Bunun ilk eleman, bu ikinci eleman ve bunun gibi, sonunda kümenin her elemanına bir sayı atandığını söylemek mümkündür. Örneğin, çift sayılar kümesini alın. 2'nin birinci, 4'ün ikinci, 6'nın üçüncü olduğunu söyleyebiliriz. Bu tür kümeler sayılabilir sonsuz veya sayılabilirdir.
Gerçek sayılarda olduğu gibi bazı kümelerde ne kadar zeki olduğunuzun bir önemi yoktur; basitçe numaralandırma yoktur. Bu kümeler sayılamayan sonsuz veya sayılamayan kümelerdir.
Sayısız Program
İlk olarak, bilgisayar programları kümesinin sayılabilir olduğunu göstermek istiyoruz. Amaçlarımız için bunu, sonlu bir alfabe üzerindeki tüm dizelerin kümesinin sayılabilir olduğunu gözlemleyerek yapıyoruz. Bu işe yarar çünkü bilgisayar programları kendilerinin sonlu diziler olmalarıdır.
Kanıt basittir ve burada ayrıntıları ele almıyoruz. Buradaki en önemli şey, diyelim ki doğal sayılar kadar çok bilgisayar programı olduğudur.
Tekrarlamak için:
Herhangi bir alfabedeki tüm dizelerin kümesi (örneğin, tüm bilgisayar programlarının kümesi) sayılabilir.
Sayılamayan Birçok Dil
Bu sonuca göre, bu dizilerin alt kümeleri ne olacak? Başka bir şekilde sorulduğunda, tüm dillerin kümesi ne olacak? Bu kümenin sayılamaz olduğu ortaya çıktı.
Herhangi bir alfabe üzerindeki tüm dillerin kümesi sayılamaz.
Bir kez daha, burada kanıtı ele almıyoruz.
Sonuçlar
Hemen belirgin olmasalar da, dillerin sayılamamasının ve tüm bilgisayar programlarının sayılabilirliğinin sonuçları çok derindir.
Niye ya?
A'nın ASCII karakter kümesi olduğunu varsayalım; ASCII karakterleri, yalnızca bir bilgisayar programı oluşturmak için gerekli olanlardır. JavaScript programlarını temsil eden dizeler kümesinin A* 'nın bir alt kümesi olduğunu görebiliriz (burada *, Kleene yıldız operatörüdür). JavaScript seçimi keyfidir. Bu program kümesi sayılabilir bir kümenin alt kümesi olduğundan, JavaScript programlarının kümesi sayılabilir.
Ek olarak, herhangi bir L dili için, x dizesinin bir kısmı L' deyse 1 olarak değerlendirilen bir f işlevi tanımlayabileceğimizi ve aksi takdirde 0'ı tanımlayabileceğimizi düşünelim. Bu tür tüm işlevler farklıdır. Tüm diller kümesiyle 1:1 denklik olduğundan ve tüm diller kümesi sayılamayan olduğundan, bu tür işlevlerin kümesinin sayılamayan olduğunu elde ederiz.
İşte derin nokta:
Geçerli tüm programların kümesi sayılabilir, ancak işlevler kümesi sayılmayacağından, program yazamayacağımız bazı işlevler olmalıdır.
Bu işlevlerin veya sorunların neye benzediğini henüz bilmiyoruz, ancak var olduklarını biliyoruz. Bu alçakgönüllü bir farkındalık çünkü dışarıda çözümü olmayan bazı sorunlar var. Bilgisayarların son derece güçlü ve yetenekli olduğunu düşünüyoruz, ancak bazı şeyler onların bile erişemeyeceği bir yerde.
Şimdi soru şu hale geliyor: “Bu problemler neye benziyor?” Bu tür problemleri tanımlamaya devam etmeden önce, hesaplamayı genelleştirilmiş bir şekilde modellememiz gerekir.
Turing Makineleri
Bir bilgisayarın ilk matematiksel modellerinden biri Alan Turing tarafından geliştirildi. Turing makinesi olarak adlandırılan bu model, bizim hesaplanabilirlik kavramımızı tamamen yakalayan son derece basit bir cihazdır.
Makineye giriş, üzerine girişin yazıldığı bir banttır. Bir okuma/yazma kafası kullanarak, makine bir dizi adımla girdiyi çıktıya dönüştürür. Her adımda, teybe ne yazılacağına ve ne yazılacağına ve sağa mı yoksa sola mı hareket ettirileceğine karar verilir. Bu karar tam olarak iki şeye dayanmaktadır:
Başın altındaki mevcut sembol ve
Sembol yazıldıkça güncellenen makinenin dahili durumu
Bu kadar.
evrensellik
1926'da Alan Turing, yalnızca Turing makinesini geliştirmekle kalmadı, aynı zamanda ünlü makalesi "Hesaplanabilir Sayılar Üzerine" yazdığında hesaplamanın doğasına dair bir dizi başka önemli kavrayışa da sahipti. Bir bilgisayar programının kendisinin bir bilgisayara girdi olarak kabul edilebileceğini fark etti. Bu bakış açısıyla, bir Turing makinesinin bu girdiyi simüle edebileceği veya yürütebileceğine dair güzel bir fikri vardı.
Turing'in zamanında, bugün bu fikirleri kanıksamış olarak kabul ederken, böyle evrensel bir makine fikri, Turing'in çözülemez problemler geliştirmesine izin veren en büyük atılımdı.
Kilise Turing Tezi
Devam etmeden önce önemli bir noktayı inceleyelim: Turing makinesinin bir hesaplama modeli olduğunu biliyoruz, ancak yeterince genel mi? Bu soruyu cevaplamak için, aşağıdaki ifadeye güven veren Church-Turing Tezine dönüyoruz:
Hesaplanabilen her şey bir Turing makinesi tarafından hesaplanabilir.
Turing, Turing makinesini bir hesaplama modeli olarak geliştirirken, Alonzo Church ayrıca lambda hesabı olarak bilinen bir hesaplama modeli geliştirdi. Bu modeller güçlüdür, çünkü hem hesaplamayı tanımlarlar hem de bunu günümüzün herhangi bir bilgisayarına veya şimdiye kadarki herhangi bir bilgisayara eşit bir şekilde yaparlar. Bu, bulgularımızın geçmişteki, şimdiki ve ötesindeki tüm olası bilgisayarlara uygulanacağını bilerek, aradığımız çözülemez sorunları tanımlamak için bir Turing makinesi kullanabileceğimiz anlamına gelir.
Tanınabilirlik ve Karar Verilebilirlik
Çözülemez bir sorunu, yani dil tanıyıcıları ve dil karar vericileri kavramlarını somut olarak tanımlamadan önce biraz daha arka planı ele almamız gerekiyor.
Bir dil, onu tanıyan bir Turing makinesi varsa tanınabilir.
ve
Bir dil, ona karar veren bir Turing makinesi varsa, karar verilebilir.
Bir dilin tanıyıcı olması için, Turing makinesi o dildeki her dizgeyi kabul etmeli ve dilde olmayan hiçbir şeyi kabul etmemelidir. Bu tür dizileri reddedebilir veya döngü yapabilir. Karar verici olmak için, bir Turing makinesi her zaman ya kabul ederek ya da reddederek girdisini durdurmalıdır.
Burada, girdiyi durdurma fikri çok önemlidir. Aslında, karar vericilerin tanıyıcılardan daha güçlü olduğunu görüyoruz. Ayrıca, bir problem çözülebilir veya başka bir deyişle, bir fonksiyon ancak fonksiyon tarafından tanımlanan dile karar veren bir Turing makinesi varsa karar verilebilir.

kararsızlık
Daha önce bir bilgisayar programı yazdıysanız, program yürütüldüğünde orada oturup bilgisayarın çarklarını döndürmesini izlemenin hissini mutlaka bilmelisiniz. Programın sadece uzun mu zaman aldığını veya kodda sonsuz bir döngüye neden olan bir hata olup olmadığını bilmiyorsunuz. Derleyicinin, çalıştırıldığında sonsuza kadar durup durmayacağını veya döngüye girip girmediğini görmek için neden kodu kontrol etmediğini merak etmiş olabilirsiniz.
Derleyicinin böyle bir kontrolü yoktur çünkü basitçe yapılamaz. Bu, derleyici mühendislerinin yeterince zeki olmadıklarından veya kaynaklara sahip olmadıklarından değil; Durup durmadığını belirlemek için rastgele bir bilgisayar programını kontrol etmek basitçe imkansızdır.
Bunu Turing makinesini kullanarak kanıtlayabiliriz. Turing makineleri diziler olarak tanımlanabilir, bu nedenle sayılabilir sayıda vardır. M 1 , M 2 ve benzerlerinin tüm Turing makinelerinin kümesini oluşturduğunu varsayalım. Aşağıdaki fonksiyonu tanımlayalım:
Burada <M>, "M'nin dizgi kodlaması" için sözdizimidir ve bu işlev, M i durursa M j'yi girdi olarak kabul ederek ve aksi halde 0 çıktısını vererek 1 çıktısı verme problemini temsil eder. M i'nin durması gerektiğine dikkat edin (yani, bir karar verici olun). Bu, karar verilemeyen bir işlevi (yani, çözülemeyen bir problem) tanımlamak istediğimiz için gereklidir.
Şimdi, kendi açıklamalarını kabul etmeyen Turing makinelerinin dize kodlamalarından oluşan bir L dili de tanımlayalım:
Örneğin, bazı makine M 1 <M 1 > girişinde 0 çıkışı verebilirken, başka bir makine M 2 <M2 > girişinde 1 çıkış verebilir. Bu dilin kararsız olduğunu kanıtlamak için, L diline karar veren makine olan M L 'nin, girdi olarak kendi tanımı <M L > verildiğinde ne yaptığını soruyoruz. İki olasılık var:
M L , <M L > kabul eder
veya
M L , <M L >'yi reddeder
M L kendi kodlamasını kabul ederse, bu, <M L >'nin L dilinde olmadığı anlamına gelir; ancak, durum böyle olsaydı, M L' nin ilk etapta kodlamasını kabul etmemesi gerekirdi. Öte yandan, M L kendi kodlamasını kabul etmiyorsa, o zaman <ML > L dilindedir, bu nedenle M L , dize kodlamasını kabul etmiş olmalıdır.
Her iki durumda da, L dilinin karar verilemez olduğunu kanıtlayan bir paradoks veya matematiksel terimlerle bir çelişki var; böylece ilk çözülemeyen problemimizi tanımlamış olduk.
Durma Sorunu
Az önce tanımladığımız sorun alakalı görünmese de, pratik önemi olan ek çözülemez sorunlara, özellikle de durma sorununa indirgenebilir:
Boş dizede duran Turing makinelerinin kodlama dili.
Durdurma sorunu, derleyicilerin neden daha önceki sonsuz döngüleri algılayamadığı sorusu için geçerlidir. Bir programın boş dizgede sonlanıp sonlanmayacağını belirleyemezsek, o zaman onun yürütülmesinin sonsuz bir döngüyle sonuçlanıp sonuçlanmayacağını nasıl belirleyebiliriz?
Bu noktada, basit bir sonuca varmak için sadece el salladık gibi görünebilir; ancak, hiçbir Turing makinesinin bir bilgisayar programının durup durmayacağını veya sonsuza kadar bir döngüde kalacağını söyleyemediğini fark ettik. Bu, pratik uygulamalarda önemli bir sorundur ve Turing makinesinde veya başka herhangi bir bilgisayarda çözülemez. Bir iPhone bu sorunu çözemez. Çok çekirdeğe sahip bir masaüstü bu sorunu çözemez. Bulut bu sorunu çözemez. Birisi bir kuantum bilgisayarı icat etse bile, durma problemini yine de çözemezdi.
Özet
Hesaplanabilirlik teorisini incelememizde, bir sayma argümanı ile kelimenin herhangi bir sıradan anlamında hesaplanamayan birçok fonksiyonun olduğunu gördük. Turing makinesini resmileştirmek için Turing'in kendi kalem ve kağıt deneyiminden aldığı ilhama kadar geri giderek hesaplama ile ne demek istediğimizi tam olarak tanımladık. Bu modelin bugün herhangi bir bilgisayarın veya yarın için tasavvur edilen herhangi bir şeyi nasıl hesaplayabildiğini gördük ve hiç hesaplanamayan bir problem sınıfı gerçekleştirdik.
Yine de, hesaplanabilirliğin bir dezavantajı vardır. Bir sorunu çözebiliyor olmamız, onu hızlı bir şekilde çözebileceğimiz anlamına gelmez. Sonuçta, güneş on milyonlarca yıl sonra üzerimizde yenilenmeden önce hesaplaması bitmeyecekse, bir bilgisayarın ne faydası var?
Hesaplanabilir işlevleri ve dilleri geride bırakarak, şimdi hesaplama karmaşıklığını, verimli hesaplamayı ve ünlü P'ye karşı NP problemini tartışıyoruz.
karmaşıklık
Yavaş ve Hızlı
Bilgisayar bilimcileri çeşitli problem sınıflarını tanırlar ve umursadığımız iki sınıf, bilgisayarların hızlı veya verimli bir şekilde çözebileceği, P olarak bilinen ve çözümleri hızlı bir şekilde doğrulanabilen ancak hızlı bir şekilde elde edilemeyen, NP olarak bilinen problemleri içerir.
Örneğin, bir çevrimiçi flört servisi için algoritmalar geliştirmekten sorumlu olduğunuzu ve birisinin "Herkes biriyle randevu alabilir mi?" sorusunu sorduğunu varsayalım. Cevap, uyumlu bireyleri, herkesin eşleştirileceği şekilde eşleştirmeye bağlıdır. Bu sorunu çözmek için verimli algoritmalar olduğu ortaya çıktı. Bu sorun P kümesindedir.
Peki ya kullanıcılarımız arasındaki en büyük kliği belirlemek istersek? Klik derken, hepsi birbiriyle uyumlu en büyük bireyler ağını kastediyoruz. Kullanıcı sayısı düşük olduğunda bu sorun hızlı bir şekilde çözülebilir. Diyelim ki 3 kullanıcılı bir kliği kolayca tanımlayabiliriz. Ancak daha büyük klikler aramaya başladığımızda, sorunun çözülmesi giderek daha zor hale geliyor. Bu sorun NP kümesindedir.
Resmi Tanımlar
P , polinom zamanında çözülebilen problemler kümesidir. Yani, hesaplama adımlarının sayısı, problem boyutuna göre bir polinom fonksiyonu ile sınırlandırılır. Biliyoruz ki “Herkes randevu alabilir mi?” iki parçalı eşleştirme sorunu olarak da bilinen soru, P'dedir .
NP , polinom zamanında doğrulanabilen problemler kümesidir. Bu, elbette P'deki her sorunu içerir; ancak, bu sınırlamanın katı olup olmadığını bilmiyoruz. Verimli bir şekilde doğrulanabilir ancak verimli bir şekilde çözülemez sorunları biliyoruz, ancak sorunun gerçekten zorlu olup olmadığını bilmiyoruz. Klik sorunu böyle bir sorundur. Çözümü verimli bir şekilde doğrulayabileceğimizi biliyoruz, ancak sorunu verimli bir şekilde çözüp çözemeyeceğimizden emin değiliz.
Son olarak, NP-complete , NP'deki en zor problemler olan problemler kümesidir. En zor olarak adlandırılırlar çünkü NP'deki herhangi bir problem verimli bir şekilde NPC'ye dönüştürülebilir. Sonuç olarak, eğer birisi NPC'deki bir probleme etkili bir çözüm tanımlayacak olsaydı, o zaman tüm NP sınıfı P tarafından emilirdi. Klik sorunu da NPC'de .
Böylece, P vs. NP sorununa varıyoruz. Birçok bilgisayar bilimci ve matematikçi, P ve NP'nin eşit olmadığına kuvvetle inanır. Öyle olsaydı, etkileri derinin ötesinde olurdu. Günümüzün dijital altyapısının çoğu, NP'de P'de olmayan sorunların olduğu gerçeğine dayanmaktadır. Durum böyle olmasaydı, örneğin kriptografik yöntemler bir gecede çökecek ve bir NPC sorununa etkili bir çözüme sahip olan bir kişinin en sıkı güvenlik protokollerini bile alt üst etmesine izin verecekti.
İzlenebilirlik İncelikleri
Bilgisayar bilimlerine yeni başlayanlar için eşleştirme ve klik problemleri arasındaki fark çok büyük görünmeyebilir. Aslında, P'deki bir problem ile NP'deki bir problem arasındaki fark çok ince olabilir. Farkı söyleyebilmek, gerçek dünyada algoritma tasarlayan herkes için önemlidir.
En kısa yol problemini düşünün. İki konum verildiğinde amaç, aralarındaki en kısa yolu belirlemektir. Bir iPhone bunu milisaniyeler içinde hesaplar. Bu, hesaplama açısından izlenebilir bir sorundur.
Öte yandan, amacın, mümkün olan en kısa mesafeyi katederken, başlangıç noktasında biten olası bir hedef alt kümesini ziyaret etmek olduğu gezgin satıcı problemini ele alalım. Bu problem, en kısa yol problemine benzer ancak NP-tamamlanmıştır; aynı zamanda tedarik zinciri lojistiğinin neden milyar dolarlık bir endüstri olduğunu da açıklıyor.
Aslında daha da ince olabiliriz. En kısa yolu (P) sormak yerine, çevrimsiz en uzun yolu sorabiliriz. En uzun yol sorununun da NP-tamamlanmış olduğu ortaya çıktı.
Bu ince ayrımın çok daha fazla örneği vardır, bunlara iki parçalı ve genel grafiklerde köşe örtülerinin tanımlanması veya yan tümce başına iki ve üç değişmez değer içeren boole formüllerinin tatmin edilmesi de dahildir. Mesele şu ki, bir sorunun P'de mi yoksa NP'de mi olduğu hemen belli değil ve bu nedenle çalışma süresi analizi kritik bir beceridir. Tasarlanması gereken algoritma P'deki bir problem için ise, o zaman etkin bir çözüm olduğunu biliyoruz. Öte yandan, sorun NP'deyse, o zaman bir çözüm aramaya karşı çıkmak için güçlü bir davamız var, çünkü algoritmanın sorunu çözmesi genellikle çok uzun sürer.
Özet
Bu karmaşıklık incelemesinde, P ve NP problemlerinin sınıflarını tanımladık. P, bir bilgisayar tarafından verimli bir şekilde çözülebilecek sorunları gayri resmi olarak temsil ederken, NP verimli bir şekilde doğrulanabilir olanları temsil eder.
Hiç kimse P'nin NP'ye eşit olmadığını kanıtlayamadı. Bu iki problem sınıfının eşdeğer olup olmadığı, P vs. NP problemi olarak bilinir ve tüm matematiğin olmasa da bugün teorik bilgisayar bilimindeki en önemli açık problemdir. Aslında, 2000 yılında, Clay Math Institute, P vs. NP problemini matematikteki en önemli yedi açık sorudan biri olarak adlandırdı ve bu problemin çözümünü belirleyen bir kanıt için milyon dolarlık bir ödül teklif etti.
Çözüm
Bu makalede, "Bilgisayar nedir?" gibi büyük soruları yanıtlayarak hesaplanabilirlik ve karmaşıklık alanlarını araştırdık. Ayrıntılar bunaltıcı olsa da, hatırlamaya değer bir dizi önemli çıkarım var:
Durma problemi gibi basitçe hesaplanamayan bazı şeyler var.
NPC'deki problemler gibi verimli bir şekilde hesaplanamayan bazı şeyler var.
Ayrıntılardan daha önemli olan, hesaplama ve hesaplama problemleri hakkında düşünme yollarıdır. Profesyonel hayatımızda ve hatta günlük hayatımızda daha önce hiç görmediğimiz sorunlarla karşılaşabiliriz ve en iyi hareket tarzını belirlemek için denenmiş ve gerçek araçları ve teknikleri kullanabiliriz.
Toptal Mühendislik Blogunda Daha Fazla Okuma:
- Sıfırdan Tercüman Yazmaya Nasıl Yaklaşılır?