Jadual Kandungan
1. Kerumitan masa
二、空间复杂度
Rumah hujung hadapan web tutorial js Artikel untuk membincangkan tentang kerumitan masa dan kerumitan ruang bagi algoritma

Artikel untuk membincangkan tentang kerumitan masa dan kerumitan ruang bagi algoritma

Mar 04, 2022 pm 03:45 PM
kerumitan masa kerumitan ruang algoritma

Artikel ini akan mempelajari tentang algoritma dan memperkenalkan kerumitan masa dan kerumitan ruang bagi algoritma ini.

Artikel untuk membincangkan tentang kerumitan masa dan kerumitan ruang bagi algoritma

Algoritma merujuk kepada satu set kaedah yang digunakan untuk memanipulasi data dan menyelesaikan masalah program. Untuk masalah yang sama, menggunakan algoritma yang berbeza, hasil akhir mungkin sama, tetapi sumber dan masa yang digunakan dalam proses akan sangat berbeza.

Jadi bagaimana kita harus mengukur kebaikan dan keburukan algoritma yang berbeza?

Pertimbangkan terutamanya daripada dua dimensi "masa" dan "ruang" yang diduduki oleh algoritma.

  • Dimensi masa: merujuk kepada masa yang digunakan dalam melaksanakan algoritma semasa Kami biasanya menggunakan "kerumitan masa" untuk menerangkannya.

  • Dimensi ruang: merujuk kepada jumlah ruang memori yang diperlukan untuk melaksanakan algoritma semasa Kami biasanya menggunakan "kerumitan ruang" untuk menerangkannya.

Oleh itu, menilai kecekapan algoritma bergantung terutamanya pada kerumitan masa dan kerumitan ruangnya. Walau bagaimanapun, kadangkala masa dan ruang ialah "sediakan kek anda dan makan juga," dan anda tidak boleh memiliki kedua-duanya, jadi kami perlu mencari titik keseimbangan.

Izinkan saya memperkenalkan kaedah pengiraan "kerumitan masa" dan "kerumitan ruang" masing-masing.

1. Kerumitan masa

Kami ingin mengetahui "kerumitan masa" sesuatu algoritma Cara pertama yang difikirkan oleh ramai orang ialah menjalankan program algoritma sekali Masa akan datang secara semula jadi.

Adakah ini mungkin? Sudah tentu anda boleh, tetapi ia juga mempunyai banyak kelemahan.

Kaedah ini sangat terdedah kepada pengaruh persekitaran operasi Hasil yang dijalankan pada mesin berprestasi tinggi akan sangat berbeza daripada hasil yang dijalankan pada mesin berprestasi rendah. Dan ia juga mempunyai banyak kaitan dengan skala data yang digunakan dalam ujian. Tambahan pula, apabila kami menulis algoritma, kami masih tidak mempunyai cara untuk menjalankannya sepenuhnya.

Oleh itu, satu lagi kaedah yang lebih umum telah keluar: " Tatatanda O Besar ", iaitu, T(n) = O(f(n))

Mari kita lihat pada contoh dahulu:

for(i=1; i<=n; ++i)
{
   j = i;
   j++;
}
Salin selepas log masuk
Salin selepas log masuk

Menggunakan "notasi O Besar", kerumitan masa kod ini ialah: O(n), kenapa ?

Dalam Notasi O Besar, formula untuk kerumitan masa ialah: T(n) = O( f(n) ), di mana f(n) mewakili jumlah bilangan pelaksanaan setiap baris kod, dan O mewakili hubungan berkadar. Nama penuh formula ini ialah: Kerumitan masa asimptotik algoritma.

Mari kita teruskan melihat contoh di atas Andaikan bahawa masa pelaksanaan setiap baris kod adalah sama Kami menggunakan 1 masa partikel untuk menyatakannya. dan baris ketiga kod mengambil masa 1 zarah Masa pelaksanaan baris ialah n masa berbutir, dan masa pelaksanaan baris keempat juga adalah masa berbutir (baris kedua dan kelima ialah simbol, abaikan mereka buat masa ini), maka jumlah masa ialah 1 masa berbutir n masa berbutir n masa berbutir, iaitu (1 2n) masa zarah, iaitu: T(n) = (1 2n)*masa zarah penggunaan algoritma ini berubah dengan perubahan n Oleh itu, kita boleh memudahkan Ungkapkan kerumitan masa algoritma ini sebagai: T(n) = O(n)

Mengapa ia boleh dipermudahkan dengan cara ini? notasi O besar tidak digunakan untuk benar-benar mewakili masa pelaksanaan algoritma , yang digunakan untuk mewakili trend pertumbuhan masa pelaksanaan kod.

Jadi dalam contoh di atas, jika n adalah tak terhingga, pemalar 1 dalam T(n) = masa(1 2n) adalah tidak bermakna, dan gandaan 2 juga tidak bermakna. Oleh itu ia boleh dipermudahkan kepada T(n) = O(n).

Metrik kerumitan masa biasa ialah:

  • Tertib malar O(1)

  • Tertib logaritma O(logN )

  • Tertib linear O(n)

  • Tertib logaritma linear O(nlogN)

  • Tertib segi empat sama O (n²)

  • Pesanan kubik O(n³)

  • K order O(n^k)

  • Tertib eksponen (2^n)

Kerumitan masa dari atas ke bawah semakin lama semakin besar, dan kecekapan pelaksanaan semakin rendah .

Yang berikut memilih beberapa yang lebih biasa digunakan untuk diterangkan (tidak mengikut urutan yang ketat):

  • Pesanan tetap O(1)

Tidak kira berapa banyak baris kod yang dilaksanakan, selagi tiada struktur kompleks seperti gelung, kerumitan masa kod ini akan menjadi O(1 ), seperti:

int i = 1;
int j = 2;
++i;
j++;
int m = i + j;
Salin selepas log masuk
Salin selepas log masuk

Apabila kod di atas dilaksanakan, penggunaannya tidak meningkat dengan pertumbuhan pembolehubah tertentu, jadi tidak kira berapa lama jenis kod ini, walaupun ia berpuluh-puluh. daripada beribu-ribu atau ratusan ribu baris, O(boleh digunakan 1) untuk menyatakan kerumitan masanya.

  • Linear order O(n)

Ini adalah dalam contoh kod awal I telah menjelaskannya, seperti:

for(i=1; i<=n; ++i)
{
   j = i;
   j++;
}
Salin selepas log masuk
Salin selepas log masuk

Kod ini, kod dalam gelung for akan dilaksanakan sebanyak n kali, jadi masa yang digunakan berubah dengan perubahan n, jadi kod jenis ini Its kerumitan masa boleh dinyatakan sebagai O(n).

  • Tertib logaritma O(logN)

Mari lihat kod dahulu:

int i = 1;
while(i<n)
{
    i = i * 2;
}
Salin selepas log masuk

从上面代码可以看到,在while循环里面,每次都将 i 乘以 2,乘完之后,i 距离 n 就越来越近了。我们试着求解一下,假设循环x次之后,i 就大于 2 了,此时这个循环就退出了,也就是说 2 的 x 次方等于 n,那么 x = log2^n

也就是说当循环 log2^n 次以后,这个代码就结束了。因此这个代码的时间复杂度为:O(logn)

  • 线性对数阶O(nlogN)

线性对数阶O(nlogN) 其实非常容易理解,将时间复杂度为O(logn)的代码循环N遍的话,那么它的时间复杂度就是 n * O(logN),也就是了O(nlogN)。

就拿上面的代码加一点修改来举例:

for(m=1; m<n; m++)
{
    i = 1;
    while(i<n)
    {
        i = i * 2;
    }
}
Salin selepas log masuk
  • 平方阶O(n²)

平方阶O(n²) 就更容易理解了,如果把 O(n) 的代码再嵌套循环一遍,它的时间复杂度就是 O(n²) 了。

举例:

for(x=1; i<=n; x++)
{
   for(i=1; i<=n; i++)
    {
       j = i;
       j++;
    }
}
Salin selepas log masuk

这段代码其实就是嵌套了2层n循环,它的时间复杂度就是 O(n*n),即 O(n²)

如果将其中一层循环的n改成m,即:

for(x=1; i<=m; x++)
{
   for(i=1; i<=n; i++)
    {
       j = i;
       j++;
    }
}
Salin selepas log masuk

那它的时间复杂度就变成了 O(m*n)

  • 立方阶O(n³)、K次方阶O(n^k)

参考上面的O(n²) 去理解就好了,O(n³)相当于三层n循环,其它的类似。

除此之外,其实还有 平均时间复杂度、均摊时间复杂度、最坏时间复杂度、最好时间复杂度 的分析方法,有点复杂,这里就不展开了。

二、空间复杂度

既然时间复杂度不是用来计算程序具体耗时的,那么我也应该明白,空间复杂度也不是用来计算程序实际占用的空间的。

空间复杂度是对一个算法在运行过程中临时占用存储空间大小的一个量度,同样反映的是一个趋势,我们用 S(n) 来定义。

空间复杂度比较常用的有:O(1)、O(n)、O(n²),我们下面来看看:

  • 空间复杂度 O(1)

如果算法执行所需要的临时空间不随着某个变量n的大小而变化,即此算法空间复杂度为一个常量,可表示为 O(1)

举例:

int i = 1;
int j = 2;
++i;
j++;
int m = i + j;
Salin selepas log masuk
Salin selepas log masuk

代码中的 i、j、m 所分配的空间都不随着处理数据量变化,因此它的空间复杂度 S(n) = O(1)

  • 空间复杂度 O(n)

我们先看一个代码:

int[] m = new int[n]
for(i=1; i<=n; ++i)
{
   j = i;
   j++;
}
Salin selepas log masuk

这段代码中,第一行new了一个数组出来,这个数据占用的大小为n,这段代码的2-6行,虽然有循环,但没有再分配新的空间,因此,这段代码的空间复杂度主要看第一行即可,即 S(n) = O(n)

以上,就是对算法的时间复杂度与空间复杂度基础的分析,欢迎大家一起交流。

更多算法相关知识,请访问:编程入门!!

Atas ialah kandungan terperinci Artikel untuk membincangkan tentang kerumitan masa dan kerumitan ruang bagi algoritma. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Cara Membuka Segala -galanya Di Myrise
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

CLIP-BEVFormer: Selia secara eksplisit struktur BEVFormer untuk meningkatkan prestasi pengesanan ekor panjang CLIP-BEVFormer: Selia secara eksplisit struktur BEVFormer untuk meningkatkan prestasi pengesanan ekor panjang Mar 26, 2024 pm 12:41 PM

Ditulis di atas & pemahaman peribadi penulis: Pada masa ini, dalam keseluruhan sistem pemanduan autonomi, modul persepsi memainkan peranan penting Hanya selepas kenderaan pemanduan autonomi yang memandu di jalan raya memperoleh keputusan persepsi yang tepat melalui modul persepsi boleh Peraturan hiliran dan. modul kawalan dalam sistem pemanduan autonomi membuat pertimbangan dan keputusan tingkah laku yang tepat pada masanya dan betul. Pada masa ini, kereta dengan fungsi pemanduan autonomi biasanya dilengkapi dengan pelbagai penderia maklumat data termasuk penderia kamera pandangan sekeliling, penderia lidar dan penderia radar gelombang milimeter untuk mengumpul maklumat dalam modaliti yang berbeza untuk mencapai tugas persepsi yang tepat. Algoritma persepsi BEV berdasarkan penglihatan tulen digemari oleh industri kerana kos perkakasannya yang rendah dan penggunaan mudah, dan hasil keluarannya boleh digunakan dengan mudah untuk pelbagai tugas hiliran.

Melaksanakan Algoritma Pembelajaran Mesin dalam C++: Cabaran dan Penyelesaian Biasa Melaksanakan Algoritma Pembelajaran Mesin dalam C++: Cabaran dan Penyelesaian Biasa Jun 03, 2024 pm 01:25 PM

Cabaran biasa yang dihadapi oleh algoritma pembelajaran mesin dalam C++ termasuk pengurusan memori, multi-threading, pengoptimuman prestasi dan kebolehselenggaraan. Penyelesaian termasuk menggunakan penunjuk pintar, perpustakaan benang moden, arahan SIMD dan perpustakaan pihak ketiga, serta mengikuti garis panduan gaya pengekodan dan menggunakan alat automasi. Kes praktikal menunjukkan cara menggunakan perpustakaan Eigen untuk melaksanakan algoritma regresi linear, mengurus memori dengan berkesan dan menggunakan operasi matriks berprestasi tinggi.

Terokai prinsip asas dan pemilihan algoritma bagi fungsi isihan C++ Terokai prinsip asas dan pemilihan algoritma bagi fungsi isihan C++ Apr 02, 2024 pm 05:36 PM

Lapisan bawah fungsi C++ sort menggunakan isihan gabungan, kerumitannya ialah O(nlogn), dan menyediakan pilihan algoritma pengisihan yang berbeza, termasuk isihan pantas, isihan timbunan dan isihan stabil.

Bolehkah kecerdasan buatan meramalkan jenayah? Terokai keupayaan CrimeGPT Bolehkah kecerdasan buatan meramalkan jenayah? Terokai keupayaan CrimeGPT Mar 22, 2024 pm 10:10 PM

Konvergensi kecerdasan buatan (AI) dan penguatkuasaan undang-undang membuka kemungkinan baharu untuk pencegahan dan pengesanan jenayah. Keupayaan ramalan kecerdasan buatan digunakan secara meluas dalam sistem seperti CrimeGPT (Teknologi Ramalan Jenayah) untuk meramal aktiviti jenayah. Artikel ini meneroka potensi kecerdasan buatan dalam ramalan jenayah, aplikasi semasanya, cabaran yang dihadapinya dan kemungkinan implikasi etika teknologi tersebut. Kecerdasan Buatan dan Ramalan Jenayah: Asas CrimeGPT menggunakan algoritma pembelajaran mesin untuk menganalisis set data yang besar, mengenal pasti corak yang boleh meramalkan di mana dan bila jenayah mungkin berlaku. Set data ini termasuk statistik jenayah sejarah, maklumat demografi, penunjuk ekonomi, corak cuaca dan banyak lagi. Dengan mengenal pasti trend yang mungkin terlepas oleh penganalisis manusia, kecerdasan buatan boleh memperkasakan agensi penguatkuasaan undang-undang

Algoritma pengesanan yang dipertingkatkan: untuk pengesanan sasaran dalam imej penderiaan jauh optik resolusi tinggi Algoritma pengesanan yang dipertingkatkan: untuk pengesanan sasaran dalam imej penderiaan jauh optik resolusi tinggi Jun 06, 2024 pm 12:33 PM

01Garis prospek Pada masa ini, sukar untuk mencapai keseimbangan yang sesuai antara kecekapan pengesanan dan hasil pengesanan. Kami telah membangunkan algoritma YOLOv5 yang dipertingkatkan untuk pengesanan sasaran dalam imej penderiaan jauh optik resolusi tinggi, menggunakan piramid ciri berbilang lapisan, strategi kepala pengesanan berbilang dan modul perhatian hibrid untuk meningkatkan kesan rangkaian pengesanan sasaran dalam imej penderiaan jauh optik. Menurut set data SIMD, peta algoritma baharu adalah 2.2% lebih baik daripada YOLOv5 dan 8.48% lebih baik daripada YOLOX, mencapai keseimbangan yang lebih baik antara hasil pengesanan dan kelajuan. 02 Latar Belakang & Motivasi Dengan perkembangan pesat teknologi penderiaan jauh, imej penderiaan jauh optik resolusi tinggi telah digunakan untuk menggambarkan banyak objek di permukaan bumi, termasuk pesawat, kereta, bangunan, dll. Pengesanan objek dalam tafsiran imej penderiaan jauh

Bagaimana untuk menganalisis kerumitan masa fungsi rekursif C++? Bagaimana untuk menganalisis kerumitan masa fungsi rekursif C++? Apr 17, 2024 pm 03:09 PM

Analisis kerumitan masa bagi fungsi rekursif melibatkan: mengenal pasti kes asas dan panggilan rekursif. Kira kerumitan masa bagi huruf asas dan setiap panggilan rekursif. Jumlahkan kerumitan masa semua panggilan rekursif. Pertimbangkan hubungan antara bilangan panggilan fungsi dan saiz masalah. Contohnya, kerumitan masa bagi fungsi faktorial ialah O(n) kerana setiap panggilan rekursif meningkatkan kedalaman rekursi sebanyak 1, memberikan jumlah kedalaman O(n).

Bagaimana untuk menangani isu kerumitan masa dalam fungsi PHP? Bagaimana untuk menangani isu kerumitan masa dalam fungsi PHP? Apr 26, 2024 pm 02:12 PM

Kerumitan masa ialah ukuran berapa lama fungsi yang diambil untuk dilaksanakan. Masalah kerumitan masa fungsi PHP biasa termasuk gelung bersarang, traversal tatasusunan besar dan panggilan rekursif. Teknik untuk mengoptimumkan kerumitan masa termasuk: menggunakan caching untuk mengurangkan bilangan gelung memudahkan algoritma menggunakan pemprosesan selari

Aplikasi algoritma dalam pembinaan 58 platform potret Aplikasi algoritma dalam pembinaan 58 platform potret May 09, 2024 am 09:01 AM

1. Latar Belakang Pembinaan 58 Portrait Platform Pertama sekali, saya ingin berkongsi dengan anda latar belakang pembinaan 58 Portrait Platform. 1. Pemikiran tradisional platform pemprofilan tradisional tidak lagi mencukupi Membina platform pemprofilan pengguna bergantung pada keupayaan pemodelan gudang data untuk menyepadukan data daripada pelbagai barisan perniagaan untuk membina potret pengguna yang tepat untuk memahami tingkah laku, minat pengguna dan keperluan, dan menyediakan keupayaan sampingan, akhirnya, ia juga perlu mempunyai keupayaan platform data untuk menyimpan, bertanya dan berkongsi data profil pengguna dan menyediakan perkhidmatan profil dengan cekap. Perbezaan utama antara platform pemprofilan perniagaan binaan sendiri dan platform pemprofilan pejabat pertengahan ialah platform pemprofilan binaan sendiri menyediakan satu barisan perniagaan dan boleh disesuaikan atas permintaan platform pertengahan pejabat berkhidmat berbilang barisan perniagaan, mempunyai kompleks pemodelan, dan menyediakan lebih banyak keupayaan umum. 2.58 Potret pengguna latar belakang pembinaan potret di platform tengah 58

See all articles