在 JavaScript 中,在排序列表中搜索项目的最佳方法是什么?

javascriptweb developmentfront end technologyobject oriented programming更新于 2025/1/17 8:12:17

在给定的问题陈述中,我们被要求借助 javascript 功能找到在排序列表中搜索元素的最佳方法。当我们谈论对任何列表或数组进行排序时,二分搜索算法是数据结构中的最佳方法。

在 JavaScript 中,在排序列表中进行二分搜索是什么?

让我们了解 JavaScript 中列表的工作原理。

列表是存储多个元素的对象。在编程中,列表是类似数据元素的集合。由于列表也是一个对象,因此它具有一些属性和方法,使在 JavaScript 中使用列表更容易。

以下是在 JavaScript 中定义列表的语法:-

list = [
    { day: 'Monday', reading: 3, id: 201},
    { day: 'Tuesday', reading: 5, id: 202},
    { day: 'Sunday', reading: 6, id: 405}
];

在数据结构中,二分搜索是一种在排序列表中搜索项目的非常有效的方法。二分搜索基本上采用分而治之的方法。这种方法需要 O(log n) 时间,比线性搜索更好,因为线性搜索算法需要 O(n) 时间。

二分搜索可以使用迭代和递归方法实现。

我们给出了一个排序列表。我们的任务是借助二分搜索找到列表中元素的索引。所以我们将通过一个例子来理解这一点:

Input array = {2, 4, 6, 8, 10, 12}
        a = 5
Output : Item found!

Input array = {2, 4, 6, 8, 10, 12}
        a = 7
Output : Item not found!

查找元素的逻辑

在 javascript 中,在排序列表中查找项目的最简单方法是使用二分搜索算法。

该算法采用分治法。因此,在分治法中,我们将排序列表分成两半,并将搜索元素与中间项进行比较。

如果中间元素与搜索元素相似,则搜索任务完成。否则,我们检查搜索项是否小于中间元素,搜索将继续在列表的左半部分进行。如果搜索项大于中间元素,则我们在排序列表的剩余右侧进行搜索。如果中间元素与搜索元素相似,则搜索任务完成。否则,我们检查搜索项是否小于中间元素,搜索将继续在列表的左半部分进行。如果搜索项大于中间元素,则我们在排序列表的剩余右侧进行搜索。

算法

步骤 1 - 声明一个名为 itemSearch 的函数,以列表和要搜索的元素作为参数。

步骤 2 - 声明左指针变量和右指针变量以查找搜索元素的确切位置。

步骤 3 - 我们在步骤 1 中声明的函数基本上是一个递归函数。该函数使用其中的 while 循环工作。此循环将一直运行,直到左侧元素小于或等于右侧元素为止。

步骤 4− 现在继续,在 while 循环之后,我们将通过将左侧和右侧元素相加并将和除以 2 来计算中间元素。所以在这一步中,我们有了中间元素。

步骤 5− 需要针对该特定中间元素递归执行以下步骤 4。接下来,我们将检查搜索项是小于还是大于中间项。如果它小于搜索词,则在列表的左侧找到它,否则在中间元素的右侧搜索。

步骤 6− 现在,为了检查搜索词,我们将使用中间变量来检查中间元素的条件。如果 middleElement 小于搜索项,则将中间计数增加 1。否则将中间计数减少 1。

步骤 7− 这是递归二分搜索的工作方式。现在在此步骤中定义一个排序列表和搜索项,并调用该函数以获取输出。

示例

// 定义二分搜索函数
function itemSearch(list, searchItem) {
    let left = 0;
    let right = list.length - 1;
    
    // 循环查找元素
    while (left <= right) {
        const middle = Math.floor((left + right) / 2);
        const middleElement = list[middle];
        
        // 搜索项的条件
        if (middleElement === searchItem) {
            return middle;
        } else if (middleElement < searchItem) {
            left = middle + 1;
        } else {
            right = middle - 1;
        }
    }
    
    return -1;
}

// 创建搜索列表
const searchList = [11, 13, 15, 17, 19];
const searchingFor = 15;

// 调用函数
const foundIndex = itemSearch(searchList, searchingFor);

// 找到或未找到的条件
if (foundIndex === -1) {
    console.log("Element has not found.");
} else {
    console.log(`在索引 ${foundIndex} 处找到元素。`);
}

输出

 Element fFound at index 2.

上述代码是人们在查看问题陈述时能想到的非常简单的代码,但理解了这个逻辑之后,你可以通过使其更灵活和简单来优化它,以获得更好的空间和时间质量。

在上面的代码中,我们声明了一个函数,该函数以列表和搜索项作为输入。然后我们一步一步来,首先通过获取中间元素将列表分成两半。然后通过比较这个元素,借助它来搜索所需的元素。

在代码中,itemSearch 函数用于在排序列表 [11, 13, 15, 17, 19] 中搜索数字。该函数返回索引值 15,即 2。这表明在索引 2 处找到了搜索项。

时间复杂度

因此,排序列表的长度为 n,这决定了二分搜索算法的时间复杂度,即 O(log n)。这是因为搜索空间的大小随着循环的每次迭代而减半。作为输出,找到一个项目所需的搜索次数等于列表的大小。

除了输入列表的大小之外,此技术还需要恒定的内存。因此,其空间复杂度为 O(1)。因为该算法只需保存少量变量即可跟踪当前搜索空间和搜索元素的位置。

结论

这就是我们解决上述问题陈述的方法。在 JavaScript 中搜索排序列表中元素的最简单、最可靠的方法是借助二分搜索算法。此方法的时间复杂度为 O(log n),空间复杂度为 O(1)。该方法不断将排序列表分成两半,并将搜索词与中间元素进行比较。并允许它快速缩小搜索内存,直到发现搜索项不在列表中。


相关文章


有用资源