Java演算法分析1—————尋找數組相同元素

來源:互聯網
上載者:User

標籤:java

演算法的兩個評測指標:已耗用時間和記憶體消耗

要麼用時間換空間,要麼用空間換時間

 

尋找數組相同元素測試一:
0~99共100個元素各不相同,新加入一個0~99的元素不明確位置
從101個元素數組中找出與0~99元素中重複的一個

/* 找相同元素 * 0~99共100個元素各不相同 * 從101個元素數組中找出與0~99元素中重複的一個 */public class Dome01 {public static void main(String[] args) {int arr[] = new int[101];for (int i = 0; i < 100; i++) {arr[i] = i;}arr[100] = 38; // 假定重複元素為38// 將數組元素打亂 Math.random() 取值範圍是[0,1)// 如何打亂資料??for (int j = 0; j < 1000; j++) { // 進行1000次資料打亂的操作int num1 = (int) (Math.random() * 101); // num取值範圍是[0,101)int num2 = (int) (Math.random() * 101);int temp = arr[num1];arr[num1] = arr[num2];arr[num2] = temp;}// 演算法一:用雙迴圈實現Jonney: for (int i = 0; i < arr.length; i++) {// 將數組元素依次與後面的數組元素比較for (int j = i + 1; j < arr.length; j++) {if (arr[i] == arr[j]) {System.out.println("重複元素是:" + arr[i]);break Jonney; // 退出雙迴圈}}}// 演算法一效率太低// 演算法二:將數組的元素全部累加起來就是0~99的資料+相同元素 再減去0~99的和int sum = 0;for (int i = 0; i < arr.length; i++) {sum += arr[i];}for (int j = 0; j < 100; j++) {sum -= j;}System.out.println("重複元素是:" + sum);// 演算法二如果計算的資料太多就會有資料溢出// 演算法三:使用異或解決// 0^1^2^3^4^...^m...^99^m^0^1^2^3^4^...^m...^99=m// 使用數組的第一個元素異或後面的所有元素for (int i = 1; i < arr.length; i++) {arr[0] = arr[0] ^ arr[i];}// 再次將arr[0]儲存的結果與0~99異或一次for (int i = 0; i < 100; i++) {arr[0] = arr[0] ^ i;}System.out.println("重複元素是:" + arr[0]);// 演算法三才是最佳演算法}}


 

 

尋找數組相同元素測試二:

0~99共100個整數,各不相同,將所有數放入一個數組,隨機排布
數組長度100,將其中任意一個數替換成0~99另一個數(唯一重複的數字)
將重複的數字找出

/* * 0~99共100個整數,各不相同,將所有數放入一個數組,隨機排布 * 數組長度100,將其中任意一個數替換成0~99另一個數(唯一重複的數字) * 將重複的數字找出 */public class Dome2 {public static void main(String[] args) {int arr[] = new int[100];for (int i = 0; i < arr.length; i++) {arr[i] = i;}// 隨機排布for (int i = 0; i < 1000; i++) {int num1 = (int) (Math.random() * 100);int num2 = (int) (Math.random() * 100);int temp = arr[num1];arr[num1] = arr[num2];arr[num2] = temp;}// 用某個值給某個值替換int num1 = (int) (Math.random() * 100);int num2 = (int) (Math.random() * 100);// 保證num1與num2不同while (num1 == num2) {num1 = (int) (Math.random() * 100);}System.out.println("將" + num1 + "位置的值用" + num2 + "的位置替換");arr[num1] = arr[num2];for (int i = 0; i < arr.length; i++) {System.out.print(arr[i] + "\t");}// 演算法實現:// 演算法一:用雙迴圈實現Jonney: for (int i = 0; i < arr.length; i++) {// 將數組元素依次與後面的數組元素比較for (int j = i + 1; j < arr.length; j++) {if (arr[i] == arr[j]) {System.out.println("重複元素是:" + arr[i]);break Jonney; // 退出雙迴圈}}}// 演算法一效率太低// 演算法二:用數組最佳化的演算法// 定義一個新數組 int newArr[]=new int[100] 預設值為0// 把原始數組的元素作為新數組的下標,如果該下標對應的新數組元素存在,就將該元素值+1=1/* * 原始數組         8 3 7 2 1 5 6 8 0 * 新數組           0 0 0 0 0 0 0 0 0 * 對新數組+1       1 1 1 1 0 1 1 1 2 */// 新數組中元素為2的值的下標就是重複元素int newArr[] = new int[100];for (int i = 0; i < arr.length; i++) {newArr[arr[i]]++; // 將原始元素對於新數組的索引下標if (newArr[arr[i]] == 2) {System.out.println("重複元素是:" + arr[i]);}}}}


 

PS:測試二中的新定義個新數組的數組最佳化演算法,雖然加快了查詢速度,但也加大了記憶體開銷

Java演算法分析1—————尋找數組相同元素

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.