Tidak, kode Anda memiliki kerumitan waktu O(2^|<DeltaTime>|)
,
Untuk pengkodean waktu yang tepat.
Tolong, izinkan saya meminta maaf terlebih dahulu untuk bahasa Inggris saya.
Apa itu dan bagaimana Big O bekerja di CS
Notasi Big O tidak digunakan untuk mengikat input program dengan waktu berjalannya .
Notasi O besar adalah, meninggalkan kekakuan, cara untuk mengekspresikan rasio asimtotik dua kuantitas .
Dalam kasus analisis algoritme, kedua kuantitas ini bukanlah input (yang pertama harus memiliki fungsi "ukur") dan waktu berjalan.
Mereka adalah panjang pengkodean sebuah instance dari masalah 1 dan metrik yang diminati.
Metrik yang umum digunakan adalah
- Jumlah langkah yang diperlukan untuk menyelesaikan algoritme dalam model komputasi tertentu.
- Ruang yang dibutuhkan, jika ada konsep seperti itu, oleh model komputasi.
Implisit diasumsikan TM sebagai model sehingga titik pertama diterjemahkan ke sejumlah aplikasi dari transisi 2 fungsi , yaitu "langkah", dan yang kedua diterjemahkan jumlah sel pita yang berbeda ditulis setidaknya sekali .
Apakah juga sering secara implisit diasumsikan bahwa kita dapat menggunakan pengkodean terkait polinomial daripada yang asli, misalnya fungsi yang mencari array dari awal hingga akhir memiliki O(n)
kompleksitas terlepas dari kenyataan bahwa pengkodean sebuah instance dari array tersebut harus memiliki panjang n*b+(n-1)
dimana b
adalah jumlah simbol (konstan) dari setiap elemen. Ini karena b
dianggap sebagai konstanta dari model komputasi sehingga ekspresi di atas dan n
secara asimtotik sama.
Ini juga menjelaskan mengapa algoritma seperti Trial Division adalah algoritma eksponensial meskipun pada dasarnya merupakan for(i=2; i<=sqr(N); i++)
algoritma 3 .
Lihat ini .
Ini juga berarti bahwa notasi O besar dapat menggunakan sebanyak mungkin parameter yang mungkin dibutuhkan seseorang untuk mendeskripsikan masalah, bukankah tidak biasa untuk memiliki parameter k untuk beberapa algoritme.
Jadi ini bukan tentang "masukan" atau "tidak ada masukan".
Pelajari kasus sekarang
Notasi Big O tidak mempertanyakan algoritme Anda, ini hanya mengasumsikan bahwa Anda tahu apa yang Anda lakukan. Ini pada dasarnya adalah alat yang dapat diterapkan di mana saja, bahkan untuk algoritme yang mungkin sengaja dibuat rumit (seperti milik Anda).
Untuk mengatasi masalah Anda, Anda menggunakan tanggal saat ini dan tanggal yang akan datang, jadi keduanya pasti menjadi bagian dari masalah; sederhananya: mereka adalah bagian dari contoh masalah.
Secara khusus contohnya adalah:
<DeltaTime>
Dimana <>
cara apapun, non patologis, pengkodean pilihan.
Lihat di bawah untuk klarifikasi yang sangat penting .
Jadi waktu kompleksitas O besar Anda adalah adil O(2^|<DeltaTime>|)
, karena Anda melakukan sejumlah iterasi yang bergantung pada nilai waktu saat ini. Tidak ada gunanya menempatkan konstanta numerik lain karena notasi asimtotik berguna karena menghilangkan konstanta (jadi misalnya penggunaan O(10^|<DeltaTime>|*any_time_unit)
tidak ada gunanya).
Dimana bagian yang sulit
Kami membuat satu asumsi penting di atas: bahwa model komputasi sertifikat 5 waktu, dan waktu yang saya maksud adalah waktu fisik (nyata?). Tidak ada konsep seperti itu dalam model komputasi standar, TM tidak tahu waktu, kami menghubungkan waktu dengan jumlah langkah karena beginilah cara kerja realitas kami 4 .
Dalam model Anda, bagaimanapun waktu adalah bagian dari perhitungan, Anda dapat menggunakan terminologi orang fungsional dengan mengatakan bahwa Utama tidak murni tetapi konsepnya sama.
Untuk memahami hal ini, perlu dicatat bahwa tidak ada yang menghalangi Framework untuk menggunakan waktu palsu yang berjalan dua kali, lima, sepuluh kali lebih cepat dari waktu fisik. Dengan cara ini kode Anda akan berjalan di "setengah", "seperlima", "sepersepuluh" dari "waktu".
Refleksi ini penting untuk memilih pengkodean <DeltaTime>
, ini pada dasarnya adalah cara penulisan yang ringkas <(CurrentTime, TimeInFuture)>. Karena waktu tidak ada di priorat, pengkodean CurrentTime bisa jadi kata Sekarang (atau pilihan lain) sehari sebelumnya dapat dikodekan sebagai Kemarin , di sana dengan melanggar asumsi bahwa panjang pengkodean bertambah sebagai waktu fisik maju (dan salah satu DeltaTime berkurang)
Kita harus memodelkan waktu dengan benar dalam model komputasi kita untuk melakukan sesuatu yang berguna.
Satu-satunya pilihan aman yang dapat kita lakukan adalah menyandikan stempel waktu dengan panjang yang bertambah (tetapi tetap tidak menggunakan unary) saat waktu fisik bergerak maju. Ini adalah satu-satunya properti sebenarnya dari waktu yang kita butuhkan dan properti yang perlu ditangkap oleh encoding. Apakah hanya dengan jenis pengkodean inilah algoritme Anda mungkin diberi kompleksitas waktu.
Kebingungan Anda, jika ada, muncul dari fakta bahwa kata waktu dalam frasa 'Apa kerumitan waktunya ?' dan 'Berapa lama waktu yang dibutuhkan?' Berarti untuk hal yang sangat berbeda
Sayangnya terminologi menggunakan kata yang sama, tetapi Anda dapat mencoba menggunakan "kerumitan langkah" di kepala Anda dan menanyakan kembali pertanyaan Anda pada diri sendiri, saya harap itu akan membantu Anda memahami jawabannya sebenarnya adalah ^ _ ^
1 Ini juga menjelaskan perlunya pendekatan asimtotik karena setiap instance memiliki panjang yang berbeda, namun tidak sewenang-wenang.
2 Saya harap saya menggunakan istilah bahasa Inggris yang benar di sini.
3 Juga inilah mengapa kita sering menemukan log(log(n))
istilah dalam matematika.
4 Id est, langkah harus menempati interval waktu yang terbatas, tetapi tidak null, atau tidak terhubung.
5 Ini berarti bahwa mode komputasi sebagai pengetahuan tentang waktu fisik di dalamnya, yang dapat mengekspresikannya dengan istilah-istilahnya. Sebuah analogi adalah bagaimana obat generik bekerja dalam kerangka .NET.
O(N)
bukan kompleksitasO(1)