在今天的编程世界中,尤其是随着深度学习算法的兴起,线性搜索对每个程序员来说都是必学的。这个适合初学者的工具为开发打开了新的可能性,而且非常容易理解!
线性搜索在许多现代编程项目中都有应用,我们希望你学习基本原理,以便在阅读完本文后可以在你的项目中使用它。
顺便说一下,即使我们今天使用的是c语言,线性搜索在所有编程语言中都有应用,所以请随意将示例转换为你熟悉的语言。话不多说,让我们开始吧!
什么是线性搜索?
搜索算法用于检查特定元素是否存在于某种数据结构中,例如数组或列表。如果目标元素存在,则可以识别它并继续执行进一步的逻辑操作。
搜索算法可以广泛分为两类。顺序搜索算法是最简单的,因为它们逐个检查数组的每个元素(例如线性搜索)。
我们还有区间搜索算法,用于处理排序的数据结构,并且比顺序搜索算法更快更高效。
例如,二分搜索通过重复将数组或其他类型的数据排列一分为二,直到找到目标。
在使用编程中使用的各种搜索算法中,线性搜索是最有用的之一。正如你将在下一节中了解到的,它的可用性和复杂性之比非常高。
线性搜索如何工作?
我们现在大致了解了线性搜索的作用,但事实上我们只是触及了表面。在本节中,我们将解释此代码的语法是如何工作的,以便您可以更直观地了解该算法的内部工作原理。
要开始使用线性搜索,您首先必须输入将要搜索的元素。然后,从第一个元素开始,将使用某种条件检查列表中的每个元素。
如果找到该元素,则可以返回其值和索引位置。如果没有找到,则返回“-1”,表示没有与我们所寻找的元素相对应的元素。让我们看一个快速的示例。
#include
int search(int arr[], int n, int x)
{
int i;
for (i = 0; i < n; i++)
if (arr[i] == x)
return i;
return -1;
}
在上面的示例中,首先,我们编写了一个条件,用于在arr[]中搜索x。如果找到,该条件返回索引值;如果未找到,则返回-1。现在让我们在此基础上构建一个功能性的示例。
功能性语法示例
我们将向我们的示例添加第二个部分,并希望您密切注意它们之间的关系。
#include
int search(int arr[], int n, int x)
{
int i;
for (i = 0; i < n; i++)
if (arr[i] == x)
return i;
return -1;
}
int main(void)
{
int arr[] = { 2, 3, 4, 10, 40 };
int x = 10;
int n = sizeof(arr) / sizeof(arr[0]);
int result = search(arr, n, x);
(result == -1)
? printf("element is not present in array")
: printf("element is present at index %d", result);
return 0;
}
现在我们通过添加另一个条件部分扩展了功能。在这个部分中,我们定义了arr []的值,即我们想要找到的数字,以及数组的长度。
最后,如果找到目标值,我们将其打印在其对应的索引值旁边。如果找不到,则打印一个字符串,通知目标值无法找到。让我们看看这段代码的输出:
线性搜索的一个功能示例。
©jingzhengli.com
现在,让我们看看如果将目标值更改为整数2会发生什么:
使用“2”作为输入值的线性搜索。
©jingzhengli.com
所以,虽然你可以显然地玩弄代码的第二部分,并使其打印一个不同的句子,但在大多数情况下,它就是这么简单!
时间复杂度解释
我们之前提到,间隔搜索算法比线性搜索更快,更高效。但是,为什么呢?
这完全归结于时间复杂度,即搜索操作完成所花费的时间。时间复杂度将根据数组的长度和我们正在进行的操作类型而变化。
间隔搜索的逻辑(我们将在另一篇文章中介绍)总是更快。这意味着尽管线性搜索的时间复杂度(定义为o(n))比二分搜索慢,但两者都会返回相同的值。
在理想环境中使用线性搜索,我们将在数组的第一个位置找到目标,结果是o(1)的时间复杂度。最坏情况下的时间复杂度将等于数组的长度,意味着目标将在最后一个位置。
如果我们期望的目标位置可以随机变化,你可以看到线性搜索是一种非常低效的方法。
你现在应该明白线性搜索不适用于处理大量数据。因此,相反地,当处理需要简单解决方案的小数据样本时,线性搜索是一个很好的选择。
线性搜索有哪些优势?
即使线性搜索比其他搜索算法更慢,但它确实具有使它成为程序员的独特选择的一些优点。
例如,线性搜索可以与任何类型的数据集合一起使用。无论它是排序还是未排序的,线性搜索都可以找到我们的目标值,无论我们的集合多么混乱。
此外,目标值可以是任何类型的数据,例如字符串或布尔值。让我们记住我们的代码示例:
#include
int search(int arr[], int n, int x)
{
int i;
for (i = 0; i < n; i++)
if (arr[i] == x)
return i;
return -1;
}
看到这个逻辑如何适用于任何数据数组,即使它完全是未排序和混乱的吗?线性算法会检查集合中的每个可能性,直到元素匹配我们的目标。让我们重新定义我们的数组,使其更随机。
线性搜索与更随机结构化数组一起工作的示例。
©jingzhengli.com
即使我们的数组是随机组织的,线性搜索也会在足够的时间内找到我们的目标。而且,使用间隔搜索算法进行相同操作将是不可能的,因为它无法处理未排序的数据结构。
所以,尽管线性搜索在表面上看起来效率低下,但实际上是一种非常高尚的算法。
结论:c中的线性搜索示例
让我们回顾一下!我们已经学习了什么是线性搜索以及我们可以用它做什么。我们通过一个巨大的代码示例回顾了它的基本特性。此外,我们讨论了它的最佳用途和缺点。
我们还稍微深入了一下时间复杂度的概念,它是如何工作以及如何定义任何搜索算法的效率。现在,您可以决定哪种搜索算法最适合您的特定代码。
我们建议您将这些示例保存在手边,需要时随时查看。实际上,您可以将我们的示例复制粘贴到c解释器中,并立即开始使用它。
请记住,您始终可以与您偏好的任何在线资源一起使用 c 的官方文档作为参考。