大剑无锋之二分搜索、二分搜索时间复杂度、三分查找呢?
?
題目:搜索
(1)請(qǐng)寫出Java代碼,實(shí)現(xiàn)二分搜索(給定一個(gè)按升序排列的數(shù)組和一個(gè)要查找的值,返回該值在數(shù)組中的index)
(2)說(shuō)明該算法時(shí)間復(fù)雜度
(3)如果改成三分搜索,時(shí)間復(fù)雜度將會(huì)是多少?說(shuō)明與二分搜索相比較是提升還是降低。
解答:
(1)
package ddd; /*** @author George* @description ? 二分搜索* 算法要求:* 1.必須采用順序存儲(chǔ)結(jié)構(gòu)。* 2.必須按關(guān)鍵字大小有序排列。**/ public class BinarySearch {public static void main(String[] args) {int[] nums = {1,2,3,4,5,6,7,8,9};System.out.println(search(nums, 2));}public static int search(int[] nums,int key){//定義初始最小、最大索引int start = 0;int end = nums.length - 1;//確保不會(huì)出現(xiàn)重復(fù)查找,越界while (start <= end) {//計(jì)算出中間索引值int middle = (end + start)>>>1 ;//防止溢出if (key == nums[middle]) {return middle;//判斷下限} else if (key < nums[middle]) {end = middle - 1;//判斷上限} else {start = middle + 1;}}//若沒(méi)有,則返回-1return -1;} }(2)二分查找的基本思想是將n個(gè)元素分成大致相等的兩部分,取a[n/2]與x做比較,如果x=a[n/2],則找到x,算法中止;如果x<a[n/2],則只要在數(shù)組a的左半部分繼續(xù)搜索x,如果x>a[n/2],則只要在數(shù)組a的右半部搜索x.
時(shí)間復(fù)雜度無(wú)非就是while循環(huán)的次數(shù)!
總共有n個(gè)元素,
漸漸跟下去就是n,n/2,n/4,....n/2^k(接下來(lái)操作元素的剩余個(gè)數(shù)),其中k就是循環(huán)的次數(shù)
由于你n/2^k取整后>=1
即令n/2^k=1
可得k=log2n,(是以2為底,n的對(duì)數(shù))
所以時(shí)間復(fù)雜度可以表示O(h)=O(log2n)
(3)
首先二分查找的時(shí)間復(fù)雜度:因?yàn)槊看味际钦郯?#xff0c;可以構(gòu)造一顆遞歸樹(shù),共log2(n)層,每層只需O(1)的時(shí)間。所以共花費(fèi)O(1)*log2(n)=O(log2(n))時(shí)間。
其次三分查找,也可類似構(gòu)造一個(gè)遞歸樹(shù),共log3(n)層,而每層需要比較的次數(shù)為2,所以時(shí)間復(fù)雜度為O(2log3(n))。
最后求得使 2log3(n)>log2(n) 對(duì)n>0始終成立。所以三分查找比二分查找的性能就是差。
當(dāng)然對(duì)于二分查找的缺陷分析,優(yōu)點(diǎn):大大提高了查找的效率, 缺陷:只能查找單調(diào)遞增的序列。
對(duì)于假若要查找一個(gè)拋物線的最值的時(shí)候,這里是二分法是不適用的,這里適用三分。
總結(jié)
以上是生活随笔為你收集整理的大剑无锋之二分搜索、二分搜索时间复杂度、三分查找呢?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【案例分析】分布式系统的接口幂等性设计!
- 下一篇: 利剑无意之如何判断一个数在40亿个整数中