在脚本中搜索算法
通常,当我们需要从任何数据存储中查找数据时,有三种类型的搜索算法。它们是线性搜索、二进制搜索和哈希搜索。搜索意味着从数据集中查找数据记录,该数据集可以是任何地图或项目列表。每种搜索算法在使用它甚至将其应用于程序之前都有某些要求:
线性搜索 — 线性搜索需要应用于未排序的 Array,并且根据将每个元素与要搜索的目标进行比较来查找
二进制搜索 — 如果数组从相同的键或相同的方向排序,则二进制搜索是从数组中搜索元素的优化方法
如果我们想在 Hashmap 上进行搜索,我们将使用哈希算法来存储哈希的键并直接将其与值映射,而不是在 Array 中搜索。此算法的时间复杂度为 O(1),因为程序已经知道具有相同键的值的哈希或索引
线性搜索
在 JavaScript 中,我们在数组原型中有一个方法,该方法使用线性搜索来查找元素。让我们创建 find 的定义,以了解线性算法的工作原理find
下面是线性搜索的示例,其中我们首先在 Array 上创建了原型方法,并在运行提供的回调方法时迭代到所有元素,如果回调成功,则返回完整的对象
此算法的最坏情况是,目标元素将位于最后一个索引上,使其在 N 次时运行。因此,时间复杂度为 O(N),其中 N 是数组中的项数
二进制搜索
接下来是二进制搜索,但请记住,二进制搜索仅适用于排序的数组,因此首先,我们需要确保数组已排序
对象数组的注释:
在 JavaScript 中处理对象数组时,应使用要搜索的键对数组进行排序。例如,如果要在数组的对象中将名称作为属性之一进行搜索,则数组应仅根据名称字段进行格式化,而不是使用对象数组中的任何其他字段进行格式化
算法
在二进制搜索中,由于数组是按某种顺序排序的,我们可以使用这意味着我们知道应该去哪个路径来搜索目标元素。让我们举个例子来了解更多
如您所见,数组按 ASC 顺序对奇数进行排序。因此,为了慷慨,我们首先取一个中间元素(你可以取任何数字,但为了获得最准确的结果,你应该总是选择中间元素)
下一步是将目标元素与中间元素进行比较
我们也可以使用 end + start / 2,但如果数组大小很大,这将引发内存错误,因此最好使用上述方法来计算中间索引
如果我们找到元素,我们将返回中间元素,否则我们将检查
现在,您将基于上述条件获得一个新数组,然后我们需要重新执行相同的逻辑,直到数组大小变为一,并且我们找到元素
程序
讨论够了,让我们写一些代码,看看我们如何使它工作
我们将使用此集合来创建程序并观察数组是否按分数参数排序,我也想使用相同的参数进行搜索
在这里,我们维护数组的开始和结束,我们正在操作开始和结束以创建替代数组,同时检查目标是否匹配。
就是这样。您的二进制搜索已准备好满足您的目的。
二进制搜索的时间复杂度为 O(log n)。让我简要介绍如何计算其时间复杂度
计算时间复杂度
在计算之前,让我们看看需要对变量运行特定语句的次数
首先,执行的语句数在 2^n 部分中减少
现在,让我们为二进制搜索设计公式,因为它们中的每一个都是2的乘数,我们可以很容易地说
让我们在两边采取对账单
我们有一个对数公式
所以新的等式将是
这就是您计算二进制搜索的时间复杂度的方式。计算时间复杂度本身就是一个需要讨论的庞大话题,但我们只用了其中的一小部分来展示它是如何完成的。
散列法
哈希算法非常干净,仅特定于哈希映射。由于哈希图以知道条目键的模式存储数据,因此从中搜索是一个单一的调用。一个简单的例子是
哈希的时间复杂度为 O(1),因为响应操作不受哈希保存的项目数的影响