Programlama veya bilgisayar bilimi genel olarak algoritmalar hakkında mı?


40

Yüksek lisans öğrencisi olarak, prestijli şirketlerin (Google, Facebook, Microsoft, ... gibi) test ve görüşmelerine algoritma soruları koymalarını daha yaygın buluyorum. Uyguladığım birkaç başlangıç ​​da algoritmalar hakkında sordu. Algoritmaların akıcılık bu şirketlerdeki yazılım geliştirici için en önemli şey olup olmadığını merak ediyorum?

Cevap evetse, algoritmalar hakkında etkili bir şekilde öğrenmek ve uygulamak için en iyi yöntem veya kaynaklar nelerdir? Çoğu ders kitabında veya web sitesinde bulunan görünüşte karmaşık sorunları çözmekle ilgilenemiyorum. Temel algoritmaları (quicksort, bubblesort, ... gibi) kolayca anlasa da, bunları daha sonra hatırlamak ve tekrar kullanmak çok zor.

Teşekkürler.

P / S: Bana neyi sevdiğimi sorarsanız, kullanıcıların sorunlarını yenilikçi bir şekilde çözmek için iyi yazılımlar geliştiriyor. Sanırım bunun mutlaka yazılımın çok karmaşık olması gerektiği anlamına gelmiyor.


26
Google’ın tüm web’i bir metin kutusu ve bir düğme ile aramanıza izin vermesinin ne kadar karmaşık olduğu hakkında bir fikriniz var mı?
JeffO,

21
@JeffO Artık düğmeyi bile kullanmıyorum ;-)
maple_shaft

1
Google bunu kolaylaştırırsa, diğer tüm arama sitelerinin hiçbir koda ihtiyacı olmaz.
JeffO,

Sorunun bilgisayarların nasıl çalıştığı, bir CPU nasıl çalıştığı, RAM nasıl çalıştığı, wifi nasıl çalıştığı vb. Olacağını düşündüm. Bunlar oldukça ilginç bir sorudur. Hala java veya php'de programlanan tüm ineklerinkinden daha çok donanım buluyorum.
jokoon

2
Hepsi algoritmalarla ilgili değil, aslında CS'nin merkezinde yer alıyorlar. Ama tıpkı algoritmalar ve mantık (kod koruyarak, örneğin, ihtiyaç olmazdı daha programlama için çok daha fazla var sadece algoritmaları hakkında bilgi).
haylem

Yanıtlar:


44

Algoritmalar açık

İşte algoritmalar hakkında güzel şey: Ele aldıkları problem alanı iyi tanımlanmış, yani gereksinimleriniz sadece gerçekten bilinmemekle kalmıyor, aynı zamanda çözümün kalitesi için kullanılan ölçütler gibi resmileştiriliyor.

Öyleyse size bir algoritma geliştirmenizi söylersem, iletişim sorunları için fazla potansiyel yoktur ve performansınızı ölçmek önemsiz bir iştir. Aynı zamanda performansınız, mantıklı düşünme yeteneğiniz için oldukça iyi bir göstergedir.

Algoritmalar verimli bir filtredir

Endüstrinin (ve eğitimin) şu anki sorunu, mezunların düşük ortalama kalitesidir. Bu FizzBuzz testi ile gösterilmiştir :

1'den 100'e kadar olan sayıları geçecek ve eğer sayı 3'e bölünebilirse "fizz", 5'e bölünemezse "vızıltı" ve eğer her ikisi tarafından bölünemezse sayıyı "" yazacaktır.

Görünüşe göre, tüm Comp Sci mezunlarının çoğunluğu bu sorunu çözmekte başarısız oluyor. Lütfen elbette utanç verici derecede basit bir soru olmasına rağmen, bunun algoritmik bir soru olduğunu unutmayın. Bu göz önüne alındığında, Google Code Jam veya Project Euler'da verilen türden sorunları çözebilecek birini edinmek için, zaten crème-de-la-crème'den hoşlanıyorsunuzdur.

Algoritmalar yazılım geliştirmenin küçük bir parçasıdır

Gerçek şu ki, sektörde çalışırken, algoritma becerilerinizi zamanın% 1'inden daha fazla kullanmayacaksınız.

Kod yazmaya bile başlamadan önce, gereksinimleri toplayıp analiz etmelisin. O zaman tasarımınızı onlara göre sentezlemelisiniz. O zaman tasarımı uygulamanız gerekir. Daha sonra, uygulamayı orijinal gerekliliklere göre değerlendirmeli, gereklilikleri yinelemeli, sonra tasarımı yinelemeli, daha sonra uygulamayı yinelemelisiniz.

Gereksinimlerden biri mantıklı performans. Bu gereksinimi karşılamıyorsanız, darboğazları izlemek için uygulamanızı profillemelisiniz ve sonra bunu en iyi duruma getirebilirsiniz, ki bu bazen ileriye dönük basit bir mikro-optimizasyon meselesidir (bu oldukça kolay bir işlemdir) daha iyi algoritmalar kullanarak (daha sonra her zaman kolayca yapılmaz). Bu nedenle:

Algoritmalar kritik

Algoritmalarınız ne kadar iyiyse, ilk seferinde doğru anlama şansınız o kadar büyük olur. Aksi takdirde, yalnızca daha iyi bir algoritma uygulayarak çözülebilecek bir sorunla karşılaşmanız olası değildir, aynı zamanda sorunu çözemezsiniz.
Bu yüzden, neredeyse hiç bu yeteneğe ihtiyaç duymuyorsanız , geliştirme metodolojinizde tek bir başarısızlık noktası sunar ve eğer yeteneğiniz yoksa, sadece zorunluluğun asla ortaya çıkmadığını ya da başkasının bunu yapmak için atladığını umabilirsiniz. sen.

Asıl önemli olan, benzer bir soruya cevaben açıkladığım gibi , hesaplama karmaşıklığı ve nasıl düşük tutulacağı hakkında bir fikir edinmek . Ya da GUI gelişimi gibi, bunun sadece önemli olmadığı şeylerde uzmanlaşmak, ancak daha sonra neredeyse herkes bundan nefret ediyor ... bir sebep için!


5
Çok kapsamlı ve akıllı bir cevap için +1. Ayrıca, FizzBuzz filtresinin ne kadar etkili olduğu üzücüdür. Bunu yapamamak için kesinlikle hiçbir bahane yok.
Adam Crossland

4
fizzbuzzNumara hem her ikisi tarafından bölünebiliyorsa hem de birçok kişi tarafından kesilmişse yazdırmanız gerektiğini düşündüm, çünkü modulo kontrollerini dikkatlice sipariş etmeniz gerekiyor.
Matthieu M.

1
% 1 biraz fazla olabilir
kenevir

1
@MatthieuM .: Her ikisinin de yazdırılması, gereksinimin nasıl ifade edildiğiyle ilişkilidir. Bunu kaçırmak, gereklilikleri dikkatlice kontrol etmediğiniz anlamına gelir; Şimdi, ilginç bulduğum şey, onları herhangi bir sırayla, hatta aynı sırayla tutarlı bir şekilde
basmanız gerektiğini söylememesidir

1
@ back2dos: evet, ama rastgele bir sıraya göre yapmak daha eğlenceli gibi geliyor ... bu cevapta verilen gereksinimin satırlardan söz etmediğini, sadece yazdırmayı unutmayın . Bir FizzBuzz testi yaptırırsanız, üzerinde çok sayıda dengesiz varsayım bulunduğunu belirtmek faydalı olabilir (daha sonra yine sizi bir wiseguy olarak çizdirebilir).
jmoreno

30

Genel olarak, bir iş olarak programlama algoritmalardan ibaret değildir. Derin algoritmik yetenekler gerektirmeden CRUD uygulamalarını programlamak için yıllarını harcayabilirsin.

İş olarak programlama:

  1. İletişim:

    • Kaynak kodunuz, fikirlerinizi akranlarınızla paylaşmanın bir yoludur. Hiç kimse kodunuzu okuyamıyor / anlayamıyorsa, değersizdir.

    • Başka bir geliştiriciyle konuşmayan yalnız bir geliştirici, muhtemelen kodlarda hata yapmaya başlar ve kendi yaklaşımının kabul edilebilir tek yöntem olduğuna inanır.

    • Paydaşlarla, KG departmanıyla, kullanıcılarla, görsel tasarımcılarla, DBA'larla vb. Nasıl iletişim kuracağınızı bilmelisiniz.

    • Deneyimli bir geliştirici olarak, becerilerini geliştirmek isteyen daha az deneyimli iş arkadaşlarına öğretmelisiniz.

  2. Doğru araçlar hakkında bilgi: sürüm kontrolü, hata takip sistemi, IDE'ler, hangi dilin belirli bir görev için daha uygun olduğu ve neden, kod analizinin nasıl kullanılacağı vs.

  3. Geniş bilgi ve kültür: işlevsel diller nelerdir? Bilgisayarlar kodu nasıl yorumlar? LOC neden anlamsız bir ölçüdür? vb.

  4. Çalıştığınız dil (ler) in derin bilgisi.

  5. Algoritmalar.

Bilgisayar Bilimi ise algoritmalara daha çok yöneliyor. Bir bilim insanı olarak çalışıyorsanız, bunun bir geliştiricinin işi ile ilgisi olmayabilir ve bir algoritmayı nasıl optimize edeceğiniz, bir veri gösterimini diğerine nasıl dönüştürebileceğiniz, vb.


12
1: "CRUD uygulamaları" olan algoritmaları. Onlar sadece (genellikle) basittir. "Asil bir anlam" yok.
S.Lott,

2
ve kaynak kodu, ne yapmak istediğinizi tam olarak yapan (ve neredeyse asla yapmak istediğinizi yapmayan) bilgisayara olan tek iletişim kanalınızdır
cırcır ucube 18

5
Pazarın mühendislik ekipleri algoritmaların temellerini görmezden gelen (ya da hiç öğrenilmemiş) CRUDdy uygulamalarını temizlemek için ne kadar iyi.
JasonTrue

2
@ S.Lott: "CRUD uygulamaları algoritmalardır", "Ben Amerika'yım" ile aynıdır. ;)
Jim G.

1
@JimG: Steven Colbert'in dediği gibi "Ben Amerika'yım, sen de yapabilirsin". CRUD uygulamaları içerir, dayanır, içerir, uygulamaları yansıtır, somutlaştırır, algoritmaları yansıtır. Sadece belirli bir edat önermeksizin şikayetçi oldun. Hangisi seni daha çok mutlu ederdi?
S.Lott,

16

Görüşmelerdeki algoritmalarla ilgili soruların, şirketlerin adayların bilgisayar bilimlerinin temellerini kavradıklarını yargılamaya çalıştıkları ana yollardan biri olduğunu düşünüyorum. Bu, profesyonel bir programcı için tek önemli beceri alanı olmasa da, iyi bir programcının temel yeterliliklerinden biridir.

Bence birçok büyük şirket görüşme sürecinde CS'nin temellerini vurgularsa, en azından mezun olduktan ve işgücüne girdikten sonra geliştirilen temel beceri budur. Uygulamalı programlama yeteneği, tasarım becerileri, yazılım mühendisliği uygulamaları ve benzerleri, temel olarak eğitim sürecinde geliştirilirken, CS temelleriniz temel olarak deneyim yoluyla geliştirilen şeylerdir.

Algoritma tasarımının nasıl yapıldığına gelince, Steve Yegge , bir programcı olarak mülakat yapmak için mükemmel rehberinde Skiena's Algorithm Tasarım Kılavuzu'nu önerir .


4
+1: programlama dilleri, çerçeveler, işletim sistemi, editörler, araç takımları, hepsi gelir ve gider, fakat problemleri nasıl etkili bir şekilde çözeceklerini bilmenin veri yapılarının ve algoritmaların temellerini bilmekle ilgisi vardır. Bu şeyler hep yanımızda.
Adam Crossland

“Algoritma tasarımının nasıl uygulanacağına gelince, Steve Yegge, bir programcı olarak mülakat yapma konusundaki mükemmel rehberinde Skiena's Algorithm Tasarım Kılavuzunu tavsiye ediyor.” Üzgünüz, ama bu bir soru sormak isteyen öğrencilere lisansüstü bir öğrenci olamayabilir. Google / MS, Skiena'dan (yüksek lisans öğrencileri için), uluslararası kolej programlama yarışmalarında ortaya çıkan soruları sormaya geçti. (Bu fıkra deneyimlerinden kesin olarak biliyorum). Skiena'nın kitabı hala kullanılıyor - ancak temel olarak lisans düzeyinde adaylar için
user396089

Programlama yarışmalarında beliren sorulara gelince - soruyu daha önce görmediyseniz, oldukça fazla hortumlanırsınız (
IQ'nuz

11

Kendi kendine öğretilen ve sadece birkaç tane bilgisayar bilimi dersi alan, üniversitede başarılı bir yazılım geliştiricisi olarak, bugün iş dünyasında karşılaşılan en büyük problemin, tüm programcılarının en iyi şekilde bir baloncuk sıralama algoritması yazma kabiliyeti olmadığını söyleyeceğim. mümkün. İşletmelerin karşılaştığı gerçek sorunlar:

  • Hızla öğrenemeyen ve yeni alanlara adapte olamayan geliştiriciler

  • Müşterilerle veya paydaşlarla anlamlı bir şekilde sosyal etkileşim kuramayan geliştiriciler

  • İkincisi, yanlış ya da kötü düşünülmüş iş gereksinimlerini tahmin edemeyen ve sorgulayamayan geliştiriciler

  • Kodlarını ve özelliklerini nasıl ayrıntılı bir şekilde test edeceğini anlamayan geliştiriciler

  • Zamanında anlamlı tahminler sağlayamayan geliştiriciler

  • Net ve özlü belgeler oluşturamayan geliştiriciler

  • Kendiliğinden başlayamayan veya bir durumla başa çıkamayan geliştiriciler

10 üzerinden dokuz kez, bir geliştiricinin bir şirkete büründüğü hemen hemen tüm koşulların, yukarıdaki özelliklerden birinde umutsuzca başarısız oldukları için bahse gireceğim. Google ve Facebook’u unutun, istisna vakalarıdır ve bilgisayar bilimini derinden anlayan insanlar için yasal bir ihtiyaç vardır.

Gerçek işletmeler bilgisayar biliminin karmaşıklığı ile mücadele etmese de, insanlığın karmaşıklığı ile mücadele ederler. Sorun, yukarıda belirtilen nitelikleri test etmek GERÇEKTEN zor. Çoğu zaman insanları bağırsak reaksiyonunuza dayanarak bu nitelikler konusunda yargılamanız gerekir. İyi insan becerilerine ve sezgilerine sahip değilseniz, algoritma bilgisini test etmek çok daha kolaydır.


+1 Düzenli ve google benzeri olmayan acayip şirketler, iyi iş becerilerine sahip olan ve öncelikle süreçleri nasıl icat edeceğinizi / uygulayacağınızı / yöneteceğinizi / değiştirebileceğinizi anlayabilmektedir. Google’a benzer şirketlerin Çevik hareketten faydalanmadığı bir hata değil, çünkü bilgisayar bilimi işletme problemlerini çözmekten ibaret değil.
S.Robins,

10

Şahsen ben bir programcının kelime haznesinin bir parçası olarak "standart" algoritmaları ve veri yapılarını görüyorum. Ve bir programcı olarak karşılaştığınız pratik problemlerin birçoğunda, bu kelime haznesinde (en azından kısmen) açık olan bir çözüme sahiptir.

İmzanız olarak bu kelime hazinesine sahip olmak, "kendi" çözümlerinizi bulmak zorunda kalmanızı önler (tekerleği yeniden söyleyerek), daha akıllı ve genellikle daha hızlı çalışmanıza olanak tanır.

“Çoğu ders kitabı veya web sitesinde bulunan görünüşte karmaşık sorunları çözmekle ilgilenemiyorum”

“Onları daha sonra hatırlamak ve tekrar kullanmak çok zor”

Onları tamamlamak için kendinizi zorlayın. Daha sonra kendinize teşekkür edeceksiniz. Onları tam olarak hatırlamıyor olsanız bile (kesinlikle yeterli pratikte olsa bile), “X algoritmasını veya Y veri yapısını kullanarak benzer bir şeyi çözmeyi hatırlıyorum” diyebilmeniz size çok yardımcı olacaktır. Ayrıntılara bakmanızı ve hafızanızı yenilemenizi gerektirse bile.


Veri yapıları için +1. Onlar algoritmik madalyonun diğer yarısı.
Spencer Rathbun

9

Algoritmalarınızı bilmeden iyi bir programcı olamasanız da, programlama mesleğinin diğer yönlerini resimden uzak tutmak haksızlıktır. Örneğin, sıkı bir disiplin ve anadili iyi bir şekilde konuşmanız, en azından algoritma bilginiz kadar iyi bir programcı olmanız için önemlidir. Programlama dilleri, kaynak kontrol sistemleri, test ortamları, vb. Gibi temel araçlarınızı anlamanın önemi de göz ardı edilmemelidir.

Ancak, görüşmeler söz konusu olduğunda, algoritma anlayışınızı ölçmek, programcı olarak çalışmakla ilgili diğer yeteneklerinizi ölçmekten çok daha kolaydır. Bu nedenle görüşme yapanların sıklıkla algoritmalar hakkında soru sormaya odaklanmaları ve görüşme sırasında bunları açıklama şeklinize çok dikkat etmeleri gerekir. Diğer şeylerin daha az önemli olmasından dolayı değil, görüşmeye ayrılan 30 dakika içinde bu diğer şeyleri değerlendirmek zor olduğu için değil.


1
+1 Mükemmel cevap! Algoritma bilgisi için test etmek daha kolaydır.
maple_shaft

"Sizin algoritmalar" - Ben kendi kendime öğrendim. Her programcının bilmesi gereken ortak algoritmaların ne olduğunu belirten bir kaynak veya liste var mı? Onları okumak istiyorum. Teşekkürler!
Ominus,

2
@Ominus Algoritmaların "beyefendi listesi" konusunda genel bir fikir birliği olmamasına rağmen, çoğu durumda, uzaysal sürekliliği olmayan (bağlantılı listeler, ikili ağaçlar, vb.) Veri yapılarının aranması, sıralanması, çaprazlanması ve ilkel (yanlış) özyineleme uygulamaları (özyinelemeli faktör, Fibonacci sekansı, vb.)
dasblinkenlight 19

@Ominus - Ben de kendi kendime öğrendim ama bence "Algoritmalara Giriş" - CLRS bu alana aşina olmak için iyi bir yol. Skiena'nın "Algoritma Tasarım El Kitabı" kitabı da iyi.
Tod

5

Evet, programlama çoğunlukla algoritmalar ile ilgilidir.

Ama belki de düşündüğün anlamda değil.

Hepimizin farklı algoritma tanımları kullandığı izlenimini edindim. Dürüst olmak gerekirse, bu soruyu cevaplamak zordur, çünkü algoritma belirsiz bir terimdir. Bu soruyu cevaplamak için Wikipedia'nın tanımını kullanacağım:

Bir işlem sırasını tam olarak tanımlayan bir kurallar kümesi.

Programlamanın kalbi ve ruhu budur. Herhangi bir kod yazdığınızda , sadece bir algoritma uyguluyorsunuz. Bazı CRUD uygulamaları yazıyorsanız, basit bir algoritma uyguluyorsunuz. Bir problemi çözmek için bir algoritma geliştirebilmek programlama yapmanın anlamıdır. Gerisi sadece detaylar.

Bir dilin derinlemesine bir anlayışına sahip olmanın algoritmaları anlamaktan daha önemli olduğunu söyleyen önceki postere katılmıyorum. İyi bir programcının bir dili derinlemesine öğrenebilmesi gerekir, ancak algoritmalar olmadan kendi başınıza herhangi bir kod bulamazsınız.


Başka bir açıdan bakıldığında, Matematik'te kalp ve ruh algoritmalar olabilir, ancak Programlama için başka bir şeydir. Kendi başına algoritmalara ihtiyaç duymadan yazılım yazabilirsiniz (belki de iyi bir yazılım değil), ancak mantık ve soyut düşünme olmadan yazılım yazamazsınız. 'S' de kalbin ancak sorunların çözümü hakkında. Çözümü bulmak algoritmik bir süreçtir, ancak çözümün kendisi mutlaka bir algoritma değildir.
S.Robins,

4

Cevap tamamen takip ettiğiniz işe bağlı. Bazı alanlar özellikle diğerlerine göre daha fazla algoritmaya odaklanmıştır. Bu notla konuşurken, Amazon ile defalarca röportaj yapmaktan zevk aldığım halde. Pozisyonun bu karmaşık algoritmalarla çok az ilgisi olsa da, bir görevin nasıl sabit zamanlı amortismana tabi tutulacağı konusunda ızgara yaptım.

Güçlü bir algoritma anlayışı sağladığının kanıtı, potansiyel işvereninize uygun bir problem çözücüsü olduğunuzu kanıtlamaktır. Bu gerçekten iyi bir çalışanın iyi bir göstergesi değil (IMO) ancak bazı işverenler bunu tarama için kullanıyor. Lisansüstü derece gerektiren bir pozisyon için başvuruyorsanız, algoritmalarda daha sıkı bir temele sahip olmanız beklenir.

(IMO) pratikte son derece yararlı olan şey, belirli algoritmaları ezberlemek değil, bazı algoritmaların nasıl çalıştığını anlamak yoluyla, “Bunu daha önce gördüm” veya “Biliyorum” diyeceğiniz zihninizin arkasında bu küçük külçe vardır Bunu daha iyi yapabilirsiniz "bu da sorununuza çözüm üzerine biraz araştırma yapacaktır.


Lisansüstü öğrenciler için işe alma çubuğu hakkında konuşmak için +1. Bazı şirketler, lisans öğrencilerini işe alırken lisans seviyesine göre çok daha karışıktır. Ancak, onlara karşı dürüst olmak gerekirse, mezun öğrencilere ayrıca daha iyi para ödenir ve genellikle şirket içinde daha yüksek bir düzeyde işe alınır.
user396089

1

Programlamanın algoritmalardan daha fazla veriye dayalı olduğunu düşünüyorum .. ama o zaman, eğer ona bir şey yapmazsanız bunun ne faydası var ... bütün bu manipülasyonlar algoritmalar. Yani aslında, evet, programlama neredeyse tamamen algoritma tabanlıdır.

Matematiğe benzemeyebilir ve günlük işler yapabileceğiniz birçok algoritmik çalışma, bir GUI ile bir program arasında veri göndermek gibi bir şeydir, ancak bu da bir algoritma olarak sayılır. Liste kutusuna bir öğe eklemek, performans ve liste yapısı manipülasyonları gibi kendi sorunlarıyla birlikte gelen standart bir ekleme algoritmasıdır.


1

Yalnızca bu şirketler için çalışan programcılar sorunuzu gerçekten cevaplayabilir. "Algoritmalara Giriş" dediğimiz algoritmalar, son 25 yıldaki programlama ömrümün% 0.01'inde büyük olasılıkla rol oynadı. Bir veri yapısına veya bir türe ihtiyacım olduğunda, genellikle tedarik edilen kütüphaneler veya çerçeveler ihtiyacım olana sahip. Çok hızlı bir FFT'ye ihtiyacım olduğunda, kendim yazmak yerine Intel Math lib gibi bir şey buluyorum. Ancak, Google’da yaptıklarının kariyerimde yaptığımdan çok farklı olduğunu söyleyebilirim. Skiena'nın "Algoritma Tasarım Kılavuzu" kitabı, anlattığı Savaş hikayeleri nedeniyle göze çarpıyordu. Algoritmalarını A LOT işinde kullandığını söyleyebilirsin.

Bağımsız bir programlama danışmanı olarak deneyimlerime göre, başarı üç şeyden geldi: 1. Müşterilerle etkili iletişim kurma 2. İşe yarayan kod yazma. 3. Karmaşıklığı Yönetmek

Sadece 1 ve 2 numaralarını yapmak yeterli değildir. Kod korunamazsa (bunu yazan programcı (lar) dan başka biri tarafından yapılır, mahkumdur.

Sayı 3, ustalaşması en zor programlama becerisidir. Düşüncenin mimarlığa, tasarıma ve kodlamaya konulmasını gerektirir. Yeniden yapılanmanın üstesinden gelmeyi gerektirir. SOLID / DRY ilkelerinin anlaşılmasını gerektirir. Algoritmalara Giriş okuyan ve kendisini mastering veya Pragmatik Programcıyı okuyan ve kendini bir olmaya adayan bir programcı işe almak zorunda kalsaydım, her seferinde sonuncusunu işe alırdım. (Onların karşılıklı olarak dışlanmaları gerekmiyor).


1

Evet.

Bilgisayar Bilimleri çoğunlukla algoritmalardır (yüzde olarak).

Hayır.

Ancak bu, bilgisayarların "Bilim" idir. Bilgisayar Biliminin en yaygın uygulaması Yazılım Mühendisliği'dir. Yazılım Mühendisliği temel olarak algoritmalar değildir. Esas olarak yaratma sanatı, mükemmellik arayışı ile ilgilidir ve bugün var olan gerçek insanların yaşamlarını olumlu yönde etkilemeye odaklanmıştır. Bilgisayar Bilimi aynı motivasyonun bir kısmını paylaşabilir olsa da, Yazılım Mühendisliği'nden çok uzak.

Büyük bir Bilgisayar Bilimi Üniversitesinde görevli bir profesöre programlama hakkında anlaşılması gereken en kritik şeyin ne olduğunu ve muhtemelen size "algoritmalar ve veri yapıları" diyeceklerini sorun

Büyük bir yazılım şirketindeki kıdemli bir geliştiriciye, programlama hakkında anlaşılması gereken en kritik şeyin ne olduğunu ve muhtemelen "müşterileri memnun etmeyi öğrenmeyi" (muhtemelen çevik anlayışı, bir müşteri gibi düşünmeyi, zamanında sevkıyat ve sürekli, işe yarayan şeyler yapmak , vb.)

Anlambilimsel gibi görünebilir, fakat benim anladığım kadarıyla ikisi pratikte ve teoride oldukça farklıdır.


1

Bilgisayar biliminde bir şeyi en önemli parçası olarak seçmek zorunda olsaydım, soyutlamaları seçerdim , algoritmaları değil.


1

Bilgisayar Bilimi'nde, öğrendiğiniz kavramlar size gösterene kadar faydası olmayacak. Sorun çözülmesi gereken asıl meseledir, bu yüzden algoritma sorunun genel olarak nasıl çözüleceğine dair kısa bir planlamadır. Bu nedenle Bilgisayar Bilimi dünyasında büyük endişe vericidir.

Bilgisayar Biliminin neredeyse her yönünün Algoritmaya ihtiyacı olduğunu düşünüyorum Size şunu göstereyim: Aşağıdaki liste çeşitli Bilgisayar Bilimleri alanlarını ve kullandıkları algoritmaları içerecektir.

Otomata

Powerset yapımı. Belirleyici olmayan otomatları deterministik otomatlara dönüştürecek algoritma. Todd-Coxeter algoritması. Cosets üretme prosedürü.

Yapay zeka

Alfa beta. Alfa max artı beta min. Tahta oyunlarında yaygın olarak kullanılır. Ant-algoritmalar. Karınca kolonisi optimizasyonu, bir sorunu çözmek, iki konum arasındaki en iyi yolu bulmak için karınca davranışından ilham alan bir dizi algoritmadır. DE (Diferansiyel evrim). Chebyshev polinomu uydurma problemini çözün. Çevrimiçi Ürün İncelemelerinde Alaycı Cümlelerin Yarı Denetimli Tanınması . Bir tweet veya çevrimiçi bir belgede sakarlıkları veya ironiyi tanıyan algortitma. Bu tür bir algoritma insansı robotların programlanması için de gerekli olacaktır.

Bilgisayar görüşü

Somut örnek. Bir görüntü veya videoyu daha küçük bir görüntüyle temsil edin. Görüntüdeki nesneleri sayma . Her bir nesneyi önce etiketlemek ve sonra nesneleri saymak için bağlı bileşen etiketleme algoritmasını kullanır. O'Carroll algoritması. Böcek vizyonunun matematiksel dönüşümünden, bu algoritma nesnelerin nasıl önlenebileceğini değerlendirir.

Genetik algoritmalar

Üç operatör kullanıyorlar. seçim (çözelti seç), çoğaltma (diğerlerini inşa etmek için seçilen çözeltileri kullan), değiştir (daha iyiyse çözeltiyi değiştir).

Spor orantılı seçim. Rulet tekerleği seçimi olarak da bilinen, çözümleri seçmek için kullanılan bir fonksiyondur. Kısaltma seçimi. Uygunluğa göre sıralanan çözümlerin seçilmesi için başka bir yöntem. Turnuva seçimi Bir tür turnuvaya göre en iyi çözümü seçin. Stokastik evrensel örnekleme. Bireyler, bir hattın bitişik bölümleri ile eşleştirilir, öyle ki her bireyin bölümü, tam olarak rulet tekerleği seçiminde olduğu gibi uygunluğuna eşit olacaktır.

Nöral ağlar

Hopfield ağı. İkili eşik birimlerine sahip, adreslenebilir bellek sistemleri olarak hizmet veren tekrarlayan yapay sinir ağı. Kararlı bir duruma yaklaşırlar. Backpropagation. Yapay sinir ağlarının eğitimi için kullanılan denetimli öğrenme tekniği. Kendini organize eden harita (Kohonen haritası). Yapay sinir ağları, eğitim örneklerinin düşük boyutlu (2B, 3B) gösterimini sağlamak için denetimsiz öğrenme kullanılarak eğitildi. Yüksek boyutlu verileri görselleştirmek için iyi.

Biyoinformatik

Needleman-Wunsch. Protein veya nükleotit sekansları için iki sekans üzerinde global bir hizalama gerçekleştirir. Smith-Waterman. Needleman-Wunsch'un Değişimi.

Sıkıştırma

Kayıpsız sıkıştırma algoritmaları

Burrows-Wheeler dönüşümü. Ön işleme, kayıpsız sıkıştırmayı geliştirmek için yararlıdır. Deflate. ZIP tarafından kullanılan veri sıkıştırma. Delta kodlaması. Sıralı verilerin sık sık oluştuğu verilerin sıkıştırılmasına yardım eder. Artımlı kodlama. Dizi dizilerine uygulanan Delta kodlaması. LZW. (Lempel-Ziv-Welch). LZ78'in halefi. Sıkıştırılacak verilerden bir çeviri tablosu oluşturur. GIF grafik formatı tarafından kullanılır. LZ77 ve 78. Diğer LZ varyasyonlarının temeli (LZW, LZSS, ...). Her ikisi de sözlük kodlayıcıdır. LZMA. Lempel-Ziv-Markov zinciri-Algoritması için kısa. LZO. Hız odaklı veri sıkıştırma algoritması. PPMKısmi Eşleşmeyle Tahmin. Bağlam modelleme ve tahmine dayalı uyarlanabilir istatistiksel veri sıkıştırma tekniği. Shannon-Fano kodlaması. Bir dizi simge ve olasılıklarını temel alan önek kodları oluşturur. Kesilmiş ikili. Sonlu bir alfabeyle tek tip olasılık dağılımları için kullanılan bir entropi kodlaması. İkili kodlamayı iyileştirin. Çalışma uzunluğu kodlaması. Oluşum sayısına göre aynı kod dizisini değiştiren birincil sıkıştırma. Sequitur. Bir dize üzerinde artan gramer çıkarımı. EZW (Dahili Sıfır Dalgalı Dalgalı). Bir görüntüyü artan doğrulukla bir bit akışına sıkıştırmak için aşamalı kodlama. Daha iyi sonuçlarla da kayıplı sıkıştırma olabilir.

Entropy kodlama Kod uzunluklarını sembollerin olasılıklarıyla eşleştirmek için sembollere kod atayan kodlama şeması.

Huffman kodlaması. Bağıl karakter frekanslarından yararlanan basit kayıpsız sıkıştırma. Uyarlanabilir Huffman kodlaması. Huffman kodlamasına dayanan uyarlamalı kodlama tekniği. Aritmetik kodlama. Gelişmiş entropi kodlaması. Aralık kodlaması. Aritmetik kodlama ile aynı, ancak biraz farklı bir şekilde baktı. Tekli kodlama. N ile bir sayıyı temsil eden kod, ardından sıfır ile bir sayı. Elias delta, gama, omega kodlaması. Pozitif tamsayıları kodlayan evrensel kod. Fibonacci kodlaması. Pozitif tamsayıları ikili kod kelimelerine kodlayan evrensel kod. Golomb kodlaması. Geometrik dağılımları takip eden alfabe için en uygun entropi kodlaması. Pirinç kodlaması. Geometrik dağılımları takip eden alfabe için en uygun entropi kodlaması.

Kayıplı sıkıştırma algoritmaları

Doğrusal tahmin kodlaması. Dijital bir konuşma sinyalinin spektral zarfını sıkıştırılmış biçimde gösteren, kayıplı sıkıştırma. A-yasa algoritması. Standart sıkıştırma algoritması. Mu-hukuk algoritması. Standart analog sinyal sıkıştırma veya sıkıştırma algoritması. Fraktal sıkıştırma Fraktallar kullanarak görüntüleri sıkıştırmak için kullanılan yöntem. Kodlamayı dönüştürün. Ses sinyalleri veya fotoğraf görüntüleri gibi veriler için veri sıkıştırma türü. Vektör ölçümü Teknik genellikle kayıplı veri sıkıştırmasında kullanılır. Dalgacık sıkıştırması. Görüntü ve ses sıkıştırması için çok uygun veri sıkıştırma biçimi.

Kriptografi

Gizli anahtar (simetrik şifreleme)

Hem şifre çözme hem de şifreleme için gizli bir anahtar (veya doğrudan ilişkili bir çift anahtar) kullanın.

Rijndael olarak da bilinen Gelişmiş Şifreleme Standardı (AES) . Blowfish. Schneier tarafından, genel olarak yaşlanan DE'nin yerine geçmesi amaçlanan bir algoritma olarak tasarlanmıştır. Veri Şifreleme Standardı (DES) , daha önce DE Algoritması. FİKİR (Uluslararası Veri Şifreleme Algoritması) . Eskiden IPES (Geliştirilmiş PES), DES için başka bir yedek. PGP (Pretty Good Privacy) tarafından kullanılmaktadır. Bir anahtar kullanarak bloklara bölünmüş verilerde dönüşümler gerçekleştirir. RC4 veya ARC4. Akış şifresi, Internet trafiği için SSL ve kablosuz ağlar için WEP gibi protokollerde yaygın olarak kullanılır. Küçük Şifreleme Algoritması. Bazı formüller kullanarak blok şifre algoritması uygulamak kolaydır. PES (Önerilen Şifreleme Standardı). IDEA için eski isim.

Genel anahtar (asimetrik şifreleme)

Genel anahtar ve özel anahtar olarak belirlenen bir çift anahtar kullanın. Genel anahtar mesajı şifreler, yalnızca özel anahtar şifresini çözmek için izin verir.

DSA (Dijital İmza Algoritması). Asal ve rasgele sayılarla anahtarlar oluşturun. ABD ajansları ve şimdi kamu malı tarafından kullanılıyordu. ElGamal. GNU Privacy Guard yazılımı, PGP ve diğer şifreleme sistemleri tarafından kullanılan Diffie-Hellman'a dayanmaktadır. RSA (Rivest, Shamir, Adleman). Elektronik ticaret protokollerinde yaygın olarak kullanılır. Asal sayıları kullanın. Diffie-Hellman (Merkle) anahtar değişimi (veya üstel anahtar değişimi). Korunmasız bir iletişim kanalı üzerinden sır paylaşma yöntemi ve algoritması. RSA tarafından kullanılır. NTRUEncrypt. Konvolüsyon çarpımları olan polinom halkalarını kullanın.

Mesaj özeti işlevleri

Bir mesaj özeti, bir dizginin veya herhangi bir uzunlukta bir verinin bir karma işlevi tarafından işlenen şifrelemesinden kaynaklanan bir koddur.

MD5. CD veya DVD'lerin ISO görüntülerini kontrol etmek için kullanılır. RIPEMD (RACE Bütünlüğü İlkelleri Değerlendirme Mesajı Özet). MD4 ilkelerine dayanır ve SHA-1'e benzer. SHA-1 (Güvenli Karma Algoritma 1). En sık ilişkili şifreleme hash fonksiyonlarının SHA setinde kullanılır. NSA ajansı tarafından tasarlanmıştır. HMAC. anahtarlı karma mesaj kimlik doğrulaması. Kaplan (TTH). Genellikle Tiger ağaç hash'lerinde kullanılır.

Sözde rasgele sayılar kullanarak şifreleme . Rastgele Sayı Üreticileri

Şifrelemede Teknikler

Gizli paylaşım, Gizli Bölünme, Anahtar Bölünme, N algoritmalarının M'si.

Shamir'in gizli paylaşım programı. Bu polinom interpolasyonu temel alan bir formüldür. Blakley'in gizli paylaşım planı. Doğada geometrik olan, sır M boyutlu bir uzayda bir noktadır.

Diğer teknikler ve şifre çözme

Alt küme toplamı. Bir tamsayılar kümesi verildiğinde, herhangi bir alt küme toplamı sıfıra eşit midir? Kriptografide kullanılır. Shor'ın algoritması. Kuantum algoritması, RSA gibi asimetrik fonksiyonlara dayanan bir kodun şifresini çözebilir.

Geometri

Hediye sarma. Bir nokta kümesinin dışbükey kabuğunun belirlenmesi. Gilbert-Johnson-Keerthi mesafesi. İki dışbükey şekil arasındaki en küçük mesafenin belirlenmesi. Graham taraması. Düzlemdeki bir nokta kümesinin dışbükey kabuğunun belirlenmesi. Çizgi segmenti kesişimi. Çizgilerin tarama çizgisi algoritmasıyla kesişip kesişmediğini bulma. Çokgenin üzerine gelin. Belirli bir noktanın verilen içinde olup olmadığını test eder. Işın / Düzlem kesişimi. * Çizgi / Üçgen kesişme * Özel ışın / düzlem kesişme durumu. Kapalı yüzeylerin çokgenleşmesi. Poligonal gösterimi olan yaklaşık bir yüzey. Nirengi.Bir noktaya olan mesafeyi açılardan diğer noktalara, uzaklığı bilinenlere göre değerlendirme yöntemi.

Grafikler 3D Yüzey İzleyici Teknolojisi. Gizli yüzeyler dikkate alınırken videolara duvarlara görüntü ekleme işlemi. Bellman-Ford. Ağırlıklı bir grafikte en kısa yolları hesaplar (kenar ağırlıklarının bir kısmı negatif olabilir). Dijkstra'nın algoritması. Negatif olmayan kenar ağırlıklarına sahip bir grafikteki en kısa yolları hesaplar. Pertürbasyon yöntemleri Grafikteki yerel olarak en kısa yolları hesaplayan bir algoritma. Floyd-Warshall. Tüm çiftlerin en kısa yol problemini ağırlıklı, yönlendirilmiş bir grafikte çözer. Floyd'un bisiklet bulması. Yinelemelerde döngüleri bulur. Johnson. Tüm çiftler seyrek ağırlıklı yönlendirilmiş grafikte en kısa yol algoritmasıdır. Kruskal.Bir grafik için minimum yayılan bir ağaç bulur. Prim en. Bir grafik için minimum yayılan bir ağaç bulur. Ayrıca DJP, Jarník veya Prim – Jarník algoritması olarak da adlandırılır . * Boruvka. * Bir grafik için minimum yayılma ağacı bulur. Ford-Fulkerson. Bir grafikteki maksimum akışı hesaplar. Edmonds-Karp. Ford-Fulkerson'ın uygulanması. Blokajsız Minimal Anahtarlama Anahtarı. Telefon değişimi için. Woodhouse-Sharp. Bir grafik için minimum yayılan bir ağaç bulur. Bahar dayalı. Grafik çizim algoritması. Macarca. Mükemmel bir eşleşme bulmak için algoritma. Boyama algoritması Grafik renklendirme algoritması. En yakın komşu.En yakın komşuyu bul. Topolojik sıralama. Yönlendirilmiş bir asiklik grafiği, her bir düğümün kenarları olan tüm düğümlerden önce geleceği şekilde (yönlere göre) sıralayın. Tarjan'ın çevrimdışı en az yaygın ata algoritması. Bir ağaçtaki düğüm çiftleri için en düşük ortak ataları hesaplayın.

Grafik

Bresenham'ın çizgi algoritması. Karar değişkenlerini, belirtilen 2 nokta arasında düz bir çizgi çizmek için kullanır. Manzara 3B manzara çizin. * DDA çizgi algoritması. * Belirtilen 2 nokta arasında düz bir çizgi çizmek için kayan nokta matematiğini kullanır. Taşkın dolgusu. Bağlı bir bölgeyi renkle doldurur. Görüntü geri yükleme. Fotoğrafı geri yükle, görüntüleri iyileştir. Xiaolin Wu'nun çizgi algoritması. Çizgi zehirlenmesi. Ressamın algoritması. 3 boyutlu bir sahnenin görünür kısımlarını algılar. Işın izleme. Gerçekçi görüntü işleme. Phong gölgeleme. 3B bilgisayar grafiklerinde bir aydınlatma modeli ve enterpolasyon yöntemi. Guraud gölgelendirme.Işık ve rengin farklı etkilerini 3B nesnenin yüzeyinde simüle edin. Tarama çizgisi oluşturma. Hayali bir çizgiyi hareket ettirerek bir görüntü oluşturur. Küresel aydınlatma. Doğrudan aydınlatma ve diğer nesnelerin yansımasını dikkate alır. İnterpolasyon. Dijital zoom gibi yeni veri noktaları oluşturmak. Resynthesizer. Fotoğraftaki bir nesneyi kaldırın ve Photoshop ve The Gimp tarafından kullanılan arka planı yeniden oluşturun. Resynthesizer öğretici. Şev-kesişim algoritması. Bir çizgi çizmek için eğim-kesişme formülünün bir uygulamasıdır. Spline enterpolasyonu. Runge fenomeninde hatayı azaltır. 3B Yüzey İzleyici Teknolojisi. Bir vidéo içindeki duvarlara görüntü veya vidéo eklemek, gizli yüzeyler dikkate alınır.

Listeler, diziler ve ağaçlar

Aranıyor

Sözlük araması. Tahmini aramaya bakın. Seçim algoritması. Listedeki en büyük öğeyi bulur. İkili arama algoritması. Sıralanmış listedeki bir öğeyi bulur. Genişlik-ilk arama. Bir grafik seviyesini seviyeye göre hareket ettirir. Derinlik öncelikli arama. Bir grafik dalını dallara göre hareket ettirir. En iyi ilk arama. Öncelik sırasını kullanarak bir grafiği olası önem sırasına göre hareket ettirir. Bir ağaç araması. * Hızı artırmak için buluşsal yöntemi kullanan en iyi ilk arama özel vakası. Tekdüze maliyet araştırması. Maliyetlerin değiştiği en düşük maliyet yolunu bulan bir ağaç araması. Tahmini arama.İkili benzeri arama, arama terimindeki büyüklüğü ve aramadaki yüksek ve düşük değerleri gösterir. Karma tablo. Doğrusal bir zamanda almak için anahtarları sıralanmamış bir koleksiyondaki öğelere ilişkilendirin. Enterpolasyonlu arama. Tahmini aramaya bakın.

sınıflandırma

İkili ağaç sıralama. İkilik bir ağacın sıralaması, artımlı, ekleme sırasına benzer. Saçma sıralama. Masa kartının verimsiz rastgele bir şekilde. Kabarcık sıralama. Her bir endeks çifti için, sıralı değilse öğeleri değiştirin. Kova sıralama. Bir listeyi kovalara bölün ve ayrı ayrı sıralayın. Güvercin deliği sıralamasını genelleştirir. Kokteyl sıralaması (veya çift yönlü balon, çalkalayıcı, dalgalanma, mekik, mutlu saatler sıralama). Her iki yöne göre sıralanan kabarcık türünün çeşitliliği listeden geçer. Tarak sıralama. “Kaplumbağaları” ortadan kaldıran listenin sonuna yakın küçük değerler ve boşluklardan faydalanan boşluklardan faydalanan etkili kabarcık çeşitliliği. Sıralama sayma.Bu uzunluktaki bir B dizisini oluşturmak için A listesindeki sayı dizisini kullanır. B'deki indeksler, A'daki kaç elementin i'den daha düşük bir değere sahip olduğunu saymak için kullanılır. Gnome tür. Ekleme düzenine benzer şekilde, bir elemanın uygun yerine taşınması dışında, kabarcık düzeninde olduğu gibi bir dizi değiş tokuş gerçekleştirilir. Heapsort. Listeyi bir yığına dönüştürün, en büyük öğeyi yığından kaldırmaya ve listenin sonuna eklemeye devam edin. Ekleme sıralama Geçerli öğenin sıralananlar listesinde nereye ait olduğunu belirleyin ve buraya yerleştirin. İçgözlemle sıralama. Ya da introspektif sıralama. Quicksort ile başlar ve belirli bir özyineleme düzeyinde heapsort'a geçer. Birleştirme sıralaması.Listenin birinci ve ikinci yarısını ayrı ayrı sıralayın, ardından sıralanan listeleri birleştirin. Krep sıralaması. Bir dizinin bazı öneki öğelerinin tersi. Güvercin yuvası sıralama. Boş bir diziyi, sıralanacak dizinin tüm unsurları ile doldurun. Postacı sıralama. Postaneler tarafından kullanılan hiyerarşik kova çeşitleri. Hızlı sıralama. İlk listedeki tüm öğeler ikinci listedeki tüm öğelerden önce gelecek şekilde listeyi ikiye bölün .; sonra iki listeyi sıralayın. Genellikle tercih edilen yöntem. Radix sıralama. Rakamları işleyerek, öğelere veya tam sayıya bağlı anahtarları sıralar. Seçim sırası Kalan öğelerin en küçüğünü seçin, sıralanan listenin sonuna ekleyin. Kabuk sıralaması.Değerler arasındaki boşlukların kullanılmasıyla ekleme düzenini geliştirir. Rahat sıralama. Heapsort'a bakınız. Stokastik sıralama. Bogosort'a bakınız.

ve daha fazlası...


0

Soru başlığında iki soru sordunuz, bu yüzden ikisine de cevap vereceğim.

Evet, Bilgisayar Bilimi tamamen algoritmalarla ilgilidir. Şey ... aslında bu biraz yanıltıcı çünkü bilgisayar biliminin birçok yönü var, o yüzden tekrar ifade edeceğim. İş dünyasında uygulandığı şekliyle bilgisayar bilimi ağırlıklı olarak algoritmalarla ilgilidir. Google, Facebook ve Wall Street'teki tüm bu çılgın yerler gibi şirketler Fizikçiler ve Geliştiriciler kiralıyorlar, basit bir forma indirgenmiş oldukça karmaşık problemler istiyorlar ki bu da kendi başına derin bir matematik anlayışı ve algoritma tasarımı gerektiriyor.

Hayır, Programlama algoritmalarla ilgili değildir. Programlama, teknik özelliklerin alınması ve yürütülmesi için derlenebilecek koda dönüştürülmesi ile ilgilidir.

Cevabın ek kısmı: Yazılım Geliştirme programlama değildir, ancak birçoğu terimleri birbirine karıştırıyor ve bunları birbirlerinin yerine kullanıyor gibi görünüyor. Programlama sadece belki de daha büyük Yazılım Geliştirme sürecinin bir işlevi veya tekniğidir. Yazılım Geliştirme kesinlikle tüm algoritmalar ile ilgili değildir, yazılımla ilgili problemleri çözmek ve problemlerin verimli bir şekilde çözülebilmesi için sağlam iş uyumlu süreçler uygulamakla ilgilidir. Yazılım geliştirme süreçleri - ve hatta kendini programlama - doğası gereği algoritmik süreçler olsa da, bu algoritmalarla ilgili değildir .

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.