SDET:简单算法 - 线性与二进制搜索
SDET:简单算法 - 线性与二进制搜索
嗨,亲爱的,IT 专家
今天,我想开始谈论算法。没有比从搜索算法开始更简单的方法了。那么,让我们开始吧。
有两种最常用的搜索算法:
- 线性搜索
- 二进制搜索
让我们跳起来解释它们中的每一个
线性搜索算法
该算法对数组中的数据执行顺序搜索。
假设您有一列火车,正在寻找一些乘客。你从一个车厢移动到另一个车厢,直到你没有找到它或者你已经到了火车的尽头
听起来很清楚?
让我们跳到代码。
假设我们想要找到乘客的索引。我们只需要使用 for 循环并跟踪每个乘客:
让我们使用这个方法:
就如此容易!!!
时间复杂度: 由于我们的搜索仅取决于数组大小并且我们只比较每个元素一次,这意味着我们有 线性时间 O (n) 复杂度。 没关系,仅供参考。
您可能会理解,如果我们的列表/数组未排序,则应使用线性搜索算法。
对于已排序的数组,最好使用下一个搜索算法。
二分搜索算法
这一次,我们按字母顺序对所有乘客进行了排序。或许我们可以节省我们的精力并通过将车厢分成两半来搜索我们的乘客,直到我们没有找到我们的乘客或者如果我们没有这样的人就找不到了。
- 假设我们想要找到“A”。我们正在计算中间车厢。我们总共有六节车厢。所以,让我们把六分成两半。它表示三号车厢或“J”。
- 首先让我们验证“A”是否等于“J”。不,这意味着这不是我们正在寻找的价值。
- “A” > “J” 吗?不,这意味着我们不应该在 J 之后的车厢里搜索
所以,让我们把最高的马车换成“J”-1。现在,最高的马车是“D”。最低的将是相同的——“A”。
- 下一阶段,让我们再次计算中间。我们只剩下两节车厢了。因此,中间将是 1 或“A”。
- 让我们验证“A”是否等于“A”。答对了。这就是它的工作原理。
- 我想现在你明白了一个原则。它将以类似的方式在另一个方向工作。但这一次您将更改左边缘索引。
现在,让我们跳到代码:
所以,我们有一个数组,它的低索引和最高索引。此外,我们有一个我们想要找到的值。
公共静态 bool BinarySearchRecUtil(int[] arr, int low, int high, int value)
我们打算递归地使用这个方法,所以,让我们首先验证我们的低索引是否大于高。
如果不是,则意味着我们已经跟踪了所有数组并且没有找到任何东西。因此,我们可能会返回 false。
如果(低>高)
{
返回假;
}
下一行,找到当前迭代中间索引。
int mid = (low + high) / 2;
让我们验证我们当前的中间索引元素是否等于搜索条件
如果是,宾果游戏!!!我们找到。
if (arr[mid] == 值)
{
返回真;
}
接下来,我们要验证我们当前的中间元素是否小于搜索条件。如果它小于,那么让我们调用我们的方法,将 middle+1 添加到我们的左索引。所以,我们把一半分成右边的部分。
否则 if (arr[mid] < 值)
{
return BinarySearchRecUtil(arr, mid + 1, high, value);
}
如果之前的验证是假的,让我们做一个类似的操作,但方向不同。这次我们需要将我们的右边缘索引更改为中间值 -1
别的
{
return BinarySearchRecUtil(arr, low, mid — 1, value);
}
二进制搜索看起来比线性搜索要难一些。无论如何,这并不像你想象的那么难。请仔细检查代码几次,你会明白的。
时间复杂度: 每次搜索迭代都会将数组减少一半。 **** 二分查找的时间复杂度为 O(LogN) 或对数时间 — O (log n)
因此,您可能理解,此算法是排序数组的最佳实践。如果您可以将其分成两半并比较结果,则没有理由按顺序进行操作。
结尾
我们学习了两种最简单的算法。无论如何,如果您想发展自己的编程技能,熟悉它们会很有用。
祝你好运!
谢谢!!!
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明