JavaScript 在已排序列表中搜索项目的最佳方法是什么
在给定的问题声明中,我们被要求找到使用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小于搜索项,则将middle计数增加1。否则,将middle计数减1。
步骤7 - 这就是递归二分搜索的工作原理。现在,在此步骤中定义一个排序列表和搜索项,并调用该函数以获取输出。
示例
// define function for binary search
function itemSearch(list, searchItem) {
let left = 0;
let right = list.length - 1;
// loop for finding the element
while (left <= right) {
const middle = Math.floor((left + right) / 2);
const middleElement = list[middle];
// condition for search item
if (middleElement === searchItem) {
return middle;
} else if (middleElement < searchItem) {
left = middle + 1;
} else {
right = middle - 1;
}
}
return -1;
}
// create search list
const searchList = [11, 13, 15, 17, 19];
const searchingFor = 15;
// calling the function
const foundIndex = itemSearch(searchList, searchingFor);
// condition for found or not found
if (foundIndex === -1) {
console.log("Element has not found.");
} else {
console.log(`Element found at index ${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)。该方法不断将排序列表一分为二,并将搜索术语与中间元素进行比较。并允许它快速缩小搜索内存,直到发现搜索项不在列表中。