Rumah pembangunan bahagian belakang Tutorial C#.Net 递归算法的时间复杂度是什么

递归算法的时间复杂度是什么

Oct 24, 2019 am 10:53 AM
kerumitan masa rekursi

递归算法的时间复杂度是:【T(n)=o(f(n))】,它表示随问题规模n的增大,算法的执行时间增长率和f(n)增长率成正比,这称作算法的渐进时间复杂度。

递归算法的时间复杂度是什么

递归算法的时间复杂度

时间复杂度: 

一般情况下,算法中基本操作重复的次数就是问题规模n的某个函数f(n),进而分析f(n)随n的变化情况并确定T(n)的数量级。这里用‘o’来表示数量级,给出算法时间复杂度。 

T(n)=o(f(n)); 

它表示随问题规模n的增大,算法的执行时间增长率和f(n)增长率成正比,这称作算法的渐进时间复杂度。而我们一般情况下讨论的最坏的时间复杂度。 

推荐课程:C语言教程

空间复杂度: 

算法的空间复杂度并不是实际占用的空间,而是计算整个算法空间辅助空间单元的个数,与问题的规模没有关系。算法的空间复杂度S(n)定义为该算法所耗费空间的数量级。 

S(n)=o(f(n)) 

若算法执行所需要的辅助空间相对于输入数据n而言是一个常数,则称这个算法空间复杂度辅助空间为o(1); 

递归算法空间复杂度:递归深度n*每次递归所要的辅助空间,如果每次递归所需要的辅助空间为常数,则递归空间复杂度o(n)。

递归算法时间复杂度的计算方程式是一个递归方程:

1.jpg

在引入递归树之前可以考虑一个例子:

T(n) = 2T(n/2) + n2
Salin selepas log masuk

迭代2次可以得:

T(n) = n2 + 2(2T(n/4) + (n/2) 2)
Salin selepas log masuk

还可以继续迭代,将其完全展开可得:

T(n) = n2 + 2((n/2) 2 +
2((n/22)2 + 2((n/23) 2 +
2((n/24) 2 +…+2((n/2i) 2 +
2T(n/2i + 1)))…))))……(1)
Salin selepas log masuk

而当n/2i+1 == 1时,迭代结束。

将(1)式小括号展开,可得:

T(n) = n2 + 2(n/2)2 +
22(n/22) 2 + … + 2i(n/2i)2 +
2i+1T(n/2i+1)
Salin selepas log masuk

这恰好是一个树形结构,由此可引出递归树法。

2.gif

图中的(a)(b)(c)(d)分别是递归树生成的第1,2,3,n步。每一节点中都将当前的自由项n2留在其中,而将两个递归项T(n/2)
+ T(n/2)分别摊给了他的两个子节点,如此循环。

图中所有节点之和为:

[1 + 1/2 + (1/2)2 + (1/2)3 + … + (1/2)i] n2 = 2n2
Salin selepas log masuk

可知其时间复杂度为O(n2)

可以得到递归树的规则为:

(1)每层的节点为T(n) = kT(n / m) + f(n)中的f(n)在当前的n/m下的值;

(2)每个节点的分支数为k;

(3)每层的右侧标出当前层中所有节点的和。

再举个例子:

T(n) = T(n/3) + T(2n/3) + n

其递归树如下图所示:

3.gif

可见每层的值都为n,从根到叶节点的最长路径是:

因为最后递归的停止是在(2/3)kn == 1.则

于是  

20130514191544549.gif

T(n) = O(nlogn) 

总结,利用此方法解递归算法复杂度:

f(n) = af(n/b) + d(n)
Salin selepas log masuk

1.当d(n)为常数时:

  4.jpg

2.当d(n) = cn 时:

  5.jpg

3.当d(n)为其他情况时可用递归树进行分析。

由第二种情况知,若采用分治法对原算法进行改进,则着重点是采用新的计算方法缩小a值。  

Atas ialah kandungan terperinci 递归算法的时间复杂度是什么. 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)
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌
Akan R.E.P.O. Ada Crossplay?
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)

Pelaksanaan rekursif fungsi C++: Adakah terdapat had untuk kedalaman rekursif? Pelaksanaan rekursif fungsi C++: Adakah terdapat had untuk kedalaman rekursif? Apr 23, 2024 am 09:30 AM

Kedalaman rekursi fungsi C++ adalah terhad, dan melebihi had ini akan mengakibatkan ralat limpahan tindanan. Nilai had berbeza antara sistem dan penyusun, tetapi biasanya antara 1,000 dan 10,000. Penyelesaian termasuk: 1. Pengoptimuman rekursi ekor; 2. Panggilan ekor;

Adakah ungkapan lambda C++ menyokong rekursi? Adakah ungkapan lambda C++ menyokong rekursi? Apr 17, 2024 pm 09:06 PM

Ya, ungkapan Lambda C++ boleh menyokong rekursi dengan menggunakan std::function: Gunakan std::function untuk menangkap rujukan kepada ungkapan Lambda. Dengan rujukan yang ditangkap, ungkapan Lambda boleh memanggil dirinya secara rekursif.

Pelaksanaan rekursif fungsi C++: Analisis perbandingan algoritma rekursif dan bukan rekursif? Pelaksanaan rekursif fungsi C++: Analisis perbandingan algoritma rekursif dan bukan rekursif? Apr 22, 2024 pm 03:18 PM

Algoritma rekursif menyelesaikan masalah berstruktur melalui fungsi panggilan kendiri Kelebihannya ialah ia mudah dan mudah difahami, tetapi kelemahannya ialah ia kurang cekap dan boleh menyebabkan limpahan timbunan Algoritma bukan rekursif mengelakkan pengulangan dengan menguruskan secara eksplisit struktur data timbunan Kelebihannya ialah ia lebih cekap dan mengelakkan limpahan, kelemahannya ialah kod itu mungkin lebih kompleks. Pilihan rekursif atau bukan rekursif bergantung kepada masalah dan kekangan khusus pelaksanaan.

Kira bilangan kejadian subrentetan secara rekursif dalam Java Kira bilangan kejadian subrentetan secara rekursif dalam Java Sep 17, 2023 pm 07:49 PM

Diberi dua rentetan str_1 dan str_2. Matlamatnya adalah untuk mengira bilangan kejadian subrentetan str2 dalam rentetan str1 menggunakan prosedur rekursif. Fungsi rekursif ialah fungsi yang memanggil dirinya dalam definisinya. Jika str1 ialah "Iknowthatyouknowthatiknow" dan str2 ialah "tahu" bilangan kejadian ialah -3 Mari kita fahami melalui contoh. Contohnya, input str1="TPisTPareTPamTP", str2="TP";

Program rekursif untuk mencari elemen minimum dan maksimum tatasusunan dalam C++ Program rekursif untuk mencari elemen minimum dan maksimum tatasusunan dalam C++ Aug 31, 2023 pm 07:37 PM

Kami mengambil tatasusunan integer Arr[] sebagai input. Matlamatnya adalah untuk mencari elemen terbesar dan terkecil dalam tatasusunan menggunakan kaedah rekursif. Memandangkan kami menggunakan rekursi, kami akan mengulangi keseluruhan tatasusunan sehingga kami mencapai panjang = 1 dan kemudian mengembalikan A[0], yang membentuk huruf asas. Jika tidak, elemen semasa dibandingkan dengan nilai minimum atau maksimum semasa dan nilainya dikemas kini secara rekursif untuk elemen berikutnya. Mari kita lihat pelbagai senario input dan output untuk −Input −Arr={12,67,99,76,32}; Nilai maksimum dalam tatasusunan: 99 Penjelasan &mi

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).

Penjelasan terperinci tentang rekursi fungsi C++: aplikasi rekursi dalam pemprosesan rentetan Penjelasan terperinci tentang rekursi fungsi C++: aplikasi rekursi dalam pemprosesan rentetan Apr 30, 2024 am 10:30 AM

Fungsi rekursif ialah teknik yang memanggil dirinya berulang kali untuk menyelesaikan masalah dalam pemprosesan rentetan. Ia memerlukan syarat penamatan untuk mengelakkan rekursi tak terhingga. Rekursi digunakan secara meluas dalam operasi seperti pembalikan rentetan dan pemeriksaan palindrom.

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

See all articles