使用不同方法查詢陣列中某個特定值,並計算時間(改正二分法查詢錯誤和陣列轉化集合錯誤)
這裡修正剛才寫的程式碼,發現很多根本沒找到。。。程式碼有很多問題,這裡一個個修正並記錄寫來:
1. 使用二分法時一定要先排序
錯誤的寫法:
public int search() {
return Arrays.binarySearch(arr, targetValue);
}
改正後寫法:
public int search() {
//System.out.println("arrLength"+ arr.length);
Arrays.sort(arr);
return Arrays.binarySearch(arr, targetValue);
}
2.陣列轉化為List錯誤: 要使用Integer[], 不要使用int[]
int[]陣列使用Arrays.asList()時會有問題,會把整個陣列轉化為List的一個元素,並沒有把陣列內的內容變成一個個List元素
錯誤的寫法:
int[] arr = new int[1000];
List list = Arrays.asList(arr); //這樣寫arr[]就會變成list的第一個元素了。。整個list.size()=1;不符合預期
改正後寫法:
Integer[] arr = new Integer[10000];
List list = Arrays.asList(arr);//陣列轉化成List
Set set = new HashSet(Arrays.asList(arr));//陣列轉化成Set
根據改正後的程式碼重新計算哪種方式查詢最快,陣列比較短時建議Loop,遍歷比較長的陣列可以用List
1.當陣列長度100時,Loop最快
使用Loop查詢花費的時間為15360
使用Arrays.binarySearch()查詢花費的時間為440319
使用UseList查詢花費的時間為349013
使用UseSet查詢花費的時間為257706
2.當陣列長度1000時,Loop最快,List次之
使用Loop查詢花費的時間為125867
使用Arrays.binarySearch()查詢花費的時間為1839786
使用UseList查詢花費的時間為235946
使用UseSet查詢花費的時間為1150720
3.當陣列長度10000時,Loop最快,List次之
執行第一次:
使用Loop查詢花費的時間為463787
使用Arrays.binarySearch()查詢花費的時間為9032957
使用UseList查詢花費的時間為693333
使用UseSet查詢花費的時間為5693011
執行第二次:
使用Loop查詢花費的時間為191573
使用Arrays.binarySearch()查詢花費的時間為15807140
使用UseList查詢花費的時間為154027
使用UseSet查詢花費的時間為4534185
4.當陣列長度1000000時, List比較快且相對穩定
執行第一次:
使用Loop查詢花費的時間為4186451
使用Arrays.binarySearch()查詢花費的時間為629270345
使用UseList查詢花費的時間為167680
使用UseSet查詢花費的時間為86613297
執行第二次:
使用Loop查詢花費的時間為5113171
使用Arrays.binarySearch()查詢花費的時間為624438347
使用UseList查詢花費的時間為18483192
使用UseSet查詢花費的時間為89199322
貼上修正後的程式碼
測試主程式碼:
package test1;
import java.util.Arrays;
import java.util.List;
//在陣列中查詢某個特定值,如何查詢最快?測試看看。。
//如何在陣列中找出某個特定值,並計算執行時間
public class TestQuery1 {
public static void main(String[] args) {
//定義一個含有10000個數字的陣列
//int[] arr = new int[10000];//此方式無法by單個數字存入List
Integer[] arr = new Integer[1000000];
for(int i = 0; i < arr.length; i++){
arr[i] = (int) (Math.random()*100000000);
}
List list = Arrays.asList(arr);
//假設查詢數字666
int targetValue = 666;
//使用Loop查詢時間
UseLoop useLoop = new UseLoop(arr, targetValue);
useLoop.spendTime("Loop");
//使用Arrays.binarySearch()方法查詢
UseArraysBinary useAB = new UseArraysBinary(arr, targetValue);
useAB.spendTime("Arrays.binarySearch()");
//使用集合List查詢
UseList useList = new UseList(arr, targetValue);
useList.spendTime("UseList");
//使用集合set查詢
UseSet useSet = new UseSet(arr, targetValue);
useSet.spendTime("UseSet");
}
}
計算時間程式碼,搞成抽象類了
package test1;
public abstract class SpendTime {
protected Integer[] arr;
protected int targetValue;
public abstract int search();
public void spendTime(String name){
long start = System.nanoTime();
// System.out.println("如果是正數表示包含這個值:"+search());
search();
long end = System.nanoTime();
long time = end - start;
System.out.println("使用"+name+"查詢花費的時間為"+time);
}
}
package test1;
public class UseLoop extends SpendTime{
//使用Loop查詢陣列是否包含某個值
public UseLoop(Integer[] arr, int targetValue){
this.arr = arr;
this.targetValue = targetValue;
}
public int search() {
for(int i =0; i < arr.length; i++){
if (arr[i]== targetValue){
// System.out.println(arr[i]);
return i;
}
}
return -1;
}
}
使用Arrays.binarySearch()方法
package test1;
import java.util.Arrays;
public class UseArraysBinary extends SpendTime{
public UseArraysBinary(Integer[] arr, int targetValue){
this.arr = arr;
this.targetValue = targetValue;
}
//使用Arrays.binarySearch查詢陣列中是否含有特定值
@Override
public int search() {
//System.out.println("arrLength"+ arr.length);
Arrays.sort(arr);
return Arrays.binarySearch(arr, targetValue);
}
}
使用List.contains()方法
package test1;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class UseList extends SpendTime{
public UseList(Integer[] arr, int targetValue){
this.arr = arr;
this.targetValue = targetValue;
}
@Override
public int search() {
List list = Arrays.asList(arr);
if(list.contains(targetValue))
return 1;
return -1;
}
}
使用Set.contains()方法
package test1;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
public class UseSet extends SpendTime{
public UseSet(Integer[] arr, int targetValue){
this.arr = arr;
this.targetValue = targetValue;
}
@Override
public int search() {
Set set = new HashSet(Arrays.asList(arr));
// System.out.println(set.size());
if(set.contains(targetValue))
return 1;
return -1;
}
}
相關文章
- 使用不同方法查詢陣列中某個特定值(物件),並計算時間(個人練習)陣列物件
- 陣列中查詢給定值陣列
- 陣列的查詢(搜尋):線性查詢和二分法查詢陣列
- Java陣列排序和查詢Java陣列排序
- 陣列使用find查詢用法陣列
- 二維陣列中的查詢陣列
- 二維陣列查詢陣列
- JavaFX教程-查詢陣列Java陣列
- JavaScript --二維陣列查詢一維陣列JavaScript陣列
- MySQL查詢某個列中相同值的數量統計MySql
- 【JZOF】二維陣列中的查詢陣列
- 日誌查詢錯誤
- 陣列的主元素查詢陣列
- js查詢陣列元素位置JS陣列
- js查詢指定的陣列中是否含有指定的值JS陣列
- 變化的區間樹狀陣列,單點查詢陣列
- [ORACLE BUG]查詢結果錯誤--臨時表並行Oracle並行
- 【樹狀陣列 區間更新區間查詢】code陣列
- 查詢陣列中第K大的元素陣列
- 九度 二維陣列中的查詢陣列
- 面試題——二維陣列中的查詢面試題陣列
- MongoDB查詢(陣列、內嵌文件和$where)MongoDB陣列
- 查詢某個欄位的不同值
- 查詢構造器結果--物件陣列互轉方法物件陣列
- delphi 查詢av錯誤地址
- MongoDB之資料查詢(陣列)MongoDB陣列
- 查詢提示;及重排陣列分析陣列
- 短視訊平臺開發,查詢日期和時間的陣列陣列
- Java中查詢陣列多數元素的4種方法Java陣列
- 查詢陣列裡資料刪除和增加的方法陣列
- java陣列回顧---線性查詢最大值最小值---二分查詢Java陣列
- 樹狀陣列的區間查詢與區間修改陣列
- 樹狀陣列模板題 & (樹狀陣列 1:單點修改,區間查詢)陣列
- 【劍指offer】二維陣列中的查詢陣列
- 九度 1384 二維陣列中的查詢陣列
- 演算法學習-查詢旋轉陣列的最小值演算法陣列
- 樹狀陣列單點更新和區間查詢陣列
- mysql慢查詢和錯誤日誌分析MySql