Algoritma - Algorithm

Akış çizelgesi bir algoritmanın (Öklid algoritması ) iki sayının en büyük ortak bölenini (g.c.d.) hesaplamak için a ve b A ve B olarak adlandırılan yerlerde algoritma, iki döngüde art arda çıkarmalar ile ilerler: EĞER test B ≥ A "evet" veya "doğru" sonucunu verirse (daha doğrusu, numara b B konumunda daha büyük veya eşittir numara a A konumunda) SONRA, algoritma B ← B - A'yı belirtir (sayı ba eskisinin yerini alır b). Benzer şekilde, EĞER A> B, SONRA A ← A - B. İşlem, B'nin (içeriği) 0 olduğu zaman sona erer ve g.c.d. A. (Scott 2009: 13'ten türetilen algoritma; Tausworthe 1977'den semboller ve çizim stili).
Ada Lovelace ilk yayınlanan bilgisayar algoritması olan "not G" deki diyagramı

İçinde matematik ve bilgisayar Bilimi, bir algoritma (/ˈælɡərɪðəm/ (Bu ses hakkındadinlemek)) sonlu bir dizidir iyi tanımlanmış, tipik olarak bir problem sınıfını çözmek veya bir hesaplama yapmak için bilgisayarda uygulanabilir talimatlar.[1][2] Algoritmalar her zaman kesin ve performans için özellikler olarak kullanılır hesaplamalar, veri işleme, otomatik muhakeme ve diğer görevler.

Bir etkili yöntem, bir algoritma sınırlı bir uzay ve zaman miktarı içinde ifade edilebilir,[3] ve iyi tanımlanmış resmi bir dilde[4] hesaplamak için işlevi.[5] İlk durumdan ve ilk girişten başlayarak (belki boş ),[6] talimatlar bir hesaplama o, ne zaman idam, sonlu bir[7] sonunda "çıktı" üreten iyi tanımlanmış ardışık durumların sayısı[8] ve son bir bitiş durumunda sona erdirme. Bir durumdan diğerine geçiş mutlaka gerekli değildir belirleyici; olarak bilinen bazı algoritmalar rastgele algoritmalar, rastgele girdi içerir.[9]

Algoritma kavramı antik çağlardan beri var olmuştur. Aritmetik gibi algoritmalar bölme algoritması, eskiden kullanıldı Babil matematikçiler c. MÖ 2500 ve Mısırlı matematikçiler c. MÖ 1550.[10] Yunan matematikçiler daha sonra kullanılan algoritmalar Eratosthenes eleği asal sayıları bulmak için,[11] ve Öklid algoritması bulmak için en büyük ortak böleni iki sayı.[12] Arap matematikçiler gibi al-Kindi 9. yüzyılda kullanılmış kriptografik için algoritmalar kod kırma, dayalı frekans analizi.[13]

Kelime algoritma kendisi 9. yüzyıl matematikçisinin adından türetilmiştir Muḥammad ibn Mūsā al-Khwārizmī, kimin Nisba (onu kimden olarak tanımlıyor Khwarazm ) Latinleştirildi Algoritmi olarak.[14] Modern algoritma kavramının ne olacağına dair kısmi bir biçimselleştirme, Entscheidungsproblem (karar sorunu) David Hilbert 1928'de. Daha sonra resmileştirmeler "etkili hesaplanabilirlik "[15] veya "etkili yöntem".[16] Bu formalizasyonlar şunları içeriyordu: GödelHerbrandKleene özyinelemeli işlevler 1930, 1934 ve 1935, Alonzo Kilisesi 's lambda hesabı 1936 yılı Emil Post 's Formülasyon 1 1936 ve Alan Turing 's Turing makineleri 1936–37 ve 1939.

Etimoloji

'Algoritma' kelimesinin kökleri nisbayı Latinceleştirmeye dayanır ve coğrafi kökenini gösterir. Farsça matematikçi Muhammed ibn Musa el-Harizmi -e Algorismus.[17][18] El-Harezmi (Araplaştırılmış Farsça الخوارزمی c. 780–850) bir matematikçiydi, astronom, coğrafyacı ve bilgin Bilgelik Evi içinde Bağdat,[11] adı 'yerli Khwarazm ', parçası olan bir bölge Büyük İran ve şimdi içinde Özbekistan.[19][20]

Harizmi yaklaşık 825, bir Arap Dili üzerine tez Hindu-Arap rakam sistemi, tercüme edildi Latince 12. yüzyılda. Makale şu cümle ile başlar: Dixit Algorizmi ('Böyle konuştu Al-Harizmi'), burada "Algorizmi" çevirmenin Latinizasyon Harizmi'nin adı.[21] El-Harizmi, Orta Çağ'ın sonlarında Avrupa'da en çok okunan matematikçiydi. Cebir.[22] Geç ortaçağ Latincesinde, Algorismus, İngilizce 'algorizm ', adının bozulması, sadece "ondalık sayı sistemi" anlamına geliyordu.[23] 15. yüzyılda, Yunanca ἀριθμός kelimesinin etkisi altında (aritmos), 'numara' (cf. 'aritmetik'), Latince kelime olarak değiştirildi algoritmave buna karşılık gelen İngilizce "algoritma" terimi ilk olarak 17. yüzyılda onaylandı; modern anlam 19. yüzyılda tanıtıldı.[24]

İngilizcede, ilk olarak yaklaşık 1230'da kullanıldı ve daha sonra Chaucer İngilizce, Fransızca terimi benimsedi, ancak 19. yüzyılın sonlarına kadar "algoritma", modern İngilizcede sahip olduğu anlamı kazanmadı.[25]

Kelimenin başka bir erken kullanımı, 1240'tan itibaren başlıklı bir kılavuzda Carmen de Algorismo tarafından bestelenmek Alexandre de Villedieu. Şununla başlar:

Haec algorismus ars praesens dicitur, in qua / Talibus Indorum fruimur bis quinque figuris.

bu da şu anlama gelir:

Algoritma, şu anda iki çarpı beş numara olan bu Hint figürlerini kullanma sanatıdır.

Şiir birkaç yüz satır uzunluğundadır ve hesaplama sanatını yeni tarz Hint zarıyla özetler (Tali Indorum) veya Hindu rakamları.[26]

Gayri resmi tanım

Gayri resmi bir tanım, "bir işlem dizisini kesin olarak tanımlayan bir kurallar dizisi" olabilir,[27][doğrulamak için teklife ihtiyacım var ] tüm bilgisayar programlarını (sayısal hesaplamalar yapmayan programlar dahil) ve (örneğin) herhangi bir öngörülen bürokratik prosedür[28]veya yemek kitabı yemek tarifi.[29]

Genel olarak, bir program yalnızca sonunda durursa bir algoritmadır.[30] - buna rağmen sonsuz döngüler bazen arzu edilir olabilir.

Bir algoritmanın prototip bir örneği, Öklid algoritması, iki tam sayının maksimum ortak bölenini belirlemek için kullanılır; bir örnek (başkaları da var) tarafından akış şeması yukarıda ve daha sonraki bir bölümde örnek olarak.

Boolos, Jeffrey ve 1974, 1999 Aşağıdaki alıntıda "algoritma" kelimesinin resmi olmayan bir anlamını sunun:

Hiçbir insan yeterince hızlı, yeterince uzun veya yeterince küçük yazamaz † († "sınırsız daha küçük ve daha küçük… moleküller, atomlar, elektronlar üzerine yazmaya çalışıyorsunuz") sayısız sonsuzluğun tüm üyelerini listelemeye çalışıyorsunuz isimlerini birbiri ardına yazarak ayarlayın. Ancak, sayısız sonsuz kümeler söz konusu olduğunda, insanlar eşit derecede faydalı bir şey yapabilirler: belirlemek için açık talimatlar nsetin inci üyesi, keyfi sonlu için n. Bu tür talimatlar, oldukça açık bir şekilde, bir bilgi işlem makinesi tarafından takip edilebilirlerveya bir semboller üzerinde çok basit işlemler gerçekleştirebilen insan.[31]

Bir "sayısız sonsuz küme" elemanları tamsayılarla bire bir yazışmalara sokulabilen olandır. Böylelikle Boolos ve Jeffrey, bir algoritmanın, bir işlemin bir keyfi Teoride keyfi olarak büyük olabilen "girdi" tamsayı veya tamsayılar. Örneğin, bir algoritma aşağıdaki gibi bir cebirsel denklem olabilir y = m + n (yani, iki rastgele "giriş değişkeni" m ve n çıktı üreten y), ancak çeşitli yazarların bu kavramı tanımlama girişimleri, kelimenin bundan çok daha fazlasını ima ettiğini, sırasına göre (ekleme örneği için):

Kesin talimatlar ("bilgisayar" tarafından anlaşılan bir dilde)[32] hızlı, verimli, "iyi"[33] "bilgisayarın" "hareketlerini" belirten işlem (makine veya insan, gerekli dahili olarak içerilen bilgi ve yeteneklerle donatılmış)[34] rastgele girdi tam sayıları / sembolleri bulmak, kodunu çözmek ve işlemek için m ve n, semboller + ve = … Ve "etkili"[35] "makul" bir sürede üretmek,[36] çıktı tamsayı y belirli bir yerde ve belirli bir formatta.

Kavramı algoritma ayrıca kavramını tanımlamak için kullanılır karar verebilirlik - nasıl olduğunu açıklamak için merkezi bir fikir resmi sistemler küçük bir gruptan başlayarak aksiyomlar ve kurallar. İçinde mantık Bir algoritmanın tamamlanması gereken zaman, görünüşte alışılmış fiziksel boyutla ilişkili olmadığı için ölçülemez. Devam eden çalışmayı karakterize eden bu tür belirsizliklerden, bir tanımın bulunmamasından kaynaklanır. algoritma terimin hem somut (bir anlamda) hem de soyut kullanımına uygun.

Resmileştirme

Algoritmalar, bilgisayarların verileri işleme biçimi için çok önemlidir. Çoğu bilgisayar programı, çalışanların maaş çeklerini hesaplamak veya öğrencilerin karnelerini yazdırmak gibi belirli bir görevi yerine getirmek için bir bilgisayarın gerçekleştirmesi gereken belirli talimatları - belirli bir sırayla - ayrıntılandıran algoritmalar içerir. Bu nedenle, bir algoritma, bir tarafından simüle edilebilen herhangi bir işlem dizisi olarak düşünülebilir. Turing tamamlandı sistemi. Bu tezi savunan yazarlar arasında Minsky (1967), Savage (1987) ve Gurevich (2000) bulunmaktadır:

Minsky: "Ama Turing ile birlikte ..." doğal olarak "etkili olarak adlandırılabilecek herhangi bir prosedürün aslında (basit) bir makine tarafından gerçekleştirilebileceğini de sürdüreceğiz. Bu aşırı görünse de, argümanlar ... kendi lehine. çürütmek zordur ".[37]

Gurevich: “… Turing'in tezi lehine gayri resmi argümanı daha güçlü bir tezi haklı çıkarır: Her algoritma bir Turing makinesi tarafından simüle edilebilir… Savage'a [1987] göre, bir algoritma bir Turing makinesi tarafından tanımlanan bir hesaplama sürecidir".[38]

Turing makineleri, sona ermeyen hesaplama süreçlerini tanımlayabilir. Algoritmaların gayri resmi tanımları genellikle algoritmanın her zaman sona ermesini gerektirir. Bu gereklilik, resmi bir prosedürün bir algoritma olup olmadığına karar verme görevini, genel durumda imkansız hale getirir - büyük bir teoremi nedeniyle hesaplanabilirlik teorisi olarak bilinir durdurma sorunu.

Tipik olarak, bir algoritma işlem bilgisi ile ilişkilendirildiğinde, veriler bir giriş kaynağından okunabilir, bir çıktı cihazına yazılabilir ve daha fazla işlem için saklanabilir. Depolanan veriler, algoritmayı gerçekleştiren varlığın dahili durumunun bir parçası olarak kabul edilir. Uygulamada, durum bir veya daha fazla veri yapıları.

Bu hesaplama işlemlerinden bazıları için, algoritmanın titizlikle tanımlanması gerekir: ortaya çıkabilecek tüm olası durumlarda uygulanacağı şekilde belirtilmelidir. Bu, herhangi bir koşullu adımın sistematik olarak duruma göre ele alınması gerektiği anlamına gelir; her durum için kriterler açık (ve hesaplanabilir) olmalıdır.

Bir algoritma, kesin adımların kesin bir listesi olduğundan, hesaplama sırası, algoritmanın işleyişi için her zaman çok önemlidir. Talimatların genellikle açıkça listelendiği varsayılır ve "yukarıdan" başlayıp "aşağıya doğru" olarak tanımlanır. Bu fikir daha resmi olarak şu şekilde açıklanır: kontrol akışı.

Şimdiye kadar, bir algoritmanın resmileştirilmesine ilişkin tartışma, zorunlu programlama. Bu, bir görevi ayrı, "mekanik" yollarla tanımlamaya çalışan en yaygın kavramdır. Bu resmileştirilmiş algoritma anlayışına özgü, atama işlemi, bir değişkenin değerini ayarlar. "Sezgisinden türemiştir"hafıza "Karalama defteri olarak. Böyle bir atamanın bir örneği aşağıda bulunabilir.

Bir algoritmayı neyin oluşturduğuna dair bazı alternatif kavramlar için bkz. fonksiyonel programlama ve mantık programlama.

Algoritmaları ifade etmek

Algoritmalar, aşağıdakiler de dahil olmak üzere birçok tür gösterimle ifade edilebilir: doğal diller, sözde kod, akış şemaları, drakon çizelgeleri, Programlama dilleri veya kontrol tabloları (işleyen tercümanlar ). Algoritmaların doğal dil ifadeleri ayrıntılı ve belirsiz olma eğilimindedir ve nadiren karmaşık veya teknik algoritmalar için kullanılır. Sözde kod, akış şemaları, drakon çizelgeleri ve kontrol tabloları, doğal dile dayalı ifadelerde yaygın olan belirsizliklerin çoğundan kaçınan algoritmaları ifade etmenin yapılandırılmış yollarıdır. Programlama dilleri, öncelikle algoritmaları bir bilgisayar tarafından yürütülebilecek bir biçimde ifade etmeye yöneliktir, ancak aynı zamanda genellikle algoritmaları tanımlamanın veya belgelemenin bir yolu olarak da kullanılır.

Mümkün olan çok çeşitli temsiller vardır ve bir kişi belirli bir Turing makinesi makine tabloları dizisi olarak programlayın (bkz. sonlu durum makinesi, durum geçiş tablosu ve kontrol tablosu daha fazlası için), akış şemaları olarak ve drakon çizelgeleri (görmek durum diyagramı daha fazlası için) veya ilkel bir biçim olarak makine kodu veya montaj kodu "dörtlü setler" olarak adlandırılır (bkz. Turing makinesi daha fazlası için).

Algoritmaların temsilleri, aşağıdaki gibi Turing makine tanımlamasının kabul edilen üç seviyesinde sınıflandırılabilir:[39]

1 Üst düzey açıklama
“… Uygulama ayrıntılarını görmezden gelerek bir algoritmayı tanımlamaya çalışıyor. Bu seviyede, makinenin bandını veya kafasını nasıl yönettiğinden bahsetmemize gerek yok. "
2 Uygulama açıklaması
“… Turing makinesinin kafasını kullanma şeklini ve verileri kasetinde saklama şeklini tanımlamak için kullanılan nesir. Bu düzeyde, durumların veya geçiş işlevinin ayrıntılarını vermeyiz. "
3 Resmi açıklama
En ayrıntılı, "en düşük seviye", Turing makinesinin "durum tablosunu" verir.

Her üç seviyede de açıklanan "m + n ekle" basit algoritmasının bir örneği için, bkz. Algoritma # Örnekler.

Tasarım

Algoritma tasarımı, problem çözme ve mühendislik algoritmaları için bir yöntemi veya matematiksel bir süreci ifade eder. Algoritmaların tasarımı, birçok çözüm teorisinin bir parçasıdır. operasyon araştırması, gibi dinamik program ve böl ve fethet. Algoritma tasarımlarını tasarlama ve uygulama tekniklerine algoritma tasarım kalıpları da denir.[40] şablon yöntem modeli ve dekoratör modeli dahil örnekler ile.

Algoritma tasarımının en önemli yönlerinden biri, verimli bir çalışma zamanına sahip olan algoritmanın oluşturulmasında yatmaktadır. Büyük O.

Algoritma geliştirmede tipik adımlar:

  1. Problem tanımı
  2. Bir modelin geliştirilmesi
  3. Algoritmanın özellikleri
  4. Bir algoritma tasarlamak
  5. Kontrol etmek doğruluk algoritmanın
  6. Algoritmanın analizi
  7. Algoritmanın uygulanması
  8. Program testi
  9. Belgelerin hazırlanması

Uygulama

Mantıksal NAND elektronik olarak uygulanan algoritma 7400 yonga

Çoğu algoritmanın şu şekilde uygulanması amaçlanmıştır: bilgisayar programları. Bununla birlikte, algoritmalar aynı zamanda başka yollarla da uygulanır. biyolojik sinir ağı (örneğin, İnsan beyni uygulama aritmetik veya yiyecek arayan bir böcek), bir elektrik devresi veya mekanik bir cihazda.

Bilgisayar algoritmaları

Kanonik akış çizelgesi örnekleri Böhm-Jacopini yapıları: SIRA (sayfanın altındaki dikdörtgenler), WHILE-DO ve IF-THEN-ELSE. Üç yapı ilkel koşullu GOTO'dan yapılmıştır (TEST EDERSEN SONRA adım xxx, elmas olarak gösterilir), koşulsuz GOTO (dikdörtgen), çeşitli atama operatörleri (dikdörtgen) ve HALT (dikdörtgen). Bu yapıların atama bloklarının içine yerleştirilmesi, karmaşık diyagramlarla sonuçlanır (cf. Tausworthe 1977: 100, 114).

İçinde bilgisayar sistemleri bir algoritma temelde mantık yazılım geliştiricileri tarafından yazılımda yazılmış, amaçlanan "hedef" bilgisayar (lar) ın üretmesi için etkili olacak çıktı verilenden (belki boş) giriş. Optimal bir algoritma, eski donanımda bile çalıştırıldığında, optimal olmayanlardan (daha yüksek zaman karmaşıklığı ) aynı amaca yönelik, daha verimli donanımda çalışan algoritma; bu nedenle bilgisayar donanımı gibi algoritmalar teknoloji olarak kabul edilir.

"Zarif" (kompakt) programlar, "iyi" (hızlı) programlar : "Basitlik ve zarafet" kavramı, Knuth ve tam olarak Chaitin:

Knuth: "… istiyoruz iyi bazı gevşek tanımlanmış estetik anlamda algoritmalar. Kriterlerden biri… algoritmayı gerçekleştirmek için geçen sürenin uzunluğudur…. Diğer kriterler, algoritmanın bilgisayarlara uyarlanabilirliği, basitliği ve şıklığı vb. "[41]
Chaitin: "… bir program 'zarif', yani yaptığı çıktıyı üretmek için mümkün olan en küçük program demek istiyorum."[42]

Chaitin tanımına şöyle diyor: "Bir programın 'zarif olduğunu kanıtlayamayacağınızı göstereceğim'"- böyle bir kanıt, Durma sorunu (ibid).

Algoritma ve bir algoritma ile hesaplanabilen fonksiyon: Belirli bir işlev için birden fazla algoritma mevcut olabilir. Bu, programcının kullanabileceği mevcut komut setini genişletmeden bile doğrudur. Rogers şunu gözlemliyor: "Bu ... kavramını ayırt etmek önemlidir. algoritma, yani prosedür ve kavramı algoritma ile hesaplanabilen işlev, yani haritalama prosedür tarafından sağlanmıştır. Aynı işlev birkaç farklı algoritmaya sahip olabilir ".[43]

Ne yazık ki, iyilik (hız) ve zarafet (kompaktlık) arasında bir değiş tokuş olabilir — zarif bir program, bir hesaplamayı tamamlamak için daha az zarif olandan daha fazla adım atabilir. Euclid'in algoritmasını kullanan bir örnek aşağıda görülmektedir.

Bilgisayarlar (ve bilgisayarlar), hesaplama modelleri: Bir bilgisayar (veya insan "bilgisayar"[44]) kısıtlı bir makine türüdür, "ayrık deterministik mekanik bir cihazdır"[45] talimatlarını körü körüne takip eden.[46] Melzak ve Lambek'in ilkel modelleri[47] bu kavramı dört öğeye indirgedi: (i) ayrık, ayırt edilebilir yerler, (ii) ayrık, ayırt edilemez sayaçlar[48] (iii) bir aracı ve (iv) bir talimat listesi etkili temsilcinin kabiliyetine göre.[49]

Minsky, Lambek'in "abaküs" modelinin daha uygun bir varyasyonunu "Çok Basit Temeller Hesaplanabilirlik ".[50] Minsky'nin makinesi Koşullu IF – THEN GOTO veya koşulsuz GOTO, program akışını sırayla değiştirmedikçe, beş (veya birinin nasıl sayıldığına bağlı olarak altı) talimatı boyunca sırayla ilerler. HALT'ın yanı sıra, Minsky'nin makinesi üç Görev (değiştirme, ikame)[51] işlemler: SIFIR (ör. 0 ile değiştirilen konum içeriği: L ← 0), SUCCESSOR (ör. L ← L + 1) ve DÜŞÜRME (ör. L ← L - 1).[52] Bir programcı nadiren böyle sınırlı bir komut setiyle "kod" yazmalıdır. Ancak Minsky, (Melzak ve Lambek gibi) makinesinin Turing tamamlandı sadece dört generalle türleri talimatlar: koşullu GOTO, koşulsuz GOTO, atama / değiştirme / ikame ve HALT. Bununla birlikte, Turing tamlığı için birkaç farklı atama talimatı (örneğin, bir Minsky makinesi için AZALTMA, ARTIRMA ve SIFIR / TEMİZLE / BOŞ) da gereklidir; kesin özellikleri bir şekilde tasarımcıya kalmıştır. Koşulsuz GOTO bir rahatlıktır; özel bir konumu sıfıra başlatarak inşa edilebilir, ör. "Z ← 0" talimatı; daha sonra EĞER Z = 0 SONRA GOTO xxx komutu koşulsuzdur.

Bir algoritmanın simülasyonu: bilgisayar (bilgisayar) dili: Knuth okuyucuya "bir algoritmayı öğrenmenin en iyi yolunun onu denemektir ... hemen kalem kağıt alıp bir örnek üzerinde çalışın" tavsiyesinde bulunuyor.[53] Peki ya gerçek şeyin simülasyonu ya da uygulaması? Programcı, algoritmayı simülatörün / bilgisayarın / hesaplayıcının yapabileceği bir dile çevirmelidir. etkili bir şekilde yürütmek. Stone bunun bir örneğini veriyor: İkinci dereceden bir denklemin köklerini hesaplarken, hesaplayıcı nasıl karekök alacağını bilmelidir. Aksi takdirde, algoritmanın etkili olması için bir karekök çıkarmak için bir dizi kural sağlamalıdır.[54]

Bu, programcının hedef hesaplama aracısına (bilgisayar / bilgisayar) göre etkili olan bir "dil" bilmesi gerektiği anlamına gelir.

Fakat simülasyon için hangi model kullanılmalıdır? Van Emde Boas şunu gözlemliyor " karmaşıklık teorisi somut makineler yerine soyutta, model seçiminin keyfiliği kalır. İşte bu noktada simülasyon girer ".[55] Hız ölçülürken komut seti önemlidir. Örneğin, Euclid algoritmasındaki kalanı hesaplamak için kullanılan alt program, programcının bir "modül "sadece çıkarma yerine talimat mevcut (veya daha kötüsü: sadece Minsky'nin" azaltması ").

Yapısal programlama, kanonik yapılar: Kilise-Turing tezi herhangi bir algoritma olduğu bilinen bir model tarafından hesaplanabilir Turing tamamlandı ve Minsky'nin gösterilerine göre, Turing tamlığı yalnızca dört talimat türü gerektirir - koşullu GOTO, koşulsuz GOTO, atama, HALT. Kemeny ve Kurtz, koşulsuz GOTO'ların ve koşullu IF-THEN GOTO'ların "disiplinsiz" kullanımının "spagetti kodu ", bir programcı yalnızca bu talimatları kullanarak yapılandırılmış programlar yazabilir; diğer yandan" yapılandırılmış bir dilde kötü yapılandırılmış programlar yazmak da mümkündür ve çok zor değildir ".[56] Tausworthe üçü artırıyor Böhm-Jacopini kanonik yapılar:[57] SEQUENCE, IF-THEN-ELSE ve WHILE-DO, iki tane daha: DO-WHILE ve CASE.[58] Yapılandırılmış bir programın ek bir yararı da, doğruluk kanıtları kullanma matematiksel tümevarım.[59]

Kanonik akış şeması sembolleri[60]: A olarak adlandırılan grafik yardımcısı akış şeması, bir algoritmayı (ve bir bilgisayar programını) tanımlamak ve belgelemek için bir yol sunar. Bir Minsky makinesinin program akışı gibi, bir akış şeması her zaman sayfanın üstünden başlar ve aşağı doğru ilerler. Ana sembolleri sadece dörttür: program akışını gösteren yönlendirilmiş ok, dikdörtgen (SIRA, GİT), elmas (IF-THEN-ELSE) ve nokta (VEYA-bağı). Böhm – Jacopini kanonik yapıları bu ilkel şekillerden yapılmıştır. Alt yapılar dikdörtgenler içinde "iç içe geçebilir", ancak yalnızca üst yapıdan tek bir çıkış olursa. Semboller ve kanonik yapıları oluşturmak için kullanımları şemada gösterilmiştir.

Örnekler

Algoritma örneği

En basit algoritmalardan biri, rastgele sıralı sayılar listesinde en büyük sayıyı bulmaktır. Çözümü bulmak, listedeki her numaraya bakmayı gerektirir. Bundan, İngilizce düzyazıda üst düzey bir açıklamada aşağıdaki gibi ifade edilebilecek basit bir algoritma izlenir:

Üst düzey açıklama:

  1. Sette numara yoksa en yüksek numara yoktur.
  2. Kümedeki ilk sayının kümedeki en büyük sayı olduğunu varsayalım.
  3. Kümedeki kalan her sayı için: Bu sayı mevcut en büyük sayıdan büyükse, bu sayının kümedeki en büyük sayı olduğunu düşünün.
  4. Kümede yinelenecek numara kalmadığında, mevcut en büyük sayının kümedeki en büyük sayı olduğunu düşünün.

(Yarı-) resmi açıklama:Düzyazı ile yazılmış, ancak bir bilgisayar programının yüksek seviyeli diline çok daha yakın olan, aşağıdaki algoritmanın daha resmi kodlamasıdır. sözde kod veya pidgin kodu:

Algoritma LargestNumber Input: Bir sayı listesi L. Çıktı: Listedeki en büyük sayı L.
  Eğer L. boyutu = 0 dönüş boş en büyükL[0]  her biri için eşya içinde L, yapmak    Eğer eşya > en büyük, sonra      en büyükeşya  dönüş en büyük
  • "←", Görev. Örneğin, "en büyükeşya"değerinin en büyük değerindeki değişiklikler eşya.
  • "dönüş"algoritmayı sonlandırır ve aşağıdaki değeri verir.

Öklid algoritması

Öklid'in algoritmasının T.L.'den örnek diyagramı. Heath (1908), daha fazla ayrıntı eklenmiş. Öklid üçüncü bir ölçümün ötesine geçmez ve sayısal örnekler vermez. Nicomachus 49 ve 21 örneğini verir: "Küçük olanı büyükten çıkarıyorum; 28 kaldı; sonra yine bundan aynı 21'i çıkarıyorum (bu mümkün); 7 kaldı; bunu 21'den çıkarıyorum, 14 sola; buradan tekrar 7 çıkarıyorum (bunun için mümkün); 7 kaldı, ancak 7'den 7 çıkarılamaz. " Heath, "Son cümle ilginçtir, ancak anlamı yeterince açıktır, aynı zamanda 'bir ve aynı sayıda' biten cümlenin anlamı da yeterince açıktır." (Heath 1908: 300).

Öklid hesaplamak için algoritması en büyük ortak böleni (GCD) iki sayıya, Kitap VII'de ("Temel Sayılar Teorisi") Önerme II olarak görünür. Elementler.[61] Öklid sorunu şu şekilde ortaya koyuyor: "En büyük ortak ölçülerini bulmak için birbirine asal olmayan iki sayı verildiğinde". "Bir sayıyı birimlerden oluşan bir çokluk" olarak tanımlar: bir sayma sayısı, sıfır içermeyen pozitif bir tam sayı. "Ölçmek", daha kısa bir ölçüm uzunluğu yerleştirmektir s art arda (q kez) uzun uzunluk boyunca l kalan kısma kadar r kısa uzunluktan daha az s.[62] Modern bir deyişle, kalan r = lq×s, q bölüm olmak veya kalan r "modül", bölünmeden sonra kalan tam sayı-kesirli kısımdır.[63]

Öklid yönteminin başarılı olması için, başlangıç ​​uzunluklarının iki gereksinimi karşılaması gerekir: (i) uzunluklar sıfır olmamalıdır VE (ii) çıkarma "uygun" olmalıdır; yani bir test, iki sayıdan küçük olanın büyük olandan çıkarıldığını garanti etmelidir (veya ikisi eşit olabilir, böylece çıkarma sıfır verir).

Öklid'in orijinal ispatı üçüncü bir şartı daha ekler: iki uzunluk birbirine asal olmamalıdır. Öklid bunu bir Redüktör reklamı absurdum iki sayının ortak ölçüsünün aslında En büyük.[64] Nicomachus'un algoritması Öklid'in algoritmasıyla aynı olsa da, sayılar birbirine asal olduğunda, ortak ölçüleri için "1" sayısını verir. Yani, kesin olmak gerekirse, aşağıdaki gerçekten Nicomachus'un algoritmasıdır.

1599 ve 650 için en büyük ortak böleni bulmak için Öklid algoritmasının grafiksel bir ifadesi.
 1599 = 650×2 + 299 650 = 299×2 + 52 299 = 52×5 + 39 52 = 39×1 + 13 39 = 13×3 + 0

Öklid algoritması için bilgisayar dili

Sadece birkaç talimat türleri Euclid algoritmasını çalıştırmak için gereklidir — bazı mantıksal testler (koşullu GOTO), koşulsuz GOTO, atama (değiştirme) ve çıkarma.

  • Bir yer büyük harf (ler) ile sembolize edilir, ör. S, A vb.
  • Bir konumdaki değişen miktar (sayı) küçük harf (ler) ile yazılır ve (genellikle) konumun adıyla ilişkilendirilir. Örneğin, başlangıçtaki L konumu şu numarayı içerebilir: l = 3009.

Öklid algoritması için uygun olmayan bir program

"Inelegant", Knuth'un algoritma versiyonunun, bölme kullanımının (veya bir "modül" talimatının) yerini alan çıkarma tabanlı bir kalan döngü ile bir çevirisidir. Knuth 1973'ten türetilmiştir: 2–4. İki sayıya bağlı olarak "Inelegant" g.c.d'yi hesaplayabilir. "Elegant" dan daha az adımda.

Aşağıdaki algoritma, Knuth'un Öklid ve Nicomachus'un dört aşamalı versiyonu olarak çerçevelenmiştir, ancak kalanını bulmak için bölmeyi kullanmak yerine, daha kısa uzunluğun ardışık çıkarımlarını kullanır. s kalan uzunluktan r a kadar r daha az s. Kalın yazı tipiyle gösterilen üst düzey açıklama Knuth 1973: 2–4'ten uyarlanmıştır:

GİRİŞ:

1 [L ve S sayılarını iki konuma l ve s iki uzunluğu temsil eden]: INPUT L, S2 [R'yi başlatın: kalan uzunluğu yapın r başlangıç ​​/ başlangıç ​​/ giriş uzunluğuna eşit l]: R ← L

E0: [Sağlayın rs.]

3 [İki sayıdan küçük olanın S'de ve daha büyük olanın R'de olduğundan emin olun]: EĞER R> S SONRA L'nin içeriği daha büyük sayıdır, bu nedenle değişim adımlarını atlayın 4, 5 ve 6: GOTO adım 6  DEĞİLSE R ve S'nin içeriğini değiştirir.4   L ← R (bu ilk adım gereksizdir, ancak sonraki tartışma için kullanışlıdır).5   R ← S6   S ← L

E1: [Kalanı bul]: Kalan uzunluğa kadar r R'de kısa uzunluktan daha az s S'de, ölçüm numarasını art arda çıkarın s kalan uzunluktan S cinsinden r R.

7 EĞER S> R SONRA ölçüm bitmişse GOTO 10  ELSE tekrar ölçün,8   R ← R - S9   [Kalan döngü]: GOTO 7.

E2: [Kalan sıfır mı?]: EITHER (i) son ölçü kesin, R'de kalan sıfırdır ve program durabilir, VEYA (ii) algoritma devam etmelidir: son ölçü, S'deki ölçüm sayısından daha küçük bir kalan R'de kalmıştır.

10 EĞER R = 0 SONRA GOTO adım 15   BAŞKA ŞUNA DEVAM EDİN 11. adım,

E3: [Değişim s ve r]: Öklid algoritmasının özü. Kalanı kullan r daha önce küçük olanı ölçmek için s; L, geçici bir konum olarak hizmet vermektedir.

11  L ← R12  R ← S13  S ← L14  [Ölçüm işlemini tekrarlayın]: GOTO 7

ÇIKTI:

15 [Bitti. S içerir en büyük ortak böleni ]: S YAZDIR

YAPILDI:

16 DUR, SON, DUR.

Öklid algoritması için zarif bir program

Öklid algoritmasının aşağıdaki versiyonu, "Inelegant" tarafından yapılması gereken on üçün yapılması için yalnızca altı temel talimat gerektirir; daha kötüsü, "Inelegant" daha fazlasını gerektirir türleri talimatlar.[netleştirmek ] "Zarif" in akış şeması bu makalenin başında bulunabilir. (Yapılandırılmamış) Temel dilde, adımlar numaralandırılır ve talimat İZİN VERMEK [] = [] ← ile sembolize edilen atama talimatıdır.

  5 REM Euclid'in en büyük ortak bölen algoritması  6 YAZDIR "0'dan büyük iki tam sayı yazın"  10 GİRİŞ Bir,B  20 EĞER B=0 SONRA GİT 80  30 EĞER Bir > B SONRA GİT 60  40 İZİN VERMEK B=B-Bir  50 GİT 20  60 İZİN VERMEK Bir=Bir-B  70 GİT 20  80 YAZDIR Bir  90 SON

"Zarif" nasıl çalışır?: Dış "Öklid döngüsü" yerine, "Zarif" iki "ortak döngü" arasında ileri geri hareket eder, A ← A - B'yi hesaplayan bir A> B döngüsü ve B ← B'yi hesaplayan bir B ≤ A döngüsü - A. Bu işe yarıyor, çünkü sonunda eksilen M, S çıkarımından küçük veya ona eşit olduğunda (Fark = Azalt - Çıktı), eksilen s (yeni ölçüm uzunluğu) ve alt uç, yeni r (ölçülecek uzunluk); başka bir deyişle, çıkarma "anlamı" tersine döner.

Aşağıdaki sürüm ile kullanılabilir C ailesinden programlama dilleri:

// En büyük ortak bölen için Öklid algoritmasıint Öklid Algoritması (int Bir, int B){     Bir=abs(Bir);     B=abs(B);     süre (B!=0){          Eğer (Bir>B) Bir=Bir-B;          Başka B=B-Bir;     }     dönüş Bir;}

Öklid algoritmalarını test etme

Bir algoritma, yazarının yapmasını istediği şeyi yapar mı? Birkaç test durumu genellikle temel işlevlere biraz güven verir. Ancak testler yeterli değil. Test senaryoları için tek kaynak[65] 3009 ve 884'ü kullanır. Knuth 40902, 24140'ı önerdi. Bir başka ilginç durum ise iki nispeten asal 14157 ve 5950 numaraları.

Ama "istisnai durumlar"[66] tanımlanmalı ve test edilmelidir. "Inelegant", R> S, S> R, R = S olduğunda düzgün performans gösterecek mi? Aynen "Zarif" için: B> A, A> B, A = B? (Hepsine evet). Bir sayı sıfır olduğunda, her iki sayı da sıfır olduğunda ne olur? ("Inelegant" her durumda sonsuza kadar hesaplar; "Zarif", A = 0 olduğunda sonsuza kadar hesaplar.) olumsuz numaralar girildi mi? Kesirli sayılar? Giriş numaraları, yani işlevin etki alanı algoritma / program tarafından hesaplanan, sıfır dahil olmak üzere yalnızca pozitif tam sayıları içermektir, ardından sıfırdaki hatalar, algoritmanın (ve programın örnekler bu bir kısmi işlev yerine toplam işlev. İstisnalardan kaynaklanan kayda değer bir başarısızlık, Ariane 5 Uçuş 501 roket hatası (4 Haziran 1996).

Matematiksel tümevarım kullanarak program doğruluğunun kanıtı: Knuth, matematiksel tümevarım Euclid'in algoritmasının "genişletilmiş" bir versiyonuna ve "herhangi bir algoritmanın geçerliliğini kanıtlamak için geçerli genel bir yöntem" önermektedir.[67] Tausworthe, bir programın karmaşıklığının bir ölçüsünün, doğruluk kanıtının uzunluğu olduğunu önermektedir.[68]

Öklid algoritmalarını ölçme ve iyileştirme

Zarafet (kompaktlık) iyiliğe (hız) karşı: Yalnızca altı temel talimatla, on üç talimatta "Inelegant" ile karşılaştırıldığında "Zarif" açık bir şekilde kazanır. Ancak, "Inelegant" Daha hızlı (HALT'a daha az adımda ulaşır). Algoritma analizi[69] durumun neden böyle olduğunu belirtir: "Zarif" iki her çıkarma döngüsünde koşullu testler, "Inelegant" ise yalnızca bir tane yapar. Algoritma (genellikle) birçok döngü gerektirdiğinden, ortalamada "B = 0" yapmak için ne kadar zaman harcanıyor? Kalan hesaplandıktan sonra gerekli olan test.

Algoritmalar geliştirilebilir mi?: Programcı, bir programı "uygun" ve "etkili" olarak değerlendirdiğinde - yani yazarının amaçladığı işlevi hesaplar - o zaman soru, geliştirilebilir mi?

"Inelegant" ın kompaktlığı beş adımın ortadan kaldırılmasıyla geliştirilebilir. Ancak Chaitin, bir algoritmanın sıkıştırılmasının genelleştirilmiş bir algoritma ile otomatikleştirilemeyeceğini kanıtladı;[70] daha ziyade sadece yapılabilir sezgisel olarak; ör. kapsamlı aramayla (örnekler şurada bulunabilir: Meşgul kunduz ), deneme yanılma, zeka, içgörü, uygulama tümevarımlı akıl yürütme, vb. Adım 4, 5 ve 6'nın adım 11, 12 ve 13'te tekrarlandığını gözlemleyin. "Elegant" ile karşılaştırma, adım 2 ve 3 ile birlikte bu adımların ortadan kaldırılabileceğine dair bir ipucu sağlar. Bu, temel talimatların sayısını on üçten sekize indirir, bu da onu dokuz adımda "Zarif" ten "daha zarif" yapar.

"Zarif" in hızı, "B = 0?" iki çıkarma döngüsünün dışında test edin. Bu değişiklik, üç talimatın eklenmesini gerektirir (B = 0 ?, A = 0 ?, GOTO). Artık "Zarif", örnek sayıları daha hızlı hesaplıyor; Herhangi bir A, B ve R için durumun her zaman böyle olup olmadığı, S ayrıntılı bir analiz gerektirir.

Algoritmik analiz

Belirli bir algoritma için teorik olarak belirli bir kaynağın (zaman veya depolama gibi) ne kadarının gerekli olduğunu bilmek sıklıkla önemlidir. İçin yöntemler geliştirilmiştir. algoritmaların analizi bu tür nicel cevapları (tahminler) elde etmek; örneğin, yukarıdaki sıralama algoritmasının zaman gereksinimi O (n), kullanmak büyük O notasyonu ile n listenin uzunluğu olarak. Her zaman algoritmanın sadece iki değeri hatırlaması gerekir: şimdiye kadar bulunan en büyük sayı ve giriş listesindeki mevcut konumu. Bu nedenle, bir alan gereksinimine sahip olduğu söyleniyor. O (1), giriş numaralarını saklamak için gereken alan sayılmazsa veya O (n) sayılırsa.

Farklı algoritmalar, aynı görevi farklı bir talimat dizisiyle daha az veya daha fazla zamanda, alanda veya 'çaba 'diğerlerinden daha. Örneğin, bir Ikili arama algoritması (maliyet O (log n) ile), sıralı aramadan (maliyet O (n)) daha iyi performans gösterir tablo aramaları sıralı listelerde veya dizilerde.

Biçimsel ve deneysel

analiz ve algoritmaların incelenmesi bir disiplin bilgisayar Bilimi ve genellikle belirli bir Programlama dili veya uygulama. Bu anlamda, algoritma analizi, herhangi bir özel uygulamanın özelliklerine değil, algoritmanın temel özelliklerine odaklanması açısından diğer matematiksel disiplinlere benzer. Genelde sözde kod en basit ve en genel gösterim olduğu için analiz için kullanılır. Bununla birlikte, sonuçta çoğu algoritma genellikle belirli donanım / yazılım platformlarında ve bunların algoritmik verimlilik sonunda gerçek kod kullanılarak teste tabi tutulur. For the solution of a "one off" problem, the efficiency of a particular algorithm may not have significant consequences (unless n is extremely large) but for algorithms designed for fast interactive, commercial or long life scientific usage it may be critical. Scaling from small n to large n frequently exposes inefficient algorithms that are otherwise benign.

Empirical testing is useful because it may uncover unexpected interactions that affect performance. Kıyaslamalar may be used to compare before/after potential improvements to an algorithm after program optimization.Empirical tests cannot replace formal analysis, though, and are not trivial to perform in a fair manner.[71]

Execution efficiency

To illustrate the potential improvements possible even in well-established algorithms, a recent significant innovation, relating to FFT algorithms (used heavily in the field of image processing), can decrease processing time up to 1,000 times for applications like medical imaging.[72] In general, speed improvements depend on special properties of the problem, which are very common in practical applications.[73] Speedups of this magnitude enable computing devices that make extensive use of image processing (like digital cameras and medical equipment) to consume less power.

Sınıflandırma

There are various ways to classify algorithms, each with its own merits.

Uygulamaya göre

One way to classify algorithms is by implementation means.

int gcd(int Bir, int B) {    Eğer (B == 0)        dönüş Bir;    Başka Eğer (Bir > B)        dönüş gcd(Bir-B,B);    Başka        dönüş gcd(Bir,B-Bir);}
Özyinelemeli C implementation of Euclid's algorithm from the yukarıda flowchart
Özyineleme
Bir özyinelemeli algoritma is one that invokes (makes reference to) itself repeatedly until a certain condition (also known as termination condition) matches, which is a method common to fonksiyonel programlama. Yinelemeli algorithms use repetitive constructs like döngüler and sometimes additional data structures like yığınlar to solve the given problems. Some problems are naturally suited for one implementation or the other. Örneğin, towers of Hanoi is well understood using recursive implementation. Every recursive version has an equivalent (but possibly more or less complex) iterative version, and vice versa.
Mantıklı
An algorithm may be viewed as controlled mantıksal çıkarım. This notion may be expressed as: Algorithm = logic + control.[74] The logic component expresses the axioms that may be used in the computation and the control component determines the way in which deduction is applied to the axioms. Bu temeldir mantık programlama paradigma. In pure logic programming languages, the control component is fixed and algorithms are specified by supplying only the logic component. The appeal of this approach is the elegant anlambilim: a change in the axioms produces a well-defined change in the algorithm.
Serial, parallel or distributed
Algorithms are usually discussed with the assumption that computers execute one instruction of an algorithm at a time. Those computers are sometimes called serial computers. Bir algorithm designed for such an environment is called a serial algorithm, as opposed to paralel algoritmalar veya dağıtılmış algoritmalar. Parallel algorithms take advantage of computer architectures where several processors can work on a problem at the same time, whereas distributed algorithms utilize multiple machines connected with a bilgisayar ağı. Parallel or distributed algorithms divide the problem into more symmetrical or asymmetrical subproblems and collect the results back together. The resource consumption in such algorithms is not only processor cycles on each processor but also the communication overhead between the processors. Some sorting algorithms can be parallelized efficiently, but their communication overhead is expensive. Iterative algorithms are generally parallelizable. Some problems have no parallel algorithms and are called inherently serial problems.
Deterministic or non-deterministic
Deterministic algorithms solve the problem with exact decision at every step of the algorithm whereas non-deterministic algorithms solve problems via guessing although typical guesses are made more accurate through the use of Sezgisel.
Exact or approximate
While many algorithms reach an exact solution, yaklaşım algoritmaları seek an approximation that is closer to the true solution. The approximation can be reached by either using a deterministic or a random strategy. Such algorithms have practical value for many hard problems. One of the examples of an approximate algorithm is the Sırt çantası sorunu, where there is a set of given items. Its goal is to pack the knapsack to get the maximum total value. Each item has some weight and some value. Total weight that can be carried is no more than some fixed number X. So, the solution must consider weights of items as well as their value.[75]
Kuantum algoritması
They run on a realistic model of kuantum hesaplama. The term is usually used for those algorithms which seem inherently quantum, or use some essential feature of Kuantum hesaplama gibi kuantum süperpozisyonu veya kuantum dolaşıklığı.

By design paradigm

Another way of classifying algorithms is by their design methodology or paradigma. There is a certain number of paradigms, each different from the other. Furthermore, each of these categories includes many different types of algorithms. Some common paradigms are:

Kaba kuvvet or exhaustive search
Bu naive method of trying every possible solution to see which is best.[76]
Böl ve fethet
Bir böl ve ele geçir algoritması repeatedly reduces an instance of a problem to one or more smaller instances of the same problem (usually tekrarlı ) until the instances are small enough to solve easily. One such example of divide and conquer is merge sorting. Sorting can be done on each segment of data after dividing data into segments and sorting of entire data can be obtained in the conquer phase by merging the segments. A simpler variant of divide and conquer is called a decrease and conquer algorithm, that solves an identical subproblem and uses the solution of this subproblem to solve the bigger problem. Divide and conquer divides the problem into multiple subproblems and so the conquer stage is more complex than decrease and conquer algorithms. An example of a decrease and conquer algorithm is the binary search algorithm.
Search and enumeration
Many problems (such as playing satranç ) can be modeled as problems on grafikler. Bir graph exploration algorithm specifies rules for moving around a graph and is useful for such problems. This category also includes arama algoritmaları, branch and bound enumeration and backtracking.
Rastgele algoritma
Such algorithms make some choices randomly (or pseudo-randomly). They can be very useful in finding approximate solutions for problems where finding exact solutions can be impractical (see heuristic method below). For some of these problems, it is known that the fastest approximations must involve some rastgelelik.[77] Whether randomized algorithms with polynomial time complexity can be the fastest algorithms for some problems is an open question known as the P'ye karşı NP sorunu. There are two large classes of such algorithms:
  1. Monte Carlo algorithms return a correct answer with high-probability. Örneğin. RP is the subclass of these that run in polinom zamanı.
  2. Las Vegas algoritmaları always return the correct answer, but their running time is only probabilistically bound, e.g. ZPP.
Karmaşıklığın azaltılması
This technique involves solving a difficult problem by transforming it into a better-known problem for which we have (hopefully) asimptotik olarak optimal algoritmalar. The goal is to find a reducing algorithm whose karmaşıklık is not dominated by the resulting reduced algorithm's. Örneğin, biri selection algorithm for finding the median in an unsorted list involves first sorting the list (the expensive portion) and then pulling out the middle element in the sorted list (the cheap portion). This technique is also known as transform and conquer.
Back tracking
In this approach, multiple solutions are built incrementally and abandoned when it is determined that they cannot lead to a valid full solution.

Optimization problems

İçin optimizasyon sorunları there is a more specific classification of algorithms; an algorithm for such problems may fall into one or more of the general categories described above as well as into one of the following:

Doğrusal programlama
When searching for optimal solutions to a linear function bound to linear equality and inequality constraints, the constraints of the problem can be used directly in producing the optimal solutions. There are algorithms that can solve any problem in this category, such as the popular simpleks algoritması.[78] Problems that can be solved with linear programming include the maksimum akış sorunu for directed graphs. If a problem additionally requires that one or more of the unknowns must be an tamsayı then it is classified in Tamsayılı programlama. A linear programming algorithm can solve such a problem if it can be proved that all restrictions for integer values are superficial, i.e., the solutions satisfy these restrictions anyway. In the general case, a specialized algorithm or an algorithm that finds approximate solutions is used, depending on the difficulty of the problem.
Dinamik program
When a problem shows optimal substructures —meaning the optimal solution to a problem can be constructed from optimal solutions to subproblems—and örtüşen alt problemler, meaning the same subproblems are used to solve many different problem instances, a quicker approach called dinamik program avoids recomputing solutions that have already been computed. Örneğin, Floyd – Warshall algoritması, the shortest path to a goal from a vertex in a weighted grafik can be found by using the shortest path to the goal from all adjacent vertices. Dynamic programming and hafızaya alma go together. The main difference between dynamic programming and divide and conquer is that subproblems are more or less independent in divide and conquer, whereas subproblems overlap in dynamic programming. The difference between dynamic programming and straightforward recursion is in caching or memoization of recursive calls. When subproblems are independent and there is no repetition, memoization does not help; hence dynamic programming is not a solution for all complex problems. By using memoization or maintaining a masa of subproblems already solved, dynamic programming reduces the exponential nature of many problems to polynomial complexity.
The greedy method
Bir Açgözlü algoritma is similar to a dynamic programming algorithm in that it works by examining substructures, in this case not of the problem but of a given solution. Such algorithms start with some solution, which may be given or have been constructed in some way, and improve it by making small modifications. For some problems they can find the optimal solution while for others they stop at local optima, that is, at solutions that cannot be improved by the algorithm but are not optimum. The most popular use of greedy algorithms is for finding the minimal spanning tree where finding the optimal solution is possible with this method. Huffman Tree, Kruskal, Prim, Sollin are greedy algorithms that can solve this optimization problem.
The heuristic method
İçinde optimizasyon sorunları, heuristic algorithms can be used to find a solution close to the optimal solution in cases where finding the optimal solution is impractical. These algorithms work by getting closer and closer to the optimal solution as they progress. In principle, if run for an infinite amount of time, they will find the optimal solution. Their merit is that they can find a solution very close to the optimal solution in a relatively short time. Such algorithms include local search, tabu araması, simulated annealing, ve genetik algoritmalar. Some of them, like simulated annealing, are non-deterministic algorithms while others, like tabu search, are deterministic. When a bound on the error of the non-optimal solution is known, the algorithm is further categorized as an yaklaşım algoritması.

By field of study

Every field of science has its own problems and needs efficient algorithms. Related problems in one field are often studied together. Some example classes are arama algoritmaları, sorting algorithms, merge algorithms, sayısal algoritmalar, grafik algoritmaları, dize algoritmaları, computational geometric algorithms, combinatorial algorithms, medical algorithms, makine öğrenme, kriptografi, Veri sıkıştırma algoritmalar ve parsing techniques.

Fields tend to overlap with each other, and algorithm advances in one field may improve those of other, sometimes completely unrelated, fields. For example, dynamic programming was invented for optimization of resource consumption in industry but is now used in solving a broad range of problems in many fields.

By complexity

Algorithms can be classified by the amount of time they need to complete compared to their input size:

  • Constant time: if the time needed by the algorithm is the same, regardless of the input size. Örneğin. an access to an dizi öğesi.
  • Logarithmic time: if the time is a logarithmic function of the input size. Örneğin. binary search algorithm.
  • Linear time: if the time is proportional to the input size. Örneğin. the traverse of a list.
  • Polynomial time: if the time is a power of the input size. Örneğin. kabarcık sıralama algorithm has quadratic time complexity.
  • Exponential time: if the time is an exponential function of the input size. Örneğin. Kaba kuvvet arama.

Some problems may have multiple algorithms of differing complexity, while other problems might have no algorithms or no known efficient algorithms. There are also mappings from some problems to other problems. Owing to this, it was found to be more suitable to classify the problems themselves instead of the algorithms into equivalence classes based on the complexity of the best possible algorithms for them.

Continuous algorithms

The adjective "continuous" when applied to the word "algorithm" can mean:

  • An algorithm operating on data that represents continuous quantities, even though this data is represented by discrete approximations—such algorithms are studied in Sayısal analiz; veya
  • An algorithm in the form of a diferansiyel denklem that operates continuously on the data, running on an analog bilgisayar.[79]

Yasal sorunlar

Algorithms, by themselves, are not usually patentable. In the United States, a claim consisting solely of simple manipulations of abstract concepts, numbers, or signals does not constitute "processes" (USPTO 2006), and hence algorithms are not patentable (as in Gottschalk / Benson ). However practical applications of algorithms are sometimes patentable. Örneğin, Diamond / Diehr, the application of a simple geri bildirim algorithm to aid in the curing of sentetik kauçuk was deemed patentable. patenting of software is highly controversial, and there are highly criticized patents involving algorithms, especially Veri sıkıştırma algorithms, such as Unisys ' LZW patent.

Additionally, some cryptographic algorithms have export restrictions (see kriptografi ihracatı ).

History: Development of the notion of "algorithm"

Antik Yakın Doğu

The earliest evidence of algorithms is found in the Babil matematiği antik Mezopotamya (modern Iraq). Bir Sümer clay tablet found in Shuruppak yakın Bağdat and dated to circa 2500 BC described the earliest bölme algoritması.[10] Esnasında Hammurabi dynasty circa 1800-1600 BC, Babil clay tablets described algorithms for computing formüller.[80] Algorithms were also used in Babil astronomisi. Babylonian clay tablets describe and employ algorithmic procedures to compute the time and place of significant astronomical events.[81]

Algorithms for arithmetic are also found in ancient Mısır matematiği, geriye uzanan Rhind Matematik Papirüsü circa 1550 BC.[10] Algorithms were later used in ancient Helenistik matematik. Two examples are the Eratosthenes Elek, which was described in the Aritmetiğe Giriş tarafından Nicomachus,[82][12]:Ch 9.2 ve Öklid algoritması, which was first described in Öklid Elemanları (yaklaşık MÖ 300).[12]:Ch 9.1

Discrete and distinguishable symbols

Tally-marks: To keep track of their flocks, their sacks of grain and their money the ancients used tallying: accumulating stones or marks scratched on sticks or making discrete symbols in clay. Through the Babylonian and Egyptian use of marks and symbols, eventually Roma rakamları ve abaküs evolved (Dilson, p. 16–41). Tally marks appear prominently in tekli sayı sistemi arithmetic used in Turing makinesi ve Post – Turing makinesi hesaplamalar.

Manipulation of symbols as "place holders" for numbers: algebra

Muhammad ibn Mūsā al-Khwārizmī, bir Farsça matematikçi, yazdı Al-jabr 9. yüzyılda. Şartlar "algorizm " and "algorithm" are derived from the name al-Khwārizmī, while the term "cebir " is derived from the book Al-jabr. In Europe, the word "algorithm" was originally used to refer to the sets of rules and techniques used by Al-Khwarizmi to solve algebraic equations, before later being generalized to refer to any set of rules or techniques.[83] This eventually culminated in Leibniz 's notion of the calculus ratiocinator (ca 1680):

A good century and a half ahead of his time, Leibniz proposed an algebra of logic, an algebra that would specify the rules for manipulating logical concepts in the manner that ordinary algebra specifies the rules for manipulating numbers.[84]

Cryptographic algorithms

İlk kriptografik algorithm for deciphering encrypted code was developed by Al-Kindi, 9. yüzyıl Arap matematikçi, içinde A Manuscript On Deciphering Cryptographic Messages. İlk tanımını verdi kriptanaliz tarafından frekans analizi, en erken kod kırma algoritması.[13]

Mechanical contrivances with discrete states

Saat: Bolter credits the invention of the weight-driven saat as "The key invention [of Europe in the Middle Ages]", in particular, the verge escapement[85] that provides us with the tick and tock of a mechanical clock. "The accurate automatic machine"[86] led immediately to "mechanical Otomata " beginning in the 13th century and finally to "computational machines"—the fark motoru ve analytical engines nın-nin Charles Babbage ve Kontes Ada Lovelace, 19. yüzyılın ortaları.[87] Lovelace is credited with the first creation of an algorithm intended for processing on a computer—Babbage's analytical engine, the first device considered a real Turing tamamlandı computer instead of just a hesap makinesi —and is sometimes called "history's first programmer" as a result, though a full implementation of Babbage's second device would not be realized until decades after her lifetime.

Logical machines 1870 – Stanley Jevons ' "logical abacus" and "logical machine": The technical problem was to reduce Boolean equations when presented in a form similar to what is now known as Karnaugh maps. Jevons (1880) describes first a simple "abacus" of "slips of wood furnished with pins, contrived so that any part or class of the [logical] combinations can be picked out mechanically ... More recently, however, I have reduced the system to a completely mechanical form, and have thus embodied the whole of the indirect process of inference in what may be called a Logical Machine" His machine came equipped with "certain moveable wooden rods" and "at the foot are 21 keys like those of a piano [etc] ...". With this machine he could analyze a "kıyas or any other simple logical argument".[88]

This machine he displayed in 1870 before the Fellows of the Royal Society.[89] Another logician John Venn, however, in his 1881 Sembolik Mantık, turned a jaundiced eye to this effort: "I have no high estimate myself of the interest or importance of what are sometimes called logical machines ... it does not seem to me that any contrivances at present known or likely to be discovered really deserve the name of logical machines"; see more at Algoritma karakterizasyonu. But not to be outdone he too presented "a plan somewhat analogous, I apprehend, to Prof. Jevon's abaküs ... [And] [a]gain, corresponding to Prof. Jevons's logical machine, the following contrivance may be described. I prefer to call it merely a logical-diagram machine ... but I suppose that it could do very completely all that can be rationally expected of any logical machine".[90]

Jacquard loom, Hollerith punch cards, telegraphy and telephony – the electromechanical relay: Bell and Newell (1971) indicate that the Jakarlı dokuma tezgahı (1801), precursor to Hollerith cards (punch cards, 1887), and "telephone switching technologies" were the roots of a tree leading to the development of the first computers.[91] By the mid-19th century the telgraf, the precursor of the telephone, was in use throughout the world, its discrete and distinguishable encoding of letters as "dots and dashes" a common sound. 19. yüzyılın sonlarında şerit şeridi (ca 1870s) was in use, as was the use of Hollerith cards in the 1890 U.S. census. Sonra geldi teleprinter (ca. 1910) with its punched-paper use of Baudot kodu on tape.

Telephone-switching networks of electromechanical röleler (invented 1835) was behind the work of George Stibitz (1937), the inventor of the digital adding device. As he worked in Bell Laboratories, he observed the "burdensome' use of mechanical calculators with gears. "He went home one evening in 1937 intending to test his idea... When the tinkering was over, Stibitz had constructed a binary adding device".[92]

Davis (2000) observes the particular importance of the electromechanical relay (with its two "binary states" açık ve kapalı):

It was only with the development, beginning in the 1930s, of electromechanical calculators using electrical relays, that machines were built having the scope Babbage had envisioned."[93]

Mathematics during the 19th century up to the mid-20th century

Symbols and rules: In rapid succession, the mathematics of George Boole (1847, 1854), Gottlob Frege (1879), and Giuseppe Peano (1888–1889) reduced arithmetic to a sequence of symbols manipulated by rules. Peano's The principles of arithmetic, presented by a new method (1888) was "the first attempt at an axiomatization of mathematics in a sembolik dil ".[94]

But Heijenoort gives Frege (1879) this kudos: Frege's is "perhaps the most important single work ever written in logic. ... in which we see a " 'formula language', that is a lingua characterica, a language written with special symbols, "for pure thought", that is, free from rhetorical embellishments ... constructed from specific symbols that are manipulated according to definite rules".[95] The work of Frege was further simplified and amplified by Alfred North Whitehead ve Bertrand Russell onların içinde Principia Mathematica (1910–1913).

The paradoxes: At the same time a number of disturbing paradoxes appeared in the literature, in particular, the Burali-Forti paradoksu (1897), Russell paradox (1902–03), and the Richard Paradox.[96] The resultant considerations led to Kurt Gödel 's paper (1931)—he specifically cites the paradox of the liar—that completely reduces rules of özyineleme to numbers.

Effective calculability: In an effort to solve the Entscheidungsproblem defined precisely by Hilbert in 1928, mathematicians first set about to define what was meant by an "effective method" or "effective calculation" or "effective calculability" (i.e., a calculation that would succeed). In rapid succession the following appeared: Alonzo Kilisesi, Stephen Kleene ve J.B. Rosser 's λ-hesap[97] a finely honed definition of "general recursion" from the work of Gödel acting on suggestions of Jacques Herbrand (cf. Gödel's Princeton lectures of 1934) and subsequent simplifications by Kleene.[98] Church's proof[99] that the Entscheidungsproblem was unsolvable, Emil Post 's definition of effective calculability as a worker mindlessly following a list of instructions to move left or right through a sequence of rooms and while there either mark or erase a paper or observe the paper and make a yes-no decision about the next instruction.[100] Alan Turing's proof of that the Entscheidungsproblem was unsolvable by use of his "a- [automatic-] machine"[101]—in effect almost identical to Post's "formulation", J. Barkley Rosser 's definition of "effective method" in terms of "a machine".[102] S.C. Kleene 's proposal of a precursor to "Kilise tezi " that he called "Thesis I",[103] and a few years later Kleene's renaming his Thesis "Church's Thesis"[104] and proposing "Turing's Thesis".[105]

Emil Post (1936) and Alan Turing (1936–37, 1939)

Emil Post (1936) described the actions of a "computer" (human being) as follows:

"...two concepts are involved: that of a symbol space in which the work leading from problem to answer is to be carried out, and a fixed unalterable set of directions.

His symbol space would be

"a two-way infinite sequence of spaces or boxes... The problem solver or worker is to move and work in this symbol space, being capable of being in, and operating in but one box at a time.... a box is to admit of but two possible conditions, i.e., being empty or unmarked, and having a single mark in it, say a vertical stroke.
"One box is to be singled out and called the starting point. ...a specific problem is to be given in symbolic form by a finite number of boxes [i.e., INPUT] being marked with a stroke. Likewise, the answer [i.e., OUTPUT] is to be given in symbolic form by such a configuration of marked boxes...
"A set of directions applicable to a general problem sets up a deterministic process when applied to each specific problem. This process terminates only when it comes to the direction of type (C ) [i.e., STOP]".[106] Daha fazlasını görün Post – Turing makinesi
Alan Turing's statue at Bletchley Parkı

Alan Turing[107] preceded that of Stibitz (1937); it is unknown whether Stibitz knew of the work of Turing. Turing's biographer believed that Turing's use of a typewriter-like model derived from a youthful interest: "Alan had dreamt of inventing typewriters as a boy; Mrs. Turing had a typewriter, and he could well have begun by asking himself what was meant by calling a typewriter 'mechanical'".[108] Given the prevalence of Morse code and telegraphy, ticker tape machines, and teletypewriters we[DSÖ? ] might conjecture that all were influences.

Turing—his model of computation is now called a Turing makinesi —begins, as did Post, with an analysis of a human computer that he whittles down to a simple set of basic motions and "states of mind". But he continues a step further and creates a machine as a model of computation of numbers.[109]

"Computing is normally done by writing certain symbols on paper. We may suppose this paper is divided into squares like a child's arithmetic book...I assume then that the computation is carried out on one-dimensional paper, i.e., on a tape divided into squares. I shall also suppose that the number of symbols which may be printed is finite...
"The behavior of the computer at any moment is determined by the symbols which he is observing, and his "state of mind" at that moment. We may suppose that there is a bound B to the number of symbols or squares which the computer can observe at one moment. If he wishes to observe more, he must use successive observations. We will also suppose that the number of states of mind which need be taken into account is finite...
"Let us imagine that the operations performed by the computer to be split up into 'simple operations' which are so elementary that it is not easy to imagine them further divided."[110]

Turing's reduction yields the following:

"The simple operations must therefore include:
"(a) Changes of the symbol on one of the observed squares
"(b) Changes of one of the squares observed to another square within L squares of one of the previously observed squares.

"It may be that some of these change necessarily invoke a change of state of mind. The most general single operation must, therefore, be taken to be one of the following:

"(A) A possible change (a) of symbol together with a possible change of state of mind.
"(B) A possible change (b) of observed squares, together with a possible change of state of mind"
"We may now construct a machine to do the work of this computer."[110]

A few years later, Turing expanded his analysis (thesis, definition) with this forceful expression of it:

"A function is said to be "effectively calculable" if its values can be found by some purely mechanical process. Though it is fairly easy to get an intuitive grasp of this idea, it is nevertheless desirable to have some more definite, mathematical expressible definition ... [he discusses the history of the definition pretty much as presented above with respect to Gödel, Herbrand, Kleene, Church, Turing, and Post] ... We may take this statement literally, understanding by a purely mechanical process one which could be carried out by a machine. It is possible to give a mathematical description, in a certain normal form, of the structures of these machines. The development of these ideas leads to the author's definition of a computable function, and to an identification of computability † with effective calculability ... .
"† We shall use the expression "computable function" to mean a function calculable by a machine, and we let "effectively calculable" refer to the intuitive idea without particular identification with any one of these definitions".[111]

J.B. Rosser (1939) and S.C. Kleene (1943)

J. Barkley Rosser defined an 'effective [mathematical] method' in the following manner (italicization added):

"'Effective method' is used here in the rather special sense of a method each step of which is precisely determined and which is certain to produce the answer in a finite number of steps. With this special meaning, three different precise definitions have been given to date. [his footnote #5; see discussion immediately below]. The simplest of these to state (due to Post and Turing) says essentially that an effective method of solving certain sets of problems exists if one can build a machine which will then solve any problem of the set with no human intervention beyond inserting the question and (later) reading the answer. All three definitions are equivalent, so it doesn't matter which one is used. Moreover, the fact that all three are equivalent is a very strong argument for the correctness of any one." (Rosser 1939:225–226)

Rosser's footnote No. 5 references the work of (1) Church and Kleene and their definition of λ-definability, in particular Church's use of it in his Temel Sayı Teorisinin Çözülemeyen Problemi (1936); (2) Herbrand and Gödel and their use of recursion in particular Gödel's use in his famous paper Principia Mathematica ve İlgili Sistemlerin Resmi Olarak Karar Verilemeyen Önerileri Üzerine I (1931); ve (3) Post (1936) ve Turing (1936–37) hesaplama mekanizma modellerinde.

Stephen C. Kleene şu anda meşhur olan "Tez I" olarak tanımlanır. Kilise-Turing tezi. Ancak bunu şu bağlamda yaptı (orijinalde kalın harflerle):

"12. Algoritmik teoriler... Tam bir algoritmik teori oluştururken yaptığımız şey, bağımsız değişkenlerin her bir değer kümesi için gerçekleştirilebilen, prosedür zorunlu olarak sonlandıran ve sonuçtan kesin bir cevabı okuyabileceğimiz bir şekilde bir prosedürü tanımlamaktır. "evet" veya "hayır" sorusuna, "yüklem değeri doğru mu?" "(Kleene 1943: 273)

1950 sonrası tarih

"Algoritma" tanımının daha da iyileştirilmesi için bir dizi çaba gösterildi ve özellikle çevreleyen sorunlar nedeniyle faaliyet devam ediyor. matematiğin temelleri (özellikle de Kilise-Turing tezi ) ve akıl felsefesi (özellikle hakkındaki tartışmalar yapay zeka ). Daha fazlası için bkz. Algoritma karakterizasyonu.

Ayrıca bakınız

Notlar

  1. ^ "Yüksek Matematik Jargonunun Kesin Sözlüğü - Algoritma". Matematik Kasası. 1 Ağustos 2019. Arşivlendi 28 Şubat 2020'deki orjinalinden. Alındı 14 Kasım 2019.
  2. ^ "ALGORİTMA Tanımı". Merriam-Webster Çevrimiçi Sözlüğü. Arşivlendi 14 Şubat 2020'deki orjinalinden. Alındı 14 Kasım 2019.
  3. ^ "Herhangi bir klasik matematiksel algoritma, örneğin, sınırlı sayıda İngilizce kelimeyle tanımlanabilir" (Rogers 1987: 2).
  4. ^ Algoritmayı yürüten aracıya göre iyi tanımlanmıştır: "Talimatlara tepki verebilen ve hesaplamaları gerçekleştirebilen, genellikle insan olan bir hesaplama aracı vardır" (Rogers 1987: 2).
  5. ^ "bir algoritma bir hesaplama prosedürüdür işlevi (tamsayılar için seçilen bazı gösterimlere göre) ... bu sınırlama (sayısal fonksiyonlara) genellik kaybına neden olmaz ", (Rogers 1987: 1).
  6. ^ "Bir algoritmanın sıfır veya daha fazla girdi, yani, miktarları algoritma başlamadan önce ona verilir "(Knuth 1973: 5).
  7. ^ "Muhtemelen sonluluktan yoksun olması dışında bir algoritmanın tüm özelliklerine sahip bir prosedür, 'hesaplama yöntemi' olarak adlandırılabilir.'"(Knuth 1973: 5).
  8. ^ "Bir algoritmanın bir veya daha fazla çıkışı vardır, yani girdilerle belirli bir ilişkisi olan miktarlar" (Knuth 1973: 5).
  9. ^ Rastgele iç süreçlere sahip bir sürecin (girdi dahil değil) bir algoritma olup olmadığı tartışmalıdır. Rogers, "bir hesaplama, sürekli yöntemler veya analog cihazlar kullanılmadan ayrı bir aşamalı tarzda gerçekleştirilir ... rasgele yöntemlere veya cihazlara, örneğin zarlara başvurmadan belirleyici olarak ileri taşınır" (Rogers 1987: 2) .
  10. ^ a b c Chabert, Jean-Luc (2012). Algoritmaların Tarihçesi: Çakıldan Mikroçipe. Springer Science & Business Media. s. 7–8. ISBN  9783642181924.
  11. ^ a b "Helenistik Matematik". Matematiğin Hikayesi. Arşivlendi orjinalinden 11 Eylül 2019. Alındı 14 Kasım 2019.
  12. ^ a b c Cooke Roger L. (2005). Matematik Tarihi: Kısa Bir Ders. John Wiley & Sons. ISBN  978-1-118-46029-0.
  13. ^ a b Dooley, John F. (2013). Kriptoloji ve Kriptografik Algoritmaların Kısa Tarihi. Springer Science & Business Media. s. 12–3. ISBN  9783319016283.
  14. ^ "Harizmi - İslami Matematik". Matematiğin Hikayesi. Arşivlendi 25 Temmuz 2019 tarihli orjinalinden. Alındı 14 Kasım 2019.
  15. ^ Kleene 1943, Davis 1965: 274
  16. ^ Rosser 1939, Davis 1965: 225
  17. ^ "Harizmi biyografisi". www-history.mcs.st-andrews.ac.uk. Arşivlendi 2 Ağustos 2019 tarihli orjinalinden. Alındı 3 Mayıs, 2017.
  18. ^ "Algoritmanın etimolojisi". Chambers Sözlüğü. Arşivlendi 31 Mart 2019 tarihli orjinalinden. Alındı 13 Aralık, 2016.
  19. ^ Hogendijk, Jan P. (1998). "el-Harzimi". Pisagor. 38 (2): 4–5. Arşivlenen orijinal 12 Nisan 2009.CS1 bakimi: ref = harv (bağlantı)
  20. ^ Oaks, Jeffrey A. "Harizmi uygulamalı bir cebirci miydi?". Indianapolis Üniversitesi. Arşivlenen orijinal 18 Temmuz 2011. Alındı 30 Mayıs 2008.
  21. ^ Brezina, Corona (2006). El-Harizmi: Cebirin Mucidi. Rosen Yayıncılık Grubu. ISBN  978-1-4042-0513-0.
  22. ^ Tarihteki en önemli matematiksel metinler Arşivlendi 9 Haziran 2011, Wayback Makinesi, göre Carl B. Boyer.
  23. ^ "algorismik", Ücretsiz Sözlük, arşivlendi orijinalinden 21 Aralık 2019, alındı 14 Kasım 2019
  24. ^ Oxford ingilizce sözlük, Üçüncü Baskı, 2012 s.v.
  25. ^ Mehri, Bahman (2017). "Harizmi'den Algoritmaya". Bilişim Olimpiyatları. 11 (2): 71–74. doi:10.15388 / ioi.2017.special.11.
  26. ^ "Ebu Cafer Muhammed ibn Musa el-Harizmi". members.peak.org. Arşivlendi 21 Ağustos 2019 tarihli orjinalinden. Alındı 14 Kasım 2019.
  27. ^ Taş 1973: 4
  28. ^ Simanowski, Roberto (2018). Ölüm Algoritması ve Diğer Dijital İkilemler. Zamansız Meditasyonlar. 14. Chase, Jefferson tarafından çevrildi. Cambridge, Massachusetts: MIT Press. s. 147. ISBN  9780262536370. Arşivlendi orjinalinden 22 Aralık 2019. Alındı 27 Mayıs 2019. [...] merkezi bürokrasinin bir sonraki soyutlama düzeyi: küresel olarak işleyen algoritmalar.
  29. ^ Dietrich, Eric (1999). "Algoritma". Wilson, Robert Andrew'da; Keil, Frank C. (editörler). Bilişsel Bilimler MIT Ansiklopedisi. MIT Cognet kitaplığı. Cambridge, Massachusetts: MIT Press (2001'de yayınlandı). s. 11. ISBN  9780262731447. Alındı 22 Temmuz, 2020. Algoritma, bir şeyi yapmak için bir reçete, yöntem veya tekniktir.
  30. ^ Stone basitçe "sınırlı sayıda adımda sona ermesi gerektiğini" gerektirir (Stone 1973: 7-8).
  31. ^ Boolos ve Jeffrey 1974, 1999: 19
  32. ^ cf Taş 1972: 5
  33. ^ Knuth 1973: 7 şöyle diyor: "Pratikte yalnızca algoritmalar istemiyoruz, iyi algoritmalar ... bir iyilik kriteri, algoritmayı gerçekleştirmek için geçen sürenin uzunluğudur ... diğer kriterler algoritmanın bilgisayarlara uyarlanabilirliği, basitliği ve zarafeti vb. "
  34. ^ cf Taş 1973: 6
  35. ^ Stone 1973: 7-8, "... bir robotun [yani bilgisayarın] talimata tam olarak nasıl uyacağını belirlemek için izleyebileceği bir prosedür" olması gerektiğini belirtir. Stone, bu tanıma sürecin sonluluğunu ve kesinliği (talimatlarda belirsizlik içermeyen) ekler.
  36. ^ Knuth, loc. cit
  37. ^ Minsky 1967, s. 105
  38. ^ Gurevich 2000: 1, 3
  39. ^ Sipser 2006: 157
  40. ^ Goodrich, Michael T.; Tamassia, Roberto (2002), Algoritma Tasarımı: Temeller, Analizler ve İnternet Örnekleri, John Wiley & Sons, Inc., ISBN  978-0-471-38365-9, arşivlendi 28 Nisan 2015 tarihli orjinalinden, alındı 14 Haziran, 2018
  41. ^ Knuth 1973: 7
  42. ^ Chaitin 2005: 32
  43. ^ Rogers 1987: 1–2
  44. ^ Seig 2002: 390, "İnsan ve Makine Tarafından Hesaplamalar: Kavramsal Analiz" adlı makalesinde bu ayrımı Robin Gandy'ye verir, bkz. Wilfred Seig, vd., 2002 Matematiğin temelleri üzerine düşünceler: Solomon Feferman onuruna Denemeler, Sembolik Mantık Derneği, A.K. Peters Ltd, Natick, MA.
  45. ^ cf Gandy 1980: 126, Robin Gandy Kilise'nin Mekanizmalar için Tezi ve İlkeleri 123–148. sayfalarda görünüyor J. Barwise et al. 1980 Kleene Sempozyumu, Kuzey Hollanda Yayıncılık Şirketi.
  46. ^ Bir "robot": "Bilgisayar, bir dizi talimat olarak tanımlanabilecek herhangi bir görevi yerine getiren bir robottur." cf Stone 1972: 3
  47. ^ Lambek'in "abaküsü", "sınırsız sayıda sayaç (çakıl taşı, boncuk, vb.) İle birlikte sayılabilecek sonsuz sayıda konumdur (delikler, teller vb.). Konumlar ayırt edilebilir, sayaçlar değildir". Deliklerin sınırsız kapasitesi vardır ve talimatların listesini anlayan ve uygulayabilen bir temsilcinin yanında durur "(Lambek 1961: 295). Lambek, Q-makinesini" sonsuz sayıda konum "olarak tanımlayan Melzak'a atıfta bulunur. .. bu konumlar arasında dağıtılmış sonsuz büyüklükte bir sayaç kaynağı, bir program ve tek amacı programı yürütmek olan bir operatör "(Melzak 1961: 283). BBJ (loc. cit.), deliklerin olduğu şartını ekler. "herhangi bir sayıda taşı tutabilir" (s. 46). Hem Melzak hem de Lambek Kanada Matematik Bülteni, cilt. 4, hayır. 3, Eylül 1961.
  48. ^ Herhangi bir karışıklık yoksa, "sayaçlar" kelimesi kaldırılabilir ve bir konumun tek bir "sayı" içerdiği söylenebilir.
  49. ^ "Bir talimatın etkili talimatlara tam olarak nasıl uyacağını belirlemek için robotun izleyebileceği bir prosedür varsa. "(Stone 1972: 6)
  50. ^ cf Minsky 1967: Bölüm 11 "Bilgisayar modelleri" ve Bölüm 14 "Hesaplanabilirlik İçin Çok Basit Temeller" s. 255–281 özellikle
  51. ^ cf Knuth 1973: 3.
  52. ^ Ancak uygun olmayan çıkarmadan kaçınmak için her zaman öncesinde IF – THEN vardır.
  53. ^ Knuth 1973: 4
  54. ^ Taş 1972: 5. Kök çıkarma yöntemleri önemsiz değildir: bkz. Karekök hesaplama yöntemleri.
  55. ^ Leeuwen, Ocak (1990). Teorik Bilgisayar Bilimi El Kitabı: Algoritmalar ve karmaşıklık. Cilt A. Elsevier. s. 85. ISBN  978-0-444-88071-0.
  56. ^ John G. Kemeny ve Thomas E. Kurtz 1985 Temele Dönüş: Dilin Tarihi, Yolsuzluk ve Geleceği, Addison-Wesley Publishing Company, Inc. Reading, MA, ISBN  0-201-13433-0.
  57. ^ Tausworthe 1977: 101
  58. ^ Tausworthe 1977: 142
  59. ^ Knuth 1973 bölüm 1.2.1, Tausworthe 1977 tarafından 100ff sayfalarında ve Bölüm 9.1'de genişletilmiştir.
  60. ^ cf Tausworthe 1977
  61. ^ Heath 1908: 300; Hawking'in Dover 2005 baskısı Heath'den alınmıştır.
  62. ^ "'BF'yi ölçen CD, FA'yı kendisinden daha az bıraksın.' Bu, kalan FA uzunluğunun CD'den daha az olacağı şekilde bir F noktasına ulaşılana kadar CD'ye eşit BA ardışık uzunlukları boyunca ölçün; başka bir deyişle, BF'nin BA'da bulunan CD'nin en büyük tam katı olmasına izin verin "demek için düzgün bir kısaltmadır. (Heath 1908: 297)
  63. ^ Algoritmada bölme kullanan modern tedaviler için bkz. Hardy ve Wright 1979: 180, Knuth 1973: 2 (Cilt 1), ayrıca Knuth 1969: 293-297 (Cilt 2) 'de Öklid algoritmasının daha fazla tartışması.
  64. ^ Öklid bu soruyu Önerme 1'de ele alır.
  65. ^ "Öklid'in Öğeleri, Kitap VII, Önerme 2". Aleph0.clarku.edu. Arşivlendi 24 Mayıs 2012 tarihinde orjinalinden. Alındı 20 Mayıs, 2012.
  66. ^ Bu kavram yaygın kullanımda olsa da kesin olarak tanımlanamaz.
  67. ^ Knuth 1973: 13–18. R W. Floyd, Peter Naur, C.A.R.'ye "iddialar ve tümevarım açısından algoritma-kanıtlamanın formülasyonunu" kredi olarak veriyor. Hoare, H.H. Goldstine ve J. von Neumann. Tausworth 1977, Knuth'un Öklid örneğini ödünç aldı ve Bölüm 9.1'deki Knuth yöntemini genişletti. Biçimsel Kanıtlar (sayfa 288–298).
  68. ^ Tausworthe 1997: 294
  69. ^ Bkz. Knuth 1973: 7 (Cilt I) ve onun daha ayrıntılı analizleri s. 1969: 294–313 (Cilt II).
  70. ^ Bozulma, bir algoritma kendisini sıkıştırmaya çalıştığında gerçekleşir. Başarı çözer Durma sorunu.
  71. ^ Kriegel, Hans-Peter; Schubert, Erich; Zimek, Arthur (2016). "Çalışma zamanı değerlendirmesinin (siyah) sanatı: Algoritmaları veya uygulamaları mı karşılaştırıyoruz?" Bilgi ve Bilgi Sistemleri. 52 (2): 341–378. doi:10.1007 / s10115-016-1004-2. ISSN  0219-1377. S2CID  40772241.
  72. ^ Gillian Conahan (Ocak 2013). "Daha İyi Matematik Daha Hızlı Veri Ağları Yapar". Discovermagazine.com. Arşivlendi 13 Mayıs 2014 tarihinde orjinalinden. Alındı 13 Mayıs, 2014.
  73. ^ Haitham Hassanieh, Piotr Indyk, Dina Katabi ve Eric Price "Ayrık Algoritmalar Üzerine ACM-SIAM Sempozyumu (SODA) Arşivlendi 4 Temmuz 2013, Wayback Makinesi, Kyoto, Ocak 2012. Ayrıca bkz. sFFT Web Sayfası Arşivlendi 21 Şubat 2012, Wayback Makinesi.
  74. ^ Kowalski 1979
  75. ^ Sırt Çantası Sorunları | Hans Kellerer | Springer. Springer. 2004. ISBN  978-3-540-40286-2. Arşivlendi 18 Ekim 2017'deki orjinalinden. Alındı 19 Eylül 2017.
  76. ^ Carroll, Sue; Daughtrey, Taz (4 Temmuz 2007). Yazılım Kalite Mühendisi için Temel Kavramlar. Amerikan Kalite Topluluğu. s. 282 ve devamı. ISBN  978-0-87389-720-4.
  77. ^ Örneğin, Ses bir dışbükey politop (bir üyelik oracle kullanılarak tanımlanmıştır), randomize bir polinom zaman algoritması ile yüksek doğruluğa yaklaştırılabilir, ancak deterministik bir algoritma ile değil: bkz. Dyer, Martin; Frieze, Alan; Kannan, Ravi (Ocak 1991), "Dışbükey Cisimlerin Hacmini Yaklaşık Olarak Belirlemek İçin Rastgele Bir Polinom Zaman Algoritması", J. ACM, 38 (1): 1–17, CiteSeerX  10.1.1.145.4600, doi:10.1145/102782.102783, S2CID  13268711.
  78. ^ George B. Dantzig ve Mukund N. Thapa. 2003. Doğrusal Programlama 2: Teori ve Uzantılar. Springer-Verlag.
  79. ^ Tsypkin (1971). Otomatik sistemlerde adaptasyon ve öğrenme. Akademik Basın. s. 54. ISBN  978-0-08-095582-7.
  80. ^ Knuth Donald E. (1972). "Eski Babil Algoritmaları" (PDF). Commun. ACM. 15 (7): 671–677. doi:10.1145/361454.361514. ISSN  0001-0782. S2CID  7829945. Arşivlenen orijinal (PDF) 24 Aralık 2012.
  81. ^ Aaboe, Asger (2001), Astronominin Erken Tarihinden Bölümler, New York: Springer, s. 40–62, ISBN  978-0-387-95136-2
  82. ^ Ast, Courtney. "Eratosthenes". Wichita Eyalet Üniversitesi: Matematik ve İstatistik Bölümü. Arşivlendi 27 Şubat 2015 tarihli orjinalinden. Alındı 27 Şubat 2015.
  83. ^ Chabert, Jean-Luc (2012). Algoritmaların Tarihçesi: Çakıldan Mikroçipe. Springer Science & Business Media. s. 2. ISBN  9783642181924.
  84. ^ Davis 2000: 18
  85. ^ Bolter 1984: 24
  86. ^ Bolter 1984: 26
  87. ^ Bolter 1984: 33–34, 204–206.
  88. ^ W. Stanley Jevons 1880'den tüm alıntılar Mantıkta Temel Dersler: Tümdengelimli ve Tümevarımlı, Macmillan and Co., Londra ve New York. Googlebook olarak yeniden yayınlandı; cf Jevons 1880: 199–201. Louis Couturat 1914 Mantık Cebiri, The Open Court Publishing Company, Chicago ve Londra. Googlebook olarak yeniden yayınlandı; cf Couturat 1914: 75–76 birkaç ayrıntı daha verir; bunu bir daktilo ve piyano ile karşılaştırır. Jevons, hesabın 20 Ocak 1870'de bulunacağını belirtir. Kraliyet Cemiyeti Tutanakları.
  89. ^ Jevons 1880: 199–200
  90. ^ John Venn 1881'den tüm alıntılar Sembolik Mantık, Macmillan ve Co., Londra. Googlebook olarak yeniden yayınlandı. cf Venn 1881: 120–125. İlgilenen okuyucu bu sayfalarda daha derin bir açıklama bulabilir.
  91. ^ Bell ve Newell diyagramı 1971: 39, krş. Davis 2000
  92. ^ * Melina Hill, Valley News Muhabiri, Bir Tamirci Tarihte Yer Alır, Valley News West Lebanon NH, 31 Mart 1983 Perşembe, s. 13.
  93. ^ Davis 2000: 14
  94. ^ van Heijenoort 1967: 81ff
  95. ^ van Heijenoort'un Frege's yorumu Begriffsschrift, saf düşünce için aritmetik üzerinde modellenen bir formül dili van Heijenoort 1967'de: 1
  96. ^ Dixon 1906, krş. Kleene 1952: 36–40
  97. ^ cf. Alonzo Kilisesi'ndeki dipnot 1936a, Davis 1965: 90 ve 1936b, Davis 1965: 110
  98. ^ Kleene 1935–6, Davis 1965: 237ff, Kleene 1943, Davis 1965: 255ff
  99. ^ Kilise 1936, Davis 1965: 88ff
  100. ^ cf. "Sonlu Kombinasyon Süreçleri - formülasyon 1", 1936 Sonrası, Davis 1965: 289–290
  101. ^ Davis 1965'te Turing 1936–37: 116ff
  102. ^ Rosser 1939, Davis 1965: 226
  103. ^ Kleene 1943, Davis 1965: 273–274
  104. ^ Kleene 1952: 300, 317
  105. ^ Kleene 1952: 376
  106. ^ Turing 1936–37, Davis 1965: 289–290
  107. ^ Turing 1936, Davis 1965, Turing 1939, Davis 1965: 160
  108. ^ Hodges, s. 96
  109. ^ Turing 1936–37: 116
  110. ^ a b Turing 1936–37, Davis 1965: 136
  111. ^ Turing 1939, Davis 1965: 160

Kaynakça

daha fazla okuma

Dış bağlantılar

Algoritma havuzları