- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
各位阅读这篇文章的人大家好。我最近毕业了,我基本上会复习我学到的每一个概念,以刷新我的内存或更好地提高我的技能,以便我可以申请公司并被雇用。我的第一次复习是二分搜索,我决定编写自己的版本,而不查看常规方法。我碰巧编写了以下代码,其中我将常规方法的时间复杂度与我自己的二分搜索版本进行了比较。 虽然,我的二分搜索似乎集成了线性搜索和二分搜索,但它似乎比常规方法更快,我只是不明白为什么。当键大于中间元素时使用线性搜索,这似乎实际上会增加搜索的时间复杂度。您可以在“myBinarySearch”方法中最后一个 else if 条件的代码中看到这一点。然而,即使在搜索数组的 15,000 个整数之后,我的版本仍然更快。
谁能向我解释一下为什么我的版本更快?下面是与我的二分搜索版本相比的常规方法。我的版本只是在搜索不存在的key且过度的时候比较慢,比如搜索16000。它一定是过多了,因为搜索 15,001 确实会导致返回 -1 的时间更快。
我得出的结论是,这是因为我只使用了一个变量,而不是在常规方法中使用 3 个变量,常规方法在循环数组时检查和/或更新这些变量。尽管如此,我的方法中最后一个 else if 语句中的线性搜索让我感到困惑,并让我想知道这如何不会增加时间复杂度。
public static void main(String[] args) {
int[] array = new int[15000];
File file;
BufferedReader br;
try {
file = new File("../Java/bin/IntroToJavaBook/largeArray.txt");
br = new BufferedReader(new FileReader(file));
String st;
int i = 0;
while((st = br.readLine()) != null)
{
array[i] = Integer.parseInt(st);
i++;
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
int key = 4200;
long startTime = System.nanoTime();
System.out.println(binarySearch(array, key));
long endTime = System.nanoTime();
long duration = (endTime - startTime);
System.out.println(duration);
long startTime1 = System.nanoTime();
System.out.println(myBinarySearch(array, key));
long endTime1 = System.nanoTime();
long duration1 = (endTime1 - startTime1);
System.out.println(duration1);
}
static int binarySearch(int[] array, int key) {
int low = 0;
int high = array.length - 1;
while (high >= low)
{
int mid = (low + high) / 2;
if (key < array[mid])
{
high = mid - 1;
}
else if (key == array[mid])
{
return mid;
}
else
{
low = mid + 1;
}
}
return -1;
}
static int myBinarySearch(int[] array, int key) {
int half = array.length/2;
while(true)
{
if(half == 0 || half == array.length)
{
return -1;
}
else if(key < array[half])
{
half /= 2;
}
else if(key == array[half])
{
return half;
}
else if(key > array[half])
{
half = half + 1;
}
}
}
最佳答案
您将复杂性与速度混淆了。就复杂性而言,即使您使用 n=500 运行测试,n>1000。
关于java - 创建了我自己的二分搜索版本,不明白为什么它比常规方法更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59570981/
我正在尝试编写一个程序,在名为 items 的数组中进行顺序搜索和二分搜索,该数组具有 10000 个已排序的随机 int 值。第二个名为 targets 的数组加载了 1000 个 int 值(50
当我尝试使用图表并为其编写一些代码但没有成功时,我遇到了一个问题:/!! 我想创建一些东西来获取图形数据并检查它是否:1- 连接2-二分法3-有循环4-是一棵树 所以我想知道,例如,是否可以将其写入以
我是一名优秀的程序员,十分优秀!