Data Structures Algorithms 简明教程

Jump Search Algorithm

跳跃搜索算法是线性搜索算法的一个稍微修改的版本。此算法背后的主要思想是通过比较比线性搜索算法更少的元素来降低时间复杂度。因此,对输入数组进行排序并将其划分为块以在跳过这些块时执行搜索。

例如,我们来看看以下给出的示例:对排序后的输入数组按每个 3 个元素的块进行搜索。所需键只在 2 次比较后找到,而不是线性搜索的 6 次比较。

Jump Search

在此,出现了一个关于如何划分这些块的问题。为了回答这个问题,如果输入数组的大小为“n”,则块被划分为 √n 的间隔。每个块的第一个元素都将与关键元素进行比较,直到关键元素的值小于块元素。由于输入已排序,因此仅对上一个块执行线性搜索。如果找到该元素,则搜索成功;否则,返回搜索失败。

跳跃搜索算法将在本章中详细讨论。

Jump Search Algorithm

跳跃搜索算法将一个排序数组作为输入,将其划分成较小的块以使搜索变得更简单。算法如下−

*第 1 步 *−如果输入数组的大小为“n”,则块的大小为 √n。将 i = 0。

*第 2 步 *−将要搜索的键与数组的第 i 个元素进行比较。如果匹配,则返回元素的位置;否则,i 将增加块大小。

*第 3 步 *−重复第 2 步,直到第 i 个元素大于关键元素。

*第 4 步 *−现在,考虑到输入数组已排序,该元素被认为在先前的块中。因此,对该块应用线性搜索以找到该元素。

*第 5 步 *−如果找到了该元素,则返回该位置。如果未找到该元素,则提示搜索失败。

Pseudocode

Begin
   blockSize := √size
   start := 0
   end := blockSize
   while array[end] <= key AND end < size do
      start := end
      end := end + blockSize
      if end > size – 1 then
         end := size
   done
   for i := start to end -1 do
      if array[i] = key then
         return i
   done
   return invalid location
End

Analysis

跳跃搜索技术的算法复杂度为 O(√n) ,空间复杂度为 O(1)

Example

让我们通过从给定的排序数组 A 中搜索元素 66 来理解跳跃搜索算法,如下所示 −

jump search algorithm

Step 1

初始化 i = 0,且输入数组“n”的大小 = 12

假设将块大小表示为“m”。则,m = √n = √12 = 3

Step 2

将 A[0] 与关键元素进行比较,并检查它是否匹配,

A[0] = 0 ≠ 66

因此,i 以块大小 = 3 递增。现在与键元素比较的元素是 A[3]。

compare index 3

Step 3

A[3] = 14 ≠ 66

由于不是匹配项,i 再次以 3 递增。

incremented 3

Step 4

A[6] = 48 ≠ 66

i 再次以 3 递增。将 A[9] 与键元素进行比较。

compare with index 6

Step 5

A[9] = 88 ≠ 66

但是,88 大于 66,因此在当前块上应用线性搜索。

88 greater than 66

Step 6

应用线性搜索后,指针从第 6 个索引递增到第 7 个。因此,将 A[7] 与键元素进行比较。

returns 7th index

我们发现 A[7] 是所需元素,因此程序返回第 7 个索引作为输出。

Implementation

跳跃搜索算法是线性搜索的扩展变体。该算法将输入数组分成多个小块,并在假设包含该元素的单个块上执行线性搜索。如果在假设的块中找不到该元素,它将返回不成功的搜索。

输出打印元素在数组中的位置,而不是其索引。索引是指从 0 开始的数组的索引号,而位置则是存储元素的位置。