什麼是算法
算法,是一組完成特定任務的指令。任何代碼片段都可視爲算法。簡單來說,算法就是一串代碼或指令。
爲什麼會有算法
算法爲了解決某種特定的問題(或稱爲完成某種特定的任務)所創建的一種解決策略。用《百度百科-算法》中的解釋就是“爲了能夠對一定規範的輸入,在有限時間內獲得所要求的輸出”。
二分查找法
需求:設計一個數組,寫一個方法,讓其找到指定的數,每次只對比中間數,找到則返回查找的次數,找不到則返回null
方法分析:
- 確定返回值類型:String
- 確定參數:數組int[] arr,int i
- 確定訪問修飾符:public static
算法分析:
- 確定變量:min,max,mid,count
- 確定循環條件:最小值不能大於最大值
- 確定判斷元素: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表示法表示。