經(jīng)典!自己找的Java相關(guān)資料.doc_第1頁(yè)
經(jīng)典!自己找的Java相關(guān)資料.doc_第2頁(yè)
經(jīng)典!自己找的Java相關(guān)資料.doc_第3頁(yè)
經(jīng)典!自己找的Java相關(guān)資料.doc_第4頁(yè)
經(jīng)典!自己找的Java相關(guān)資料.doc_第5頁(yè)
已閱讀5頁(yè),還剩2頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

java的System.currentTimeMillis()和System.nanoTime()有什么區(qū)別JDK1.5之后java中的計(jì)時(shí)給出了更精確的方法:System.nanoTime(),輸出的精度是納秒級(jí)別,這個(gè)給一些性能測(cè)試提供了更準(zhǔn)確的參考。但是這個(gè)方法有個(gè)需要注意的地方,不能用來(lái)計(jì)算今天是哪一天看到這個(gè)方法不由得會(huì)想起System.currentTime(),這個(gè)方法,它的精度是毫秒,返回值是從1970.1.1的零點(diǎn)開(kāi)始到當(dāng)前時(shí)間的毫秒數(shù),理論上這個(gè)可以用來(lái)算當(dāng)前的時(shí)間,而且可以用這個(gè)值來(lái)構(gòu)造一個(gè)Date對(duì)象。但是System.nanoTime()卻是不同,代碼注釋上有這么一句: The value returned represents nanoseconds since some fixed but arbitrary time (perhaps in the future, so values may be negative).這個(gè)返回值是一個(gè)從確定的值算起的,但是這個(gè)值是任意的,可能是一個(gè)未來(lái)的時(shí)間,所以返回值有可能是負(fù)數(shù)。(我的英語(yǔ)很蹩腳,意思應(yīng)該能明白吧)所以說(shuō)這個(gè)System.nanoTime()方法只能用來(lái)計(jì)時(shí),例如:long s = System.nanoTime();.System.out.println(System.nanoTime() - s);二分查找算法java實(shí)現(xiàn)今天看了一下JDK里面的二分法是實(shí)現(xiàn),覺(jué)得有點(diǎn)小問(wèn)題。二分法的實(shí)現(xiàn)有多種今天就給大家分享兩種。一種是遞歸方式的,一種是非遞歸方式的。先來(lái)看看一些基礎(chǔ)的東西。1、算法概念。二分查找算法也稱為折半搜索、二分搜索,是一種在有序數(shù)組中查找某一特定元素的搜索算法。請(qǐng)注意這種算法是建立在有序數(shù)組基礎(chǔ)上的。2、算法思想。搜素過(guò)程從數(shù)組的中間元素開(kāi)始,如果中間元素正好是要查找的元素,則搜素過(guò)程結(jié)束;如果某一特定元素大于或者小于中間元素,則在數(shù)組大于或小于中間元素的那一半中查找,而且跟開(kāi)始一樣從中間元素開(kāi)始比較。如果在某一步驟數(shù)組為空,則代表找不到。這種搜索算法每一次比較都使搜索范圍縮小一半。3、實(shí)現(xiàn)思路。找出位于數(shù)組中間的值,并存放在一個(gè)變量中(為了下面的說(shuō)明,變量暫時(shí)命名為temp);需要找到的key和temp進(jìn)行比較;如果key值大于temp,則把數(shù)組中間位置作為下一次計(jì)算的起點(diǎn);重復(fù) 。如果key值小于temp,則把數(shù)組中間位置作為下一次計(jì)算的終點(diǎn);重復(fù) 。如果key值等于temp,則返回?cái)?shù)組下標(biāo),完成查找。4、實(shí)現(xiàn)代碼。/* * description : 二分查找。 * autor kwzhang * modify :2012-6-29 * * param * param array 需要查找的有序數(shù)組 * param from 起始下標(biāo) * param to 終止下標(biāo) * param key 需要查找的關(guān)鍵字 * return * throws Exception */ public static E extends Comparable int binarySearch(E array, int from, int to, E key) throws Exception if (from 0 | to 0) throw new IllegalArgumentException(params from & length must larger than 0 .); if (from 1) + (to 1); / 右移即除2 E temp = arraymiddle; if (pareTo(key) 0) to = middle - 1; else if (pareTo(key) 0) from = middle + 1; else return middle; return binarySearch(array, from, to, key); 5、測(cè)試demo很簡(jiǎn)單,這里就不寫(xiě)了。上面這種實(shí)現(xiàn)是通過(guò)遞歸的方式,各人覺(jué)得之類的問(wèn)題用遞歸比較好理解,而且過(guò)程簡(jiǎn)單。下面再來(lái)看看非遞歸的方式如何實(shí)現(xiàn)。在JDK里面正好有實(shí)現(xiàn),在此就直接貼上Arrays里面的代碼。為了簡(jiǎn)單起見(jiàn),我們就只看看int參數(shù)的方法: private static int binarySearch0(int a, int fromIndex, int toIndex, int key) int low = fromIndex; int high = toIndex - 1; while (low 1; int midVal = amid; if (midVal key) high = mid - 1; else return mid; / key found return -(low + 1); / key not found. 怎樣用下面的代碼實(shí)現(xiàn)下面(1)和(2)。求大家?guī)臀已a(bǔ)充完整。(1)在程序中為數(shù)組賦值并寫(xiě)入待搜索元素,輸出搜索結(jié)果;(2)通過(guò)鍵盤為數(shù)組賦值并輸入待搜索元素,輸出搜索結(jié)果;public static int binarySearch(int a, int x, int n)int left = 0; int right = n - 1;while (left amiddle) left = middle + 1;else right = middle - 1;return -1; /由小到大排序 public static int sort(int a) for(int i=0;ia.length;i+) for(int j=0;jaj+1) int temp = aj; aj = aj+1; aj+1 = temp; return a; /回答第一題 public static int search1() /程序定義的數(shù)組 int b = 2,1,4,8,6,7,0; for(int a:b) System.out.println(a); /排序 b = sort(b); for(int a:b) System.out.println(a); return binarySearch(b,7,b.length); /回答第二題 public static int search2() Scanner sc = new Scanner(System.in); /輸入數(shù)組個(gè)數(shù) System.out.println(請(qǐng)輸入數(shù)組元素的個(gè)數(shù):); int idex = sc.nextInt(); /生成數(shù)組 int b = new intidex; /輸入元素 System.out.println(請(qǐng)輸入元素:); for(int i=0;ib.length;i+) bi = sc.nextInt(); for(int a:b) System.out.println(a); /排序 b = sort(b); for(int a:b) System.out.println(a); /輸入要查詢的元素 System.out.println(請(qǐng)輸入要查詢的元素:); int element = sc.nextInt(); return binarySearch(b,element,b.length); 任何項(xiàng)目開(kāi)發(fā)中,在一個(gè)集合或數(shù)組中循環(huán)查找,搜索目標(biāo)數(shù)據(jù),是經(jīng)常用到的。如果搜索的數(shù)據(jù)范圍比較小,那么不管什么算法,對(duì)于今天的計(jì)算機(jī)來(lái)說(shuō),性能上基本差別不大,但是如果數(shù)據(jù)量達(dá)到幾百萬(wàn),甚至更大,那么算法的選擇和優(yōu)化就顯得比較重要。有空之余測(cè)試了下順序搜索和二分搜索的性能,竟然發(fā)現(xiàn)效率差異在1500倍左右。當(dāng)然,這2種比較的前提是,集合中的數(shù)據(jù)已經(jīng)進(jìn)行了排序處理。下邊是測(cè)試代碼:/* * 搜索算法測(cè)試,主要是比較二分搜索和順序搜索的效率 * author 百里樂(lè) */public class SearchTest /* 被搜索數(shù)據(jù)的大小*/ private static final int size = 5000000;/* * 啟動(dòng)方法 * param args */ public static void main(String args) long data = new longsize; /添加測(cè)試數(shù)據(jù) for(int k =0 ;kdata.length;k+) datak = k; / 要查找的數(shù)據(jù) long target = 4980002; binaryFindTest(data,target); orderFindTest(data,target); /* * 二分搜索測(cè)試 * param data 數(shù)據(jù)集合 * param target 搜索的數(shù)據(jù) */ public static void binaryFindTest(long data, long target) long start = System.nanoTime(); int result = binaryFind(data,target); long end = System.nanoTime(); System.out.println(binary search position: + result); System.out.println(binary search time: + (end-start); /* * 順序搜索測(cè)試 * param data 數(shù)據(jù)集合 * param target 搜索的數(shù)據(jù) */ public static void orderFindTest(long data, long target) long start = System.nanoTime(); int result = orderFind(data,target); long end = System.nanoTime(); System.out.println(order search position: + result); System.out.println(order search time: + (end-start); /* * 二分搜索算法實(shí)現(xiàn) * param data 數(shù)據(jù)集合 * param target 搜索的數(shù)據(jù) * return 返回找到的數(shù)據(jù)的位置,返回-1表示沒(méi)有找到。 */ public static int binaryFind(long data, long target) int start = 0; int end = data.length - 1; while (start = datamiddleIndex) start = middleIndex + 1; else end = middleIndex - 1; return -1; /* * 順序搜索算法實(shí)現(xiàn) * param data 數(shù)據(jù)集合 * param target 搜索的數(shù)據(jù) * return 返回找到的數(shù)據(jù)的位置,返回-1表示沒(méi)有找到。 */ p

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論