Hayır, kodunuzun zaman karmaşıklığı var O(2^|<DeltaTime>|)
,
Geçerli zamanın doğru bir şekilde kodlanması için.
Lütfen önce İngilizcem için özür dilememe izin verin.
Big O nedir ve CS'de nasıl çalışır?
Büyük O gösterimi , bir programın girişini çalışma süresine bağlamak için kullanılmaz .
Büyük O notasyonu, titizliği geride bırakarak , iki miktarın asimptotik oranını ifade etmenin bir yoludur. .
Algoritma analiz durumunda, bu iki miktardır olmayan girişi (bunun için bir birinci, bir "ölçü" fonksiyonu olması gerekir) ve akış süresi.
Problem 1'in bir örneğinin kodlama uzunluğu ve ilgili bir metriktir.
Yaygın olarak kullanılan metrikler
- Belirli bir hesaplama modelinde algoritmayı tamamlamak için gereken adım sayısı.
- Böyle bir kavram varsa, hesaplama modelinin gerektirdiği alan.
Örtük olarak, model olarak bir TM varsayılır, böylece ilk nokta , geçiş 2 işlevinin uygulama sayısına , yani "adımlar" olarak çevrilir ve ikincisi, en az bir kez yazılmış farklı bant hücrelerinin sayısını çevirir .
Orijinal kodlama yerine polinomik olarak ilişkili bir kodlama kullanabileceğimizi de genellikle örtük olarak varsayılır mı? Örneğin, baştan sona bir diziyi arayan bir işlev O(n)
, böyle bir dizinin bir örneğinin kodlamasının, her bir elemanın (sabit) sembol sayısı n*b+(n-1)
nerede b
. Bunun nedeni b
, hesaplama modelinin bir sabiti olarak kabul edilmesidir ve bu nedenle yukarıdaki ven
asimptotik olarak aynı olmasıdır.
Gibi bir algoritma nedeni de açıklıyor Deneme Bölümü bir olan üstel algoritma aslında bir olmasına rağmen for(i=2; i<=sqr(N); i++)
algoritma gibi 3 .
Bunu gör .
Bu aynı zamanda, büyük O notasyonunun, problemi tanımlamak için ihtiyaç duyulabilecek birçok parametreyi kullanabileceği anlamına gelir, bir k'ye sahip olmak alışılmadık bir durum değil mi? bazı algoritmalar için parametresine .
Yani bu değil "giriş" hakkında veya "herhangi bir giriş".
Şimdi çalışma vakası
Büyük O notasyonu algoritmanızı sorgulamaz, sadece ne yaptığınızı bildiğinizi varsayar. Aslında, kasıtlı olarak zor olabilecek (sizinki gibi) algoritmaya bile her yerde uygulanabilen bir araçtır.
Sorununuzu çözmek için şimdiki tarihi ve gelecekteki bir tarihi kullandınız, bu nedenle bunlar bir şekilde sorunun bir parçası olmalı; basitçe söylemek gerekirse: problemin bir parçasıdırlar.
Örnek özellikle şudur:
<DeltaTime>
Nerede olursa <>
olsun, patolojik olmayan, kodlama seçimi.
Çok önemli açıklamalar için aşağıya bakın .
Yani sizin büyük O karmaşıklık zamanınız sadece O(2^|<DeltaTime>|)
, şu anki zamanın değerine bağlı bir dizi yineleme yaptığınız için. Asimptotik gösterim sabitleri ortadan kaldırdığı için yararlı olduğu için diğer sayısal sabitleri koymanın bir anlamı yoktur (yani örneğin kullanımı O(10^|<DeltaTime>|*any_time_unit)
anlamsızdır).
Zor kısım nerede
Yukarıda önemli bir varsayımda bulunduk: hesaplama modelinin 5 zamanı ve zamanla (gerçek?) Fiziksel zamanı kastettiği. Standart hesaplama modelinde böyle bir kavram yoktur, bir TM zamanı bilmez, zamanı adım sayısı ile ilişkilendiririz çünkü bizim gerçekliğimiz böyle çalışır 4 .
Sizin modelinizde zaman, hesaplamanın bir parçası olsa da, Main'in saf olmadığını ancak kavramın aynı olduğunu söyleyerek işlevsel insanların terminolojisini kullanabilirsiniz.
Bunu anlamak için, Çerçeve'nin fiziksel süreden iki, beş, on kat daha hızlı çalışan sahte bir zamanı kullanmasına hiçbir şeyin engel olmadığına dikkat edilmelidir. Bu şekilde kodunuz "zamanın" "yarısında", "beşte birinde", "onda birinde" çalışacaktır.
Bu yansıma, kodlamasını seçmek için önemlidir <DeltaTime>
, bu aslında <(CurrentTime, TimeInFuture)> yazmanın yoğunlaştırılmış bir yoludur. Önceden zaman olmadığından, CurrentTime kodlaması çok iyi bir şekilde Şimdi kelimesi (veya başka bir seçenek) olabilir, önceki gün Dün olarak kodlanabilirdi , burada kodlamanın uzunluğunun arttığı varsayımı kırılarak fiziksel zaman olarak ileri gider (ve DeltaTime'dan biri azalır)
Yararlı bir şey yapabilmek için hesaplama modelimizde zamanı doğru şekilde modellemeliyiz.
Yapabileceğimiz tek güvenli seçenek, fiziksel zaman ilerledikçe zaman damgalarını artan uzunluklarla (ancak tekli kullanmadan) kodlamaktır. Bu, ihtiyacımız olan ve kodlamanın yakalaması gereken tek gerçek zaman özelliğidir. Sadece bu tür bir kodlamayla mı, algoritmanıza bir zaman karmaşıklığı verilebilir.
Kafanızın karışması, varsa, ' Zaman karmaşıklığı nedir?' İfadelerindeki zaman kelimesinin olmasından kaynaklanmaktadır. ve 'Ne kadar zaman alacak?' çok çok farklı şeyler anlamına gelir
Ne yazık ki terminoloji aynı kelimeleri kullanıyor, ancak kafanızda "karmaşıklık adımları" kullanmayı deneyebilir ve sorunuzu kendinize yeniden sorabilirsiniz, umarım bu, cevabın gerçekten ^ _ ^ olduğunu anlamanıza yardımcı olur
1 Bu aynı zamanda, her bir örnek farklı, ancak keyfi olmayan bir uzunluğa sahip olduğundan, asimptotik bir yaklaşım ihtiyacını da açıklar.
2 Umarım burada doğru İngilizce terimi kullanıyorum.
3 Ayrıca log(log(n))
matematikte sık sık terim bulmamızın nedeni de budur .
4 İd est, bir adım belirli bir zaman aralığını işgal etmeli, ancak boş veya bağlantılı olmamalıdır.
5 Bu, hesaplama kipinin içindeki fiziksel zaman bilgisi olarak, yani onu kendi terimleriyle ifade edebileceği anlamına gelir. .NET çerçevesinde jeneriklerin nasıl çalıştığına bir benzetme var.
O(N)
karmaşıklık değilO(1)