經典算法分析:n與lgn


順序查找O(n)

二分查找O(lgn)

通過代碼來感受性能差別

 1 package recursion;
 2 
 3 /**
 4  * @author zsh
 5  * @company wlgzs
 6  * @create 2019-02-16 16:09
 7  * @Describe 感受順序查找與二分查找的性能差別
 8  */
 9 public class Main2 {
10 
11     /**
12      * 順序查找
13      * @param arr 待查找的數組
14      * @param key 待查找的數
15      * @return 返回key在數組中所在的位置
16      */
17     static int sequentialSearch(int[] arr,int key){
18         for (int i = 0; i < arr.length; i++) {
19             if (arr[i] == key){
20                 return i;
21             }
22         }
23         return -1;
24     }
25 
26     /**
27      * 循環實現二分查找
28      * @param arr 待查找的數組
29      * @param key 待查找的數
30      * @return key在數組中的索引位置
31      */
32     static int binary(int[] arr,int key){
33         //頭指針初始位置
34         int low = 0;
35         //尾指針初始位置
36         int high = arr.length -1;
37         //定義middle指針位置
38         int middle = 0;
39         //頭尾交叉 || key大於最大值 || key小於最小值,說明未找到
40         if (low > high || key > arr[high] || key < arr[low]){
41             return -1;
42         }
43 
44         while (low <= high){
45             //防止數據溢出
46             middle = (low + high) >>> 1;
47             if (arr[middle] > key){
48                 //middle所對應的值比key大,key應該在左邊區域
49                 high = middle -1;
50             }else if (arr[middle] < key){
51                 //middle所對應的值比key小,key應該在有邊區域
52                 low = middle +1;
53             }else {
54                 return middle;
55             }
56 
57         }
58 
59         //最后仍然沒有找到,則返回-1
60         return -1;
61     }
62 
63     public static void main(String[] args) {
64         //構造1千萬的數據
65         int[] arr = new int[(int) Math.pow(10,8)];
66         for (int i = 1; i <= (int) Math.pow(10,8) ; i++) {
67             arr[i-1] = i;
68         }
69 
70         //使用順序查找的運行時間
71         long time1 = System.currentTimeMillis();
72         sequentialSearch(arr,1000000);
73         long time2 = System.currentTimeMillis();
74         System.out.println(time2-time1);
75 
76         //使用二分查找的運行時間
77         long time3 = System.currentTimeMillis();
78         binary(arr,1000000);
79         long time4 = System.currentTimeMillis();
80         System.out.println(time4-time3);
81     }
82 
83 }

運行結果:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM