在我参与的一个项目中,我负责记录两种不同搜索算法的搜索时间:二分查找和顺序查找。对于每个算法,我都要记录排序输入和未排序输入的时间。当我将排序后的输入和未排序输入进行顺序查找的搜索时间比较时,我发现了一些奇怪的问题。根据我先对哪一个进行排序,搜索时间将会明显大于另一个。因此,如果我先对已排序的进行顺序查找,则花费的时间将比在未排序的上进行的顺序查找多得多。
这让我感到困惑,也是我的疑惑所在。由于关键词是从输入中获取的(通过顺序搜索),所以可以保证在数据输入中找到这些关键词。
以下是引起问题的代码。在这种情况下,seqOnUnsorted的搜索时间将远远大于seqOnSorted,但实际上不应该如此。
public void sequentialSearchExperiment(){
seqOnUnsorted = sequentialSearchSet(keys, unsortedArray);
writeOutExperimentResults(seqOnUnsorted, seqOnUnsortedFilename, "Sequential Sort on Unsorted: ");
seqOnSorted = sequentialSearchSet(keys, sortedArray);
writeOutExperimentResults(seqOnSorted, seqOnSortedFilename, "Sequential Sort on Sorted: ");
}
sequentialSearchSet() 方法如下:
public SearchStats[] sequentialSearchSet(int[] keys, int[] toSearch){
SearchStats[] stats = new SearchStats[keys.length];
for (int i = 0; i < keys.length; i++){
stats[i] = sequentialSearch(keys[i], toSearch);
}
return stats;
}
这里是sequentialSearch()函数:
public SearchStats sequentialSearch(int key, int[] toSearch){
long startTime = System.nanoTime(); // start timer
// step through array one-by-one until key found
for (int i = 0; i < toSearch.length; i++){
if (toSearch[i] == key){
return new SearchStats(key, i, System.nanoTime() - startTime);
}
}
// did not find key
return new SearchStats(key, -1, System.nanoTime() - startTime);
}
以下是SearchStats构造函数:
public SearchStats(int keySearchedFor, int indexOfFound, long searchTime){
this.keySearchedFor = keySearchedFor;
this.indexOfFound = indexOfFound;
this.searchTime = searchTime;
}
如果我进行测试运行,我得到的平均搜索时间是:
sequential search on sorted: 21,080 ns
sequential search on unsorted: 2,137,465 ns
正如你所看到的,因为我先在未排序的列表中进行了搜索,所以搜索时间显著较长。有人能解释一下这是为什么吗?此外,我该如何避免这种奇怪的情况呢?