[隨筆]Java算法01——二分查找法及大O表示法

什麼是算法

算法,是一組完成特定任務的指令。任何代碼片段都可視爲算法。簡單來說,算法就是一串代碼或指令。

爲什麼會有算法

算法爲了解決某種特定的問題(或稱爲完成某種特定的任務)所創建的一種解決策略。用《百度百科-算法》中的解釋就是“爲了能夠對一定規範的輸入,在有限時間內獲得所要求的輸出”。

二分查找法

需求:設計一個數組,寫一個方法,讓其找到指定的數,每次只對比中間數,找到則返回查找的次數,找不到則返回null

方法分析:

  1. 確定返回值類型:String
  2. 確定參數:數組int[] arr,int i
  3. 確定訪問修飾符:public static

算法分析:

  1. 確定變量:min,max,mid,count
  2. 確定循環條件:最小值不能大於最大值
  3. 確定判斷元素:i 與 arr[mid]
public static String binarySearch(int[] arr,int i) {
		// 定義變量
		int min = 0;							// 最小值索引
		int max = arr.length - 1;				// 最大值索引
		int mid;								// 中間值索引
		int count = 0;							// 初始化計算次數
		
		// 定義循環,條件:最小值不大於最大值則繼續循環,即min <= max
		while(min <= max) {
			mid = (min + max) / 2;				// 每次循環對mid重新取中賦值
			int value = arr[mid];				// 獲取數組中間值
			count++;							// 計算次數累加
			if (i == value) {					// 判斷中間值與指定值是否相等
				return String.valueOf(count);	// 相等則將count轉換成String類型並返回,跳出循環
			}else if(i < value) {				// 判斷指定值是否小於中間值
				max = mid - 1;					// 小於則對最大值重新定義,縮小範圍
			}else {
				min = mid + 1;					// 與上同
			}
		}
		
		return null;							// 循環結束還未匹配相等的值,則返回null
		
	}
二分查找法特點:

每次只對比中間值,判斷中間值比指定值大或者小,縮小範圍繼續判斷

對比簡單查找(即用每一個元素與指定值對比)查找次數要少的多,若數組中有1024個數,簡單查找最多要對比1024次,而二分查找最多隻需要對比**log2**1024次,即10次,十分高效。

使用二分查找的前提是:數組必須是有序的

爲什麼必須是有序的?個人理解,二分查找也叫折半查找,每次對比只操作中間值,中間值的定義必須滿足兩個條件,1、這中間值是索引的中間值;2、也是數組中所有數值的中間值。要滿足兩種條件數組必須是有序的,若是無序的數組使用二分查找是無意義的。

大O表示法

  • 大O表示法是爲了指出算法的速度有多快的一種特殊的表示法
  • 大O表示法指的並非以秒爲單位的速度,而是讓你能夠比較操作數,它指出了算法運行時間的增速。可以理解爲增長速度
  • 大O表示法指出了最糟糕情況下的運行時間,即可能運行時間的最大值

常用的大O運行時間

以下log的底數都是2,即log2

  • O(log n),也叫對數時間,這樣的算法包括二分查找
  • O(n),也叫線性時間,這樣的算法包括簡單查找
  • O(n * log n),這樣的算法包括快速排序——一種速度較快的排序算法
  • O(n2),這樣的算法包括選擇排序——一種速度非常慢的排序算法
  • O(n!),一種非常慢的算法,例如旅行商問題的解決方案

總結

  • 二分查找的速度比簡單查找的速度快的多
  • O(log n)比O(n)快。需要搜索的元素越多,前者比後者就快的越多
  • 算法運行時間並不以秒以單位
  • 算法運行時間是從其增速的角度度量的
  • 算法運行時間用大O表示法表示。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章