今天讀《編程珠璣》開篇就被裏面的內容深深的吸引住了,很後悔以前只是單單據說它的大名,卻從沒有拜讀,勝感遺憾。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萬的數中存在兩個相同的數,將其找出來,要求花費最少的時間,和空間(大體好像就是這個意思),我的感受採用位圖數據結構應該是很不錯的方法。百度