Algoritma tam olarak nedir?


12

Bunun kutunun dışına biraz gelebileceğini biliyorum, aslında her zaman kutunun içinde düşünürdüm, ama son zamanlarda, muhtemelen bilgisayar bilimi, programların dışındaki programları tasarlamanın yolları hakkında yüksek derecede özgürlük sağladığı için düşünüyorum. üniversitede öğretilenler.

Faktöriyel fonksiyonu düşünün. Genellikle bu işlevi şöyle tanımlarız

 int fact(int n) 
 { 
 int r = 1; 
 for(int i=2;i<=n;i++) 
 r = r*i; 
 return r; 
 } 

Buna algoritma diyebilirim ve bunun doğru bir yol olduğundan şüphem yok. Sonra, ben şu fikre izin "sabit zamanda yapabilir miyim?" Merak ettim: dizi [n] n faktöriyel ev sahipliği nerede tamsayılar bir dizi olsaydı? Bu dizi dolduğunda ben sadece gerçeği şöyle tanımlayabilirsiniz:

 int fact(int n) 
 { 
 return array[n]; 
 } 

Yine de doğru sonucu sağlar ve sabit zaman O (1) çalışır rağmen, bu bir algoritma cal görünmüyor. Buna algoritma denilebilir mi? Aksi halde neden olmasın? Diziyi doldurmamızın, diziyi doldurmamız için beynimizde olsa bile, bir zamanlar işlemek için bir algoritma gerektirdiğini iddia edebilirim, ancak bu kriterler olabilir mi? Bu yönler resmi olarak nasıl ele alınır?

Bu kavramın bağımsız değişkenlerinin sayısından bağımsız olarak tamsayılar üzerinde çalışan herhangi bir işleve genişletilebileceğini, işlevin 2 bağımsız değişkeni varsa bir matris veya işlev 3 bağımsız değişkeni varsa 3 kullanması gerektiğini unutmayın. Ayrıca, bu çözümler sadece bellek tüketimi nedeniyle kullanılmıyor mu?

Ayrıca, bir programın sağlayabileceği olası her çıkışı dizine eklemenin bir yolunu bulabildiğinden, işlevler çıktı ile herhangi bir programı da kapsayamaz.

Başka bir örnek olarak, bir dizinin ortak kullanımını düşünün: i başlangıçta N boyutunda bir dizi ayırır, sonra dizini n değerinde depolayarak ve n'yi bir birim artırarak diziye eleman eklerim. Sonra, bir elemento aramak istiyorsanız, ben yardımcı olamaz ama dizi üzerinde doğrusal bir arama gerçekleştirmek için. Bunun yerine, sıfırlarla başlatılan tamsayıları saklamak için örneğin Integer.MAXVALUE boyutunda bir dizi oluşturduysam, dizinine 1 yerleştirerek bir tamsayıyı depolayabilirim. Sonra dizideki varlığını (1) arayabilirdim. Aynı numaradan birden fazla birim yerleştirmek istersem ne olur? Sorun değil, ben sadece tamsayı dizininde depolanan değeri artırmak istiyorum.

Sıralama biraz daha karmaşık olabilir, ancak yine de O (1) zamanında arama ve ekleme yapılabilir.


İkinci fonksiyonunuz diziyi parametre olarak içermelidir. Aksi takdirde, programlamada yararlı olan ancak kodunuzun akla gelmesini zorlaştırabilecek örtük durumun zorunlu tuzağında kaybolursunuz.
jmite

Evet, ikinci kodunuz, girdinin n sayısı ve tüm faktörlere sahip dizi olduğu bir algoritma olarak adlandırılabilir. İlk kodda algoritmanın yalnızca bir girişi vardır, yani n sayısı.
Ankur

Zorunlu: Bugün bu kısayol tanımında [“algoritma”] benimsediğimi anladığım materyal türlerini daha fazla tanımlamaya çalışmayacağım ve belki de bunu asla anlaşılır bir şekilde başaramadım. Ama gördüğümde biliyorum ve aşağıdaki yazılarda anlatılanlar bu değil.
Patrick87

Bu soru ile ilgili (ancak doğrudan cevap vermeyen), "Algoritma nedir?" Yuri Gurevich Microsoft Research, Teknik Rapor MSR-TR-2011-116 tarafından research.microsoft.com/pubs/155608/209-3.pdf
godfatherofpolka

Diyorsun ki: "... ne dizi [n] n faktöriyel barındıran bir tamsayılar dizisi olsaydı? Bu dizi dolduğunda ....". Bir diziyi tüm tamsayıların faktöriyelerine nasıl dolduracaksınız? Bu dizi sonsuz büyüklüğe sahip olacak ve doldurulması sonsuz zaman alacaktı. Bu nedenle sorunuz kötü soruluyor.
AP

Yanıtlar:


9

Popüler bir ders kitabındaki bir algoritmanın gayri resmi tanımı şuna benzer:

Bir algoritma (1) bazı girdi alan ve (3) iyi tanımlanmış bir hesaplama problemi için bazı çıktı (4) üreten iyi tanımlanmış bir hesaplama prosedürüdür (2).

İlk durumda, bir algoritma kodladınız: Sorun, girdi olarak (tanımın 2. kısmı) verilen faktöriyel (tanımın 4. kısmı) bulmaktır, kod, gerçekleştirilecek hesaplamayı (tanımın 1. kısmı) açıklar. ), çıktı faktöryeldir (tanımın 3. bölümü).

İkinci durumda: Sorun, n'yi giriş (tanımın 4. bölümü) olarak verilen n konumunda (tanımın 4. bölümü) bulmaktır, kod, gerçekleştirilecek hesaplamayı (tanımın 2. bölümü), çıktı, n konumundaki öğedir (tanımın 1. bölümü).

Faktörleri orada sakladınız, böylece size faktöriyeller veriyor. Orada kareler veya küpler saklamış olsaydınız, kareler veya küpler elde edersiniz, bu yüzden ikinci snippet'in kendi başına faktöriyelleri hesaplamak için bir algoritma olduğu söylenemez.

Ve eğer bir dizinin n konumunda f (n) olan bir dizi ile birlikte baktığını söylüyorsanız, f (n) 'yi hesaplamak için bir algoritmadır, o zaman o kadar derine inmiştiniz ki, aşağıda daha fazla hesaplama yoktur. İyi tanımlanmış bir hesaplama prosedürü sınırlı bir bilgi parçası olmalıdır. Sonsuz faktöriyel dizi, hesaplama prosedürünün bir parçasıysa, bu geçerli değildir. Yani bu faktöriyelleri hesaplamak için bir algoritma olmazdı.


OP'nin önerisindeki asıl sorun, "iyi tanımlanmış hesaplama prosedürü" tanımının sonlu olmamasıdır. Tabii ki, "iyi tanımlanmış hesaplama prosedürü" ile ne demek istediğimizi açıklamazsak, OP'nin algoritmasının yasal olup olmadığını önceden söyleyemeyiz. Aslında sonsuz dizi göz önüne alındığında "iyi tanımlanmış bir hesaplama prosedürü", peki bu neden yasadışı? OP bile dizinin nasıl doldurulacağını sonlu terimlerle açıklayabilir. O zaman yanlış olan ne? Gayri resmi tanımınız hiper hesaplama ve (Turing) hesaplama arasında ayrım yapamaz.
Yuval Filmus

İyi tanımlanmış bir hesaplama prosedürü sınırlı bir bilgi parçası olarak ifade edilebilir olmalıdır. Sonsuz bir faktöriyel dizi bunun bir parçasıysa, bu geçerli değildir.
Ranbir

2
{(n,n!):nN-}

Dizinin açıklaması sonlu bir bilgi parçası olarak ifade edilebilir, ancak dizinin kendisi değildir.
Ranbir

Her iki OP örneğinin algoritmalar olduğunu ve her iki faktör için de faktöriyeti hesaplamadığını iddia ediyorum . Ama bu sadece seçici, sanırım.
Patrick87

5

En genel olarak, algoritma bir problemi çözmek için bir dizi adımdır .

CS'de, algoritma terimi kullanılırken aşağıdakiler yaygın olarak anlaşılır / varsayılır:

  • Algoritmanın sonlu bir açıklaması ve herhangi bir problem örneği verildiğinde adımlarını gerçekleştirmek için iyi tanımlanmış bir prosedürü vardır. (Daha fazlası aşağıdadır.)
  • Sonlu dize (girdi sembollerinin sırası) ve algoritmanın çıktısı olarak verilen bir problem örneği sonlu dize olarak kodlanabilir.
  • Sorun, her bir örnek için olası "doğru" çıktılarla birlikte sorunlu örneklerin toplamıdır. "Çözme", doğru çıktı üretmek anlamına gelir.
  • (Genellikle) problem örnekleri keyfi olarak büyük olabilir (sonlu algoritmanızın çözmesi gereken sonsuz sayıda olası örnek vardır).

CS kurulmadan önce, matematikçiler dile getirdiğiniz kaygıların aynısına sahipti ve bu kaygıları gidermek için resmi hesaplama tanımları yaptılar. Böylece, günümüzde, yukarıdaki varsayımların hepsini basitçe "algoritma Turing makinesinde uygulanabilecek bir prosedürdür" diyerek resmileştirebiliriz . Bu muhtemelen sorunuzun en iyi resmi cevabıdır.

Church-Turing tezinin algoritmaların Turing Makinesinden daha "güçlü" bir biçimselleştirilmesinin olmadığını düşündüğümüzü unutmayın .

Faktöriyel örnek, düzgün olmayan hesaplama adı verilen farklı bir hesaplama modeline girer. Turing Makinesi, tek tip bir hesaplama modeline örnektir : Tekli, sonlu bir açıklamaya sahiptir ve keyfi olarak büyük boyutlu girişler için çalışır. Başka bir deyişle, sorunu tüm girdi boyutları için çözen bir TM vardır.

Şimdi, hesaplamayı aşağıdaki gibi düşünebiliriz: Her girdi boyutu için, sorunu çözen bir TM (veya başka bir hesaplama cihazı) vardır. Bu çok farklı bir soru. TM'nin sınırlı bir açıklaması olduğundan, tek bir TM'nin her bir tamsayının faktöriyelini depolayamayacağına dikkat edin. Bununla birlikte, 1000'in altındaki tüm sayıların faktöriyellerini saklayan bir TM (veya C'deki bir program) yapabiliriz. Ardından, 1000 ila 10000 arasındaki tüm sayıların faktöriyellerini saklayan bir program yapabiliriz.

Bu tek tip olmayan hesaplama türleri genellikle teorik CS'de devreler tarafından modellenir. Her olası giriş boyutu için farklı bir devre yapısı düşünürsünüz.

Tek tip olmayan hesaplama modelleri, ilk cümlenize uysalar da genellikle algoritma olarak kabul edilmezler . Bunun nedeni, bizim temel varsayımlarımıza uymamalarıdır: herhangi bir girdi boyutu için "bütün" problemini çözmek için uygulanabilecek sonlu bir açıklamaları yoktur. Aksine, sorun büyüdükçe daha büyük ve daha büyük bir açıklamaya ihtiyaç duyarlar (daha büyük bir arama tablosuna ihtiyaç duymak gibi). Ancak, hala ilginç hesaplama modelleri.


Devre tabanlı hesaplama modelinizin uygun olmadığını düşünüyorum. Dediğiniz gibi, bir TM'nin sınırlı bir açıklaması vardır. Ancak bu, faktöriyelin tablolanmış bir sürümü ile doldurulmuş bir yardımcı banda sahip olmayı engellemez. Hatta "daha kötüsü" yapabilir ve yine de sonlu bir açıklaması olabilir. Ama gerçekten ihtiyacınız olan şey, sonuçta son derece sınırlı olan hesaplanabilir bir açıklamadır. Tablolama faktöriyeli bir Turing makinesini tanımlamak için pek çok hesaplamalı tek tip yol vardır, bunların hiçbiri bir TM'nin hesaplama gücünü artıramaz. Dolayısıyla sonucunuz geçerli değildir.
babou

@babou, ne demek istediğini anlamıyorum. "Uygunsuz" ile ne demek istiyorsun ve bunun yanlış olduğunu hangi sonuca vardım? Notlar: Devre modelini icat etmedim. Belki bunu açıklayan iyi bir iş yapmadım. Kilit nokta, her giriş için farklı bir hesaplama cihazına (TM veya devre) izin vermemizdir, yani bu cihazların tümünü (tüm giriş boyutları için) üreten tek tip bir algoritma olmayabilir veya başka bir deyişle, hepsini tanımlayan sonlu bir açıklama olmamalıdır.
usul

Faktöriyel fonksiyonun çizelgesini tek tip olmayan bir hesaplama olarak görmek bana doğru bir yol gibi görünmüyor. Aslında son derece bölümleri, bütün tablo olan sonsuzluk sınırında sürekli olarak görülebilir. Scott'ın semantiği ile yapılan budur. Ayrıca, tüm tablo aslında hesaplanabilir bir şekilde sonlu olarak tarif edilebilir, böylece önceden hesaplanmış tabloyu içeren fazladan bir bantla bir TM'yi düşünmek hesaplama açısından mantıklı olur. Cevabınız, önceden hesaplanmış bir tablonun algoritma olarak değerlendirilemeyeceği sonucuna varıyor gibi görünüyor.
babou

Önceden hesaplanmış herhangi bir tablo bir algoritmanın parçası olabilir ve giderek daha büyük boyutlu önceden hesaplanmış tabloların sonsuz bir dizisi için, bunlardan herhangi birini bir algoritma kullanarak üretebilirsiniz. Ancak, giderek artan boyutta sonsuz bir arama tablosu kümesinin kendi başına bir algoritma ya da tekdüze bir hesaplama olduğunu düşünmüyorum çünkü boyut olarak sonsuz.
usul

Bunu bir algoritma olarak görmezsiniz. Bu özneldir. Önemli olan neden yapmamanız gerektiğini bilmek. Ve görebilmem için hiçbir sebep yok. Algoritmalar için anlamlı olan herhangi bir kavram bu durumda mantıklı olmaya devam eder. Tek yaptığı, tablonun oluşturulmasını özetlemektir, ancak bu ayrı olarak açıklanabilir. Aslında bu tamamen semantik bir konudur, çünkü artan sekansı bu şekilde düşünmek veya sonsuz sınırıyla değiştirmek matematiksel olarak aynıdır. Anlambilimsel hesaplama teorileri, üretilse de temsil edildiklerinde bu sınırsız sınırları göz önünde bulundurur.
babou

4

Algoritma, C'de yazılmış ve herhangi bir giriş uzunluğu için (sonsuz bellek ve sınırsız tamsayı varsayarak) çalışması gereken bir programdır. Örneklerinizde, programın tüm girdi uzunlukları için çalışmasını isteseydik , sonuçların saklandığı tablo sonsuza kadar büyük olurdu; C'deki programlar her zaman sonludur, bu nedenle bu yaklaşım kullanılamaz.

n!n!), C'ye göre çok daha verimli bir şekilde hesaplanabilir.

Gerçek bir bilgisayarda gerçek çalışma sürelerinden endişe duyduğumuzda daha da dikkatli olmalıyız, ancak bu ne yazık ki teorik bilgisayar biliminin sınırlarının ötesindedir.


nn!

Hangi algoritma kavramını kullanmalıyız? Yukarıda özetlenen bir öneri C programlarının kullanılmasıdır. Bu düşünceye C-hesaplaması diyebiliriz. Turing makineleri, Turing makinelerini kullandığınızda elde ettiğiniz şeydir. Bir fonksiyonun sadece ve sadece Turing hesaplanabilirse C-hesaplanabilir olduğu ortaya çıkar. Bu anlamda her iki hesaplama modelinin de eşdeğer olduğu anlaşılmaktadır. Aslında, diğer birçok model eşdeğerdir, örneğin ortak kullanımdaki tüm programlama dilleri (sonsuz bellek ve sınırsız değişkenler varsayarak).

P'nin Turing-complete olduğu bir programlama dilinin, yalnızca Turing-uyumlu olması durumunda P-hesaplanabilir bir fonksiyon olduğunu söylüyoruz . Kilise-Turing hipotezi, sonlu açıklamaya ve sonlu zaman alan tüm makul hesaplama modellerinin Turing-tamamlanmış olduğu etkisinin gayri resmi bir ifadesidir . Modelinizin sonlu bir açıklaması var, ancak sonlu zaman almıyor.


3
lol "Bir algoritma C ile yazılmış bir programdır ..."?!?
vzn

2
"Algoritma, C ile yazılmış bir programdır ..." Neden dili belirtiyorsunuz? Mantıklı değil.
İsim

1
@nouney Sadece somut olmaya çalışıyorum. En sevdiğiniz programlama dili de Turing-complete.
Yuval Filmus

@YuvalFilmus Beton değilsin, kafa karıştırıyorsun.
İsim

@nouney Kendi cevabınızı ekleyebilirsiniz.
Yuval Filmus

4

Sizinki eksik olan bir algoritmanın ortak tanımının önemli kısmı, spesifikasyonun sonlu olması ve spesifikasyonun boyutunun girişin boyutuna göre değişmemesidir.

Bellek keyfi olarak büyük olabilir ve girişler de olabilir, ancak bir algoritmanın yararlı bir tanımı için kod alanının sonlu olması gerekir. Aksi takdirde az önce tanımladığınız sorunu alırsınız.

Ö(günlükbir)AO(logn)O(logn!)Ö(n(günlükn)2)sn=Ö(2s)Ö(2s s2)Ö(1)


" kod alanı sonlu olmalıdır ": evalAz önce oluşturduğu ve bir lLisp ifadesini temsil eden bazı büyük veri yapısında işlevi çağıran bir Lisp programının algoritma olarak değerlendirilemeyeceğini mi söylüyorsunuz? 20. yüzyılda MIT'de üretilen kodun çoğunun algoritma olarak nitelendirilmediğinden şüpheleniyorum. Bu sadece gayri resmi bir argüman, ancak resmi sorun, çok kısıtlayıcı bir şekilde okuduğunuz sonlu bir spesifikasyonun ne olduğu görüşünde yatmaktadır.
babou

İfade üretildiyse sonludur. Ne kadar büyük olursa olsun. Bununla birlikte, kod alanının sonluluğundaki kısıtlamanın kaldırılması yararlı olabilir, çalışma zamanında sınırları düşürmek için kullanılabilir (örneğin, liste sıralamasının çalışma zamanında daha düşük bir sınırlama kanıtlamak gibi). Ancak algoritmaların kendileri üzerindeki hemen hemen her ilginç sonuç, sınırlı bir kod alanı gerektirecektir. Polinomların sınırlı sayıda katsayıya sahip olması gerektiği ile benzerdir, ancak kuvvet serileri de yararlıdır.
DanielV

Karmaşıklığı nasıl hesaplayacağım konusunda uzman değilim (benim alanım değil), ancak bunu yapmak için matematiğinizin olması ya da olmaması, bir algoritmanın ne olduğunu etkilememelidir. Mesele şu ki, Lisp programı kodunun boyutunu herhangi bir sınırlama olmadan artırmaya devam edebilir. O zaman bunu belirli hesaplama özelliklerine sahip sonsuz bir kod parçası olarak analiz etmek daha mantıklı olabilir. Tablolanmış fonksiyonun durumu bu ışıkta görülebilir. Cevapların bir algoritmanın ne olduğuna dair sınırlı bir görüşe sahip olduğum için şaşırdım .
babou

3

Yararlı olabilecek birkaç gözlem:

Sorunlar , izin verilen girdiler ve karşılık gelen çıktılarla ilgili ifadelerdir. Çözmek istediğimiz şeyler bunlar. Algoritmalar hesaplama prosedürleridir. Bir algoritmanın problemle ilgili olarak izin verilen girdileri kabul etmesi ve problem tanımına göre çıktılar üretmesi halinde problem açısından doğru olduğunu söyleyebiliriz .

Her iki örneğiniz de algoritmalardır, çünkü ikisi de açıkça hesaplama prosedürleridir. Algoritmaların doğru olup olmadığı sorunu nasıl tanımladığınıza ve algoritmanın temsilini nasıl yorumladığınıza bağlıdır. Bazı problem bildirimleri:

  1. nn!
  2. n>0n!< INT_MAXn!

İlk kod snippet'inizin bazı yorumları:

  1. Bu, detaylar dışında C / C ++ 'ya benzeyen sahte koddur. intgerçekten "herhangi bir tamsayı" anlamına gelir.
  2. Bu gerçek bir C / C ++ programı gibi yorumlanmalıdır.

Yorum 1 sorun faktörü 1 için doğrudur, çünkü faktöriyel negatif sayılar için 1 değerini varsayar (aksi takdirde, etki alanını kısıtlamak için problem ifadesini veya istenen davranışı hesaba katmak için algoritmayı değiştirebiliriz). Yorum 2, aynı uyarı ile problem bildirimi 2 için doğrudur.

arrayarraynn>0n!< INT_MAXn!n<0

nn!232n!264

kknknk+n


Bir algoritma kavramının bir bilgisayarın kelime boyutu sınırlamalarının biraz ötesine geçtiğini düşünürüm. Sorunu atlattığınızı hissediyorum.
babou

1

Bir algoritma bir yazılan bir programdır Turing-tam dilin tüm geçerli girişler üzerinde kanıtlanabilir durur. Tüm standart programlama dilleri Turing-complete'tur. Sözcük, Hint sayısal sistemini batı dünyasına tanıtan 7. yüzyıl Hint matematikçi Brahmagupta'nın üzerine kurulu olan bir Farsça matematikçi, gökbilimci ve coğrafyacı olan El-Harezmi isminin Avrupa çevirisi olarak ortaya çıkmaktadır.

Soru, temel olarak, arama tablolarının algoritmaların bir parçası olup olmadığı ile ilgilidir. Kesinlikle! Gelen Turing makineleri (TM) tablolar TM durumu tablosunda kodlanabilir. TM, bandı geçiş tablosunda saklanan sınırlı miktarda veriye göre başlatabilir . Ancak, sonsuz girişlerde çalışmayan "algoritmalar", sadece sonlu girişler, "önemsiz" sonlu durum makineleridir (FSM) .


3
Neden bir TUring tam dilinde olması gerekiyor?
babou

1

Özetle : Algoritma, verilen bir sorunun çözümü olduğunu gösteren yapıcı bir kanıtın yapıcı parçasıdır. Bu tanımın motivasyonu, bir programın yalnızca bir sorunu çözdüğü, ancak kanıtlanabileceği şekilde bir ilgisinin olduğunu göz önünde bulundurarak, programlar ve kanıt arasındaki Curry-Howard izomorfizmidir. Bu tanım daha fazla soyutlamaya izin verir ve endişe duyabileceğiniz alanların türüne ilişkin bazı kapıları açık bırakır, örneğin sonluk özellikleri gibi.

Uyarı . Soruyu cevaplamak için uygun resmi bir yaklaşım bulmaya çalışıyorum. Gerekli olduğunu düşünüyorum, ancak şimdiye kadar cevap veren kullanıcıların hiçbiri (kendim dahil ve bazıları diğer yayınlarda bu konuda az ya da çok açık), düzgün bir şekilde ilgili sorunları geliştirmek için doğru arka plana sahip gibi görünüyor. yapıcı matematik, ispat teorisi, tip teorisi ve ispat ve programlar arasındaki Curry-Howard izomorfizmi gibi sonuçlar . Burada elimden gelenin en iyisini yapıyorum, sahip olduğum (inandığım) bilgi parçacıklarıyla ve bu cevabın sınırlamalarının çok farkındayım. Sadece cevabın nasıl görünmesi gerektiğini düşündüğüm hakkında bazı ipuçları vermeyi umuyorum. Resmi olarak (muhtemelen) açıkça yanlış olan herhangi bir nokta görürseniz, lütfen bana bir yorumda veya e-posta ile bildirin.

Bazı sorunları belirleme

Bir algoritmayı dikkate almanın standart bir yolu, bir algoritmanın bellekte hiçbir sınırlaması olmayanlar da dahil olmak üzere bazı bilgi işlem aygıtları için rasgele, sonlu bir program olduğunu belirtmektir. Dil, bilgisayar makine dili de olabilir. Aslında bir Turing tam bilgi işlem cihazı için tüm programları göz önünde bulundurmak yeterlidir (bu, bellek sınırlaması olmadığı anlamına gelir). Her şeyin bazı kodlamaya kadar tanımlandığı için, algoritmaların yorum bağlamındaki ayrıntılarına bağımlı bir biçimde ifade edilmesi gerektiği için, tüm algoritmalar sunumlarını vermeyebilir. Ancak, hesaplanacak her şeyi hesaplayacağı için, kodlamaya kadar bir şekilde tüm algoritmaları içerecektir.

π

πMuhtemelen neredeyse hepsinin matematiksel anlamında. Ancak bu, tanımlarda daha fazla hassasiyet gerektirecektir.

Yani asıl soru anlamlı algoritmaların ne olduğunu bilmek. Cevap, anlamlı algoritmaları bir problemi çözenlerdir, adım adım “çözüm”, “cevap” bu problemi hesaplarlar. Bir algoritma çözdüğü bir sorunla ilişkiliyse ilginçtir.

Bu yüzden resmi bir problem verildiğinde problemi çözen bir algoritma nasıl elde edilir. Açık ya da dolaylı olarak, algoritmalar, soruna doğru olarak kanıtlanabilecek bir çözüm olduğu fikri ile ilişkilidir. İspat tekniklerimizin doğru olup olmadığı başka bir konudur, ancak en azından kendimizi ikna etmeye çalışıyoruz. Kendinizi yapmamız gereken matematik olan yapıcı matematikle sınırlandırırsanız (ve matematiğin çoğu için çok kabul edilebilir bir aksiyomatik kısıtlama), bir çözümün varlığını kanıtlamanın yolu, aslında bir yapı sergileyen kanıt adımlarından geçmektir. çözümü doğrulayan diğer adımlar da dahil olmak üzere çözümü temsil eder.

Tüm programcılar şöyle bir şey düşünür: Verilerle böyle ve böyle bir şekilde uğraşırsam, Susam teoremi nedeniyle sadece doğru özelliklere sahip olan bu widget'ı alıyorum ve bu foo-koruyucu dönüşümü çalıştırarak istenen cevabı alıyorum . Ancak kanıt genellikle gayri resmi ve tüm ayrıntılar üzerinde çalışmıyoruz, bu da bir uydunun neden Mars'ın yeraltında yörüngesinde kalmaya çalıştığını açıklıyor (diğer şeylerin yanı sıra). Akıl yürütmenin çoğunu yapıyoruz, ancak aslında sadece çözümü oluşturan yapıcı kısmı koruyoruz ve bunu bilgisayar dilinde sorunu çözen algoritma olarak tanımlıyoruz.

İlginç algoritmalar (veya programlar)

Bütün bunlar, şu anki araştırmanın konusu olan (uzman olmadığım) aşağıdaki fikirleri tanıtmaktı. Burada kullanılan " ilginç algoritma " kavramı benimkidir, daha doğru tanımlar için gayri resmi bir yer tutucu olarak tanıtılmıştır.

İlginç bir algoritma, verilen bir sorunun bir çözümü olduğuna dair yapıcı bir kanıtın yapıcı parçasıdır . Bu, kanıtın varlığını kanıtlamaktan ziyade, örneğin çelişkiyle çözümü sergilemesi gerektiği anlamına gelir. Daha fazla ayrıntı için bkz . Matematikte Sezgisel Mantık ve Yapılandırmacılık .

Bu, elbette, yalnızca ilginç algoritmalar dediğim şeyi dikkate alan çok kısıtlayıcı bir tanımdır. Yani neredeyse hepsini görmezden geliyor. Ancak algoritma üzerine tüm ders kitaplarımız da öyle. Sadece ilginç olanlardan bazılarını öğretmeye çalışıyorlar.

Sorunun tüm parametreleri (giriş verileri) göz önüne alındığında, belirli bir sonucun adım adım nasıl elde edileceğini anlatır. Tipik bir örnek denklemlerin çözümlenmesidir (isim algoritması aslında bazı denklemlerin çözümlemesini inceleyen Farsça bir matematikçi Muḥammad ibn Mūsā al-Khwārizmī'in adından türetilmiştir ). İspatın bölümleri, algoritmada hesaplanan bazı değerlerin bazı özelliklere sahip olduğunu saptamak için kullanılır, ancak bu parçaların algoritmanın kendisinde tutulması gerekmez.

Elbette bu, hesaplanan verilerin ne olduğunu, izin verilen temel hesaplama adımlarının neler olduğunu ve kullanılan aksiyomların ne olduğunu belirleyen resmi bir mantıksal çerçeve içinde gerçekleşmelidir.

Faktöriyel örneğinize geri dönersek, önemsiz de olsa bir algoritma olarak yorumlanabilir. Normal faktöriyel fonksiyon, bazı aritmetik çerçeve verildiğinde ve n tamsayısı verildiğinde, ilk n tamsayıların çarpımı olan bir sayı olduğu kanıtına karşılık gelir. Faktöriyel hesaplama gibi bu oldukça basittir. Diğer işlevler için daha karmaşık olabilir.

Şimdi, faktöriyeli tablolamaya karar verirseniz, yapabileceğinizi varsayarsak, bu tüm tamsayılar için doğru değildir (ancak bazı sınırlı değerler alanı için doğru olabilir), yaptığınız tek şey, aksiyomlarınıza bir yeni aksiyom değerini her tamsayı için değiştirir, böylece artık hiçbir şeyi kanıtlamanıza (dolayısıyla hesaplamanıza) gerek kalmaz.

Ancak bir aksiyom sisteminin sonlu (veya en azından sonlu olarak tanımlanmış) olması gerekir. Ve faktöriyel için tamsayı başına bir sonsuz değer vardır. Eğer sonsuz bir işlevi aksiyomatize ederseniz, yani sonsuz bir alanda tanımlanmışsanız, sonlu aksiyom sisteminiz için sorun yaşarsınız. Bu, tabloya bakmanızın tüm tamsayılar için uygulanamaması gerçeğiyle hesaplanır. Bu, algoritmalar için olağan sonluluk gereksinimini öldürür (ancak sık sık sunulduğu kadar katı mıdır?).

Tüm vakaları ele almak için son derece tanımlanmış bir aksiyom jeneratörüne sahip olmaya karar verebilirsiniz. Bu, diziyi gerektiği gibi başlatmak için algoritmanıza standart faktöriyel programı dahil etmek anlamına gelir. Yani denir memoization programcılar tarafından. Bu aslında önceden hesaplanmış bir tablonun eşdeğerine en yakın olanıdır. Gerektiğinde , tablonun aslında tembel değerlendirme modunda oluşturulmuş olması dışında, önceden hesaplanmış bir tabloya sahip olduğu anlaşılabilir . Bu tartışma muhtemelen biraz daha resmi bakıma ihtiyaç duyacaktır.

İlkel işlemlerinizi istediğiniz gibi tanımlayabilirsiniz (biçimsel sisteminizle tutarlılık içinde) ve karmaşıklık veya performans analizi yapmak için bir algoritmada kullanıldığında seçtiğiniz herhangi bir maliyeti atayabilirsiniz. Ancak, algoritmanızı gerçekten uygulayan somut sistemler (örneğin bir bilgisayar veya bir beyin) bu maliyet özelliklerine saygı gösteremezse, analiziniz entelektüel olarak ilginç olabilir, ancak gerçek dünyada gerçek kullanım için değersizdir.

21000

Hangi programlar ilginç

Bu tartışma, programlar ve kanıtlar arasındaki Curry-Howard izomorfizmi gibi sonuçlarla daha doğru bir şekilde ilişkilendirilmelidir . Herhangi bir program aslında bir şeyin kanıtıysa, herhangi bir program yukarıdaki tanım anlamında ilginç bir program olarak yorumlanabilir.

Ancak, benim (sınırlı) anlayışımla, bu izomorfizm, tiplerin aksiyomatik teorinin önermelerine karşılık geldiği bazı uygun yazım sistemlerinde iyi yazılabilen programlarla sınırlıdır. Bu nedenle, tüm programlar ilginç programlar olarak nitelendirilemez. Benim tahminim, bu anlamda bir algoritmanın bir problemi çözmesi gerekiyor.

Bu muhtemelen "rastgele üretilen" programların çoğunu hariç tutar.

Aynı zamanda "ilginç bir algoritma" nın ne olduğunun biraz açık bir tanımıdır. İlginç olarak görülebilen herhangi bir program kesinlikle öyle, çünkü onu ilginç kılan tanımlanmış bir tip sistemi var. Ancak şimdiye kadar yazılamayan bir program, daha gelişmiş bir yazı sistemiyle yazılabilir hale gelebilir ve böylece ilginç hale gelebilir. Daha doğrusu, her zaman ilginçti, ancak uygun tip sistemi hakkında bilgi eksikliği nedeniyle, bunu bilmiyorduk.

Ancak, tür uygulama olarak bazı lambda ifadesi, bilindiğinden tüm programlar tipi belirsiz olduğu bilinmektedir Y bağdaştırıcının , bir ses tipi sistemde yazılan edilemez .

Bu görüş yalnızca bazı aksiyomatik kanıt sistemiyle doğrudan ilişkilendirilebilen programlama formalizmleri için geçerlidir. Turing Makinesi gibi düşük seviyeli hesaplama formalizmlerine nasıl genişletilebileceğini bilmiyorum. Bununla birlikte, algoritmalar ve hesaplanabilirlik genellikle problemlerin ve çözümlerin kodlanması oyunu olduğundan ( lambda hesabında kodlanmış aritmetikleri düşünün ), bir algoritmanın kodlaması olarak gösterilebilecek resmi olarak tanımlanan herhangi bir hesaplamanın da bir algoritma olduğu düşünülebilir. Bu tür kodlamalar muhtemelen Turing Makineleri gibi düşük seviyeli formalizmde ifade edilebilecek şeylerin sadece çok küçük bir kısmını kullanır.

Bu yaklaşımın bir ilgisi, gerçek kodlama, hesaplama alanının "fiziksel temsil edilebilirliği" konularından daha soyut ve bağımsız bir algoritma kavramı vermesidir. Böylece, örneğin, hesaplamada sağlam bir kullanım yolu olduğu sürece sonsuz nesnelerle etki alanları düşünülebilir.


2
Bu, konunun kolay bir görüşü değildir, ancak temel bir konudur. Aşırı derecede basitleştirmek zorunda kaldım ve hatalar yapmış olabilirim. Ama, eğer aşağı inecekseniz, lütfen bana nedenini söyleyin.
babou

Evet, inişlerde ne olduğundan emin değilim.
Takma ad

@Pseudonym Benim durumumda. Bence biliyorum. Anlambilimciler ve algoritmacılar, özellikle hesaplanabilirlik üzerinde çalışanlar arasındaki eski savaş olduğundan şüpheleniyor. Felsefe ve iş arasındaki savaş, ne olduğu ve maliyeti nedir. "Anlamlı" algoritmalarla ilgileniyorum. Buna göre modifiye ettim (ama bilgimin sınırındayım, hala çoğundan daha iyi görünüyor). Aynı gettodan muzdarip olabilirsiniz. - - - Ancak. bu ince konuda, düşüncesi yarım yüz değerinde olan herhangi bir kimsenin, açıklama yapmadan aşağıya düşmeyi hayal etmeyeceği açıktır.
babou

Hem soruyu hem de cevabınızı okuduktan sonra, onu asıl soruya odaklamıyorum, çünkü asıl soruya yeterince odaklanmıyor ve çok fazla bitmemiş düşünce içeriyor. Ayrıca, bir algoritma tanımında "problem çözmenin" eksik kısmı olduğunu düşünmüyorum. Ancak bir algoritmayı neyin oluşturduğu tanımında "anlambilimin" göz ardı edilmemesi gerektiğine katılıyorum.
Thomas Klimpel

@ThomasKlimpel Dediğim gibi, gerçek konularda yeterince uzman değilim. Ve başka bir cevap olmadığını ekledim. Algoritmalar yapmak, ne olduklarını anlamakla aynı şey değildir. Gizlemenin bilimsel olmayacağı sınırlı bilgim hakkındaki farkındalığım, bu bitmemiş düşüncelerin kaynağı. Sorunun varlığının altını çizmek, onları görmezden gelmek daha iyi görünüyor. Her örnek, bir anlamsal pov'dan algoritmik olandan daha fazla, soru anlamsal bir sorudur ("... nedir?"). Diğer cevapların resmi bir anlayış getirdiğini düşünüyor musunuz? Cf yorumlarım
babou

0

Yazım sırasında "algoritmanın" resmi bir tanımı yoktur. Ancak, üzerinde çalışan akıllı insanlar var.

Bildiğimiz şey, bir "algoritma" ne olursa olsun, "matematiksel fonksiyon" ile "bilgisayar programı" arasında bir yerdedir.

Matematiksel bir fonksiyon, girdilerden çıktılara bir eşlemenin biçimsel kavramıdır. Örneğin, "sıralama", sıralanabilir öğelerin bir dizisi ile aynı türdeki sıralanabilir öğelerin bir dizisi arasındaki bir eşlemedir ve her diziyi sıralı diziye eşler. Bu işlev farklı algoritmalar (örn. Birleştirme sıralaması, yığın sıralaması) kullanılarak uygulanabilir. Her algoritma, farklı programlar (aynı programlama dili olsa bile) kullanılarak uygulanabilir.

Dolayısıyla, bir "algoritma" nın ne olduğu konusunda sahip olduğumuz en iyi işlem, "esas olarak aynı şeyi" yaparlarsa, iki programın eşdeğer olduğu programlarda bir çeşit denklik sınıfı olmasıdır. Aynı algoritmayı uygulayan iki program aynı işlevi hesaplamalıdır, ancak tersi doğru değildir.

Benzer şekilde, algoritmalar arasında bir denklik sınıfı vardır, burada aynı matematiksel işlevi hesaplarlarsa iki algoritma eşdeğerdir.

Tüm bunların zor kısmı, “aslında aynı şey” ile kastettiğimizi yakalamaya çalışıyor.

Eklememiz gereken bazı bariz şeyler var. Örneğin, iki program yalnızca değişken yeniden adlandırmalarından farklıysa, aslında aynıdır. Çoğu programlama dili modelinde doğal olarak "eşdeğerlik" (örn. Lambda hesabında beta azaltma ve eta dönüşümü) kavramları vardır, bu yüzden bunları da atmalıyız.

Hangi denklik ilişkisi seçersek seçelim, bu bize bir yapı kazandırır. Algoritmalar, programların bölüm kategorisi olmaları nedeniyle bir kategori oluştururlar. Bazı ilginç eşdeğer ilişkilerin ilginç kategorik yapılara yol açtığı bilinmektedir; örneğin, ilkel özyinelemeli algoritmalar kategorisi, kategoriler kategorisinde evrensel bir nesnedir. Böyle ilginç bir yapı gördüğünüzde, bu araştırma hattının muhtemelen yararlı olacağını bilirsiniz.


1
Bir algoritmanın iyi bir resmi tanımı olmadığını söylemenin adil olduğunu düşünmüyorum. Yaklaşık 100 yıl önce durum böyleydi.
Juho

1
@Juho Pseudonym'in kulağa çok güçlü gelmesine rağmen, özellikle durumun ilerleme kaydettiğini ekleyerek ifadeyi hafifletmeye çalışıyor olabilir. Ancak, değerlendirmesinde oldukça haklı olduğunu düşünüyorum. Geç tepki veriyorum çünkü buna çok zaman harcadım ve hemen hemen aynı hissediyorum. İnsanlar anlayışlarını önemli ölçüde geliştirdiler, ancak tüm tartışma gerçek bir fikir birliği olmadığını gösteriyor ... ve katılanların seviyesi göz önüne alındığında, katkıların çoğunu son derece olgunlaşmamış buldum. Eğer haksız ise, sizce kim iyi bir resmi tanım verdi?
babou

% 100 haklısın. Ve eğer Turing hayatta kalıyorsa veya karmaşıklık teorisindeki başka bir teorisyen olsaydı,% 100 sizinle aynı fikirde olacaktı. Akademisyenlerin troglodyizmizminden vazgeçmeleri gerekiyor. Aslında alanı engelliyor. Bu, sonunda öldükten sonra herhangi bir şekilde gerçekleşecektir. Bunun için tanrıya şükürler olsun.
EnjoysMath

-4

Sorunuz ve açıklamanız bu kadar alakalı değil. Algoritma teoriktir ve herhangi bir programlama dili ile ilgili değildir. Algoritma, bir sorunu çözmek için bir dizi kural veya adımdır (prosedür). Sorununuz birçok şekilde veya birçok algoritma ile çözülebilir.

İkinci çözümleriniz, önce çok zaman alacak ve sonra depolayacak çok sayıda faktöriyel hesaplamak anlamına gelir. Daha fazla depolama alanı tüketecek, ancak ilk olarak depolama alanı tüketmezken daha hızlı olacak, ancak bilgi işlem gücü tüketiyor, böylece ortamınıza bağlı olarak seçim yapmanız gerekecek.


Evet, kesinlikle bir ilişki yok. Çığır açan şeyler.
EnjoysMath
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.