標籤:莫名其妙 交換 總結 span 資料 ret 重複元素 遇到 左右
在做新舊介面交替過程中,遇到了老介面和新介面json資料有些不一致的情況,需要比較兩個json對象,把相同的元素賦其中一個json對象中變數的值。而且其中一個json最後輸出格式還需要改變下屬性名稱,思來想去覺得和“找出兩個數組相同元素”很像,所以做下總結。
“有一個數組A{0,2,3,5}和一個數組B{3,5,6,2,1,1},找出這兩個數組相同元素。”
一開始抽象出這道題時,腦海裡浮現出最簡單粗暴的方法,逐一比較。
//最簡單粗暴的做法,逐個比較,時間複雜度為(B.length)^(A.length),b的a次方了,時間複雜度相當高for(int i = 0 ;i < A.length ; i ++){ for(int j = 0 ;j < B.lengh;j++){ if( A[i] == B[j] ){ System.out.println(A[i]); } }}
後面腦子一轉,可以先排序再進行比較,排序的話,用最慢的冒泡排序法,時間複雜度是(B.length)^2+(A.length)^2+(一些莫名其妙的比較演算法),總之時間複雜度比上面那個演算法低就是了。這是第二種演算法,就不貼代碼了。
第三種演算法,思路是先把兩個數組合并,再排序一下,重複的元素自然就出來了,而至於說B數組裡面本來就有重複元素,這個簡單,把B數組先去重再和A數組合并就行了。
就是說B數組{3,5,6,2,1,1},經過去重後變成{3,5,6,2,1}
public void deDuplication(int[] oraginalArr){ for(int i = 0 ; i < oraginalArr.length ;i++){ if(int[i]==int[i+1]){ System.out.println(int[i]);
} }}
//用最慢的冒泡排序法,從小到大排列public int[] sort(int[] messyArr){ for(int i = 0 ;i < messyArr.length ;i++){ for(int j = (i+1) ; j < (messyArr.length) ; j++ ){ //如果第一個數比第二個數大,則兩數交換 if(messyArr[i] > messyArr[j ]){ int temp = messyArr[i]; messyArr[i] = messyArr[j ]; messyArr[i+1] = temp; } }
return messyArr;
}
這樣子時間複雜度一下子就變成了B.length+(B.length)^2,這就是演算法的魅力。
網上又查了一些資料,還有一個用堆排序來找出兩數組的相同元素的,時間複雜度在n(log2n)左右,感覺時間複雜度應該是最低的吧。
至於用HashMap,HashSet去重的,我感覺這些集合內部應該也是用了某種演算法吧,感覺還是自己寫的演算法可以計算時間複雜度比較好一點,效能一算就知道了,如果有小夥伴能分析hashMap和hashSet去重的時間複雜度,歡迎探討,謝謝。
找出兩個數組的相同元素,最優演算法?