使用Random產生100個無重複隨機數,使用Set存儲和使用位圖存儲的效率對比

       今天讀《編程珠璣》開篇就被裏面的內容深深的吸引住了,很後悔以前只是單單據說它的大名,卻從沒有拜讀,勝感遺憾。java

    粗略的看了第一章關於位圖數據結構的:該數據結構描述了一個有限定義域內的稠密集合,每一個元素而且出現一次沒有與其餘數有關聯。編程

   因而想到了想用隨機數來測試一下,看看效果如何。數據結構

背景:使用隨機書產生1000個不相同的數字,而且按從小到大排列。dom

(1)採用java的Set數據結構存儲,並進行排序,代碼以下:測試

Set<Integer> datas= new HashSet<Integer>();
		Random random = new Random();
		int i = 0;
		long start = System.currentTimeMillis();
		while (i < 1000) {
			int a = Math.abs(random.nextInt() % 1000);
			if (datas.add(a)) {
				i++;
			}

		}
		Arrays.sort(datas.toArray());
		long end = System.currentTimeMillis();
		System.out.println("set 花費時間:" + (end - start));

(2)採用位圖數據結構,具體代碼以下:code

byte[] b = new byte[1001];
		int i = 0;
		Random random = new Random();
		long start = System.currentTimeMillis();
		while (i < 1000) {
			int a = Math.abs(random.nextInt() % 1000);
			if (b[a] == 0) {
				b[a] = 1;
				i++;
			}
		}
		long end = System.currentTimeMillis();
		System.out.println("位圖 花費的時間:" + (end - start));

 測試結果:排序

         (1)採用Set數據結構花費的時間:6ms。class

          (2)採用位圖數據結構花費的時間:1ms.隨機數

      從上面的測試結果,讓我想到了百度之前的一道筆試題,在最大的數小於500萬的數中存在兩個相同的數,將其找出來,要求花費最少的時間,和空間(大體好像就是這個意思),我的感受採用位圖數據結構應該是很不錯的方法。百度

相關文章
相關標籤/搜索