java:兩個升序陣列的二元歸併,時間複雜度O(m+n)
阿新 • • 發佈:2018-11-26
方法1:(利用陣列作為容器):
特點:
1/結果為陣列,合併後依然可以通過下標快速訪問;
2/需要考慮重複元素導致的合併後結果陣列實際長度變短問題;
//兩個升序陣列進行升序歸併(二元歸併) 時間複雜度O(m+n) public class Test_AfterClass1 { public static void main(String[] args) { int[] arr1={1,3,5,6,7,9,10,11,35};//升序陣列arr1 int[] arr2={1,3,4,7,9,12,34};//升序陣列arr2 int a=arr1.length;//陣列arr1長度 int b=arr2.length;//陣列arr2長度 int[] arr = new int[a+b];//合併排序後的初始容器 int i = 0;//arr1索引 int j = 0;//arr2索引 int k = 0;//arr索引 int m=1;//記錄重複元素個數 //若兩個陣列均未到到最後一個元素.誰小放誰 while(i<a && j<b) { if(arr1[i]<=arr2[j]) { arr[k++] = arr1[i++]; //去重 if(arr1[i-1]==arr2[j]) { j++;//跳過重複元素下標 m++;//重複元素個數+1 } }else arr[k++] = arr2[j++]; } while(i==a && j<b) arr[k++] = arr2[j++];//若arr1到達最後一個元素,直接開始存arr2剩餘元素 while(j==b && i<a) arr[k++] = arr1[i++];//若arr2到達最後一個元素,直接開始存arr1剩餘元素 //將初始容器的有效值放入最終容器 int[] arrLast = new int[a+b-m];//最終容器 for (int i1 = 0; i1 < arrLast.length; i1++) { //迴圈放入 arrLast[i1]=arr[i1]; } int term=1;//換行標誌 //增強for迴圈遍歷輸出結果 for (Integer integer : arrLast) { System.out.print(integer+" "); if(term++%50==0) System.out.println();//是否換行 } } }
方法2:(利用LinkedHashSet集合作為容器)
特點:
1/結果為鏈式雜湊集,可以利用其有序和無重複的特性實現去重;
2/無法通過下標訪問元素;
package teacherday4; import java.util.LinkedHashSet; //利用LinkedHashSet作為容器對兩個升序陣列進行升序歸併(二元歸併),可省略去重邏輯 時間複雜度O(m+n) public class Test_AfterClass { public static void main(String[] args) { int[] arr1={1,3,5,6,7,9,10,11,35};//升序陣列1 int[] arr2={1,3,4,7,9,12,34,35,38};//升序陣列2 int j=0,k=0,m=arr1.length,n=arr2.length;//arr1索引 arr2索引 arr1長度 arr2長度 LinkedHashSet<Integer> arrSet=new LinkedHashSet<>();//合併排序後的存放容器 //若兩個陣列均未到到最後一個元素.誰小放誰 while(j<m&&k<n){ if(arr1[j]<=arr2[k]) arrSet.add(arr1[j++]); else arrSet.add(arr2[k++]);//此處重複元素無法放進鏈式雜湊集 } while(j==m&&k<n) arrSet.add(arr2[k++]);//若arr1到達最後一個元素,直接開始存arr2剩餘元素 while(j<m&&k==n) arrSet.add(arr1[j++]);//若arr2到達最後一個元素,直接開始存arr1剩餘元素 int term=1;//換行標誌 //增強for迴圈遍歷輸出結果 for (Integer integer : arrSet) { System.out.print(integer+" "); if(term%50==0) System.out.println();//是否換行 } } }
總結:
1/方法1比fang方法2多了去重程式碼,但是去重思維有點繞,但陣列的下標查詢較快;
2/方法2不需要考慮去重,但無法直接通過下標訪問結果元素;