1. 程式人生 > >二分法的時間複雜度求法

二分法的時間複雜度求法

int solve(int left, int right)
{
	if(left == right)
		return num[left];

	mid = (left + right) / 2;
	lans = solve(left, mid);
	rans = solve(mid + 1, right);

	sum = 0, lmax = num[mid], rmax = num[mid + 1];
	for(i = mid; i >= left; i--) {
		sum += num[i];
		if(sum > lmax) lmax = sum;
	}
	sum = 0;
	for(i = mid + 1; i <= right; i++) {
		sum += num[i];
		if(sum > rmax) rmax = sum;
	}

	ans = lmax + rmax;
	if(lans > ans) ans = lans;
	if(rans > ans) ans = rans;
	return ans;
}

int main(void)
{
	scanf("%d", &n);
	for(i = 1; i <= n; i++)
		scanf("%d", &num[i]);

	printf("%d\n", solve(1, n));
	return 0;
}

以上二分法的時間複雜度分析:
solve函式採用了二分法的思想,先走一遍分析一下:開頭將陣列一分為二,時間複雜度為T(n) = 2T(n/2);接下來分別從中間向左向右搜尋,時間複雜度為n,因此T(n) = 2T(n/2) + n;繼續向下迭代,T(n) = 2*(2T(n/4)+n/2)+n=22T(n/22)+2n;假設迭代了k次,則T(n) = 2^k T(n/2^k) + kn,最後又n/2^k = 1,得到k = log2n,帶入得T(n) = nT(1) + nlog2n。即nlog2n。

相關推薦

二分時間複雜求法

int solve(int left, int right) { if(left == right) return num[left]; mid = (left + right) / 2; lans = solve(left, mid); rans

二分查詢時間複雜的計算

二分查詢的基本思想是將n個元素分成大致相等的兩部分,去a[n/2]與x做比較,如果x=a[n/2],則找到x,演算法中止;如果x<a[n/2],則只要在陣列a的左半部分繼續搜尋x,如果x>a[n/2],則只要在陣列a的右半部搜尋x. 時間複雜度無非就是while迴圈的次數! 總共有n個元素, 漸

判斷一個數是不是素數 埃拉託斯特尼篩 時間複雜 O(n*lglgn)

說明: 素數的定義:質數(prime number)又稱素數。一個大於1的自然數,除了1和它本身外,不能被其他自然數整除,換句話說就是該數除了1和它本身以外不再有其他的因數;否則稱為合數。 最小的素數是2,最小的合數是4 方法一: 根據素數的定義,判斷數n是不是素數,我們

快速排序和二分查詢時間複雜詳解

快速排序的時間主要耗費在劃分操作上,對長度為 k 的區間進行劃分,共需 k-1 次關鍵字的比較。最壞時間複雜度:最壞情況是每次劃分選取的基準都是當前無序區中關鍵字最小(或最大)的記錄,劃分的結果是基準左邊的子區間為空(或右邊的子區間為空),而劃分所得的另一個非空的子區間中記錄數目,僅僅比劃分前的無序區中記錄個

二分查詢的迴圈與遞迴實現及時間複雜分析

設陣列為整數陣列,從小到大排序。二分法強調一定是要先排過序的。 迴圈實現二分法程式碼: #include <iostream> using namespace std; int binary_search(int *array,int low ,int hi

二分logn時間複雜解釋

二分法的關鍵思想是 假設該陣列的長度是N那麼二分後是N/2,再二分後是N/4……直到二分到1結束(當然這是屬於最壞的情況了,即每次找到的那個中點數都不是我們要找的),那麼二分的次數就是基本語句執行的次數,於是我們可以設次數為x,N*(1/2)^x=1;則x=

二分時間複雜+演算法的時間複雜計算

黃色標亮-劃重點背誦+自己的理解,綠色標亮-引用資源的連結,藍色標亮-要注意的地方 二分法查詢 的 時間複雜度計算 設 查詢資料的長度為n,每次查詢後資料長度減半,則有 查詢次數 資料長度 第1次查詢           n/2                      

系列-複雜分析:淺析最好、最壞、平均、均攤時間複雜

整理自極客時間-資料結構與演算法之美。原文內容更完整具體,且有音訊。購買地址: 上一節,我們講了複雜度的大 O 表示法和幾個分析技巧,還舉了一些常見覆雜度分析的例子,比如 O(1)、O(logn)、O(n)、O(nlogn) 複雜度分析。掌握了這些內容,對於複雜度分析這個知識點,你已經

二分搜尋的時間複雜O(logN)如何得到

轉自:http://yixiong89921.blog.163.com/blog/static/132537788201122105228637/ 學過資料結構,當然當年也學過演算法的時間複雜度的,不知道當年是不是會推倒時間複雜度,大概也就是根據基本語句的執行次數來獲得最高的數量級吧

資料結構與演算法--蠻力之氣泡排序與時間複雜分析(java)

蠻力法         蠻力法又稱窮舉法和列舉法,是一種簡單直接地解決問題的方法,常常直接基於問題的描述,所以蠻力法也是最容易應用的方法。但是蠻力法所設計的演算法時間特性往往是比較低的,典型的指數時間演算法一般都是通過蠻力

《Python 每日一學》之短路優化時間複雜

昨天在 Python 實戰交流群裡發起一個討論: 在如下這個常見的遍歷場景中,如何優化程式碼降低時間複雜度? def tips_everyday_example(): vector = ['

演算法的引入及時間複雜和大O表示

先來看一道題: 如果 a+b+c=1000,且 a^2+b^2=c^2(a,b,c 為自然數),如何求出所有a、b、c可能的組合? 第一次嘗試 import time start_time = time.time() # 注意是三重迴圈 for a in range(0, 100

二分查詢(折半查詢)演算法(原理、實現及時間複雜

查詢也是有特殊情況的,比如數列本身是有序的。這個有序數列是怎麼產生的呢?有時它可能本身就是有序的,也有可能是我們通過之前所學的排序演算法得到的。 不管怎麼說,我們現在已經得到了有序數列了並需要查詢。這時二分查詢該出場了。 二分查詢(Binary Search)也叫作折半查詢。二分查詢有兩個要求,一個是數列

並行排序演算法——時間複雜O(n)的排序

最近老師講了並行的排序演算法,讓我對這個原來不是很瞭解的排序演算法產生了濃厚的興趣。並行排序方法,是指採用平行計算的方法對一組資料進行排序,理論上是在類似內排序的環境下,採用多核並行的方法讓時間降低,排序的複雜度最好的情況下能降低至O(n)左右。 排序的實質

資料結構與演算法:時間複雜與大O表示

1、概念: 我們知道,時間複雜度和“大O表示法”是我們經常會碰到的概念,它們是用來衡量演算法優劣的度量,那具體怎麼算的呢?來看一下 2、引例 在丟擲概念之前,咱先來個例子: 如果 a+b+c=1000,且 a^2+b^2=c^2(a,b,c 為自然數),如何求出所有a、b

時間複雜與大O表示

相同的程式碼 對於每臺機器執行的總時間不同,但是執行的基本運算數量大體相同 我們假定計算機執行演算法每一個操作的時間都是固定的一個時間單位,那麼有多少個基本操作就會花費多少個時間單位。演算法對於不同的機器環境而言,確切的說單位時間是不同的,但是對於演算法進行多少個基本操作(就是花費多少時間單

演算法 二分查詢的時間複雜為O(log2N)的原因推理

由於二分查詢每次查詢都是從陣列中間切開查詢,所以每次查詢,剩餘的查詢數為上一次的一半,從下表可以清晰的看出查詢次數與剩餘元素數量對應關係 表-查詢次數及剩餘數 第幾次查詢 剩餘待查詢元素數量

二分查詢”演算法的時間複雜

演算法的時間複雜度無非就是for、while等包含起來的基本運算單元的迴圈次數 1、二分查詢 二分查詢(binary search),也稱作折半查詢(half-interval search),每次劃分一半進行下一步搜尋,所以時間複雜度無非就是wh

一個臺階總共有n級,如果一次可以跳1級,也可以跳2級。 求總共有多少總跳,並分析演算法的時間複雜

一個臺階總共有n級,如果一次可以跳1級,也可以跳2級。 求總共有多少總跳法,並分析演算法的時間複雜度。 設:總共有F(n)種跳法 那麼, F(1) = 1; F(2)= 2; F(

徹底輕鬆搞定順序儲存結構元素的二分查詢的時間複雜優勢以及如何算時間複雜

二分查詢也叫折半查詢,根據字面意思大概知道是怎麼個查詢具體一個元素的吧。 首先分析下查詢過程: 我們先通過被查詢的陣列得到該被查詢陣列的第一個索引和最後一個索引值,假如我們拿陣列10個元素來做例子 我們得到索引0和索引9 mid = (min(0)