R语言程序实现数组二分查找


2023年3月2日, Learn eTutorial
5283

什么是二分查找算法?

二分查找算法又称“半区间算法”或“对数算法”。它可用于从大量元素列表中进行搜索。它在大列表上的工作速度比在顺序搜索中小列表上更快。

该算法首先找到中间元素并将其与搜索项进行比较,如果不同,则将数组分成两部分。一个左子数组,包含中间元素之前的元素,一个右子数组,包含中间元素之后的元素。现在,将根据搜索元素存在的可能性选择其中一个子数组继续搜索。此过程将一直持续到找到结果或子列表的大小减小到零。因此,它使用分而治之的方法在数组中搜索元素。二分查找的最坏情况时间复杂度是 O(logn)。

二分查找算法在已排序的数组中搜索元素。如果给定的数组未排序,则需要先对元素进行排序,然后才能进行搜索。

如何在 R 中实现二分查找?

  • 可以编写一个 `function` 在 R 中实现二分查找。已排序的数组和搜索项可以作为输入变量传递给该 `function`。
  • 使用 `while loop` 首先计算中间元素,然后检查中间元素是否与搜索项匹配,如果匹配则 `return` 中间元素的索引,
  • 现在通过比较它们的值来重新绑定要检查的列表,如果搜索元素 < 中间元素,则将右边界重置为中间元素之前的索引,否则将左边界重置为中间元素之后的索引。
  • 重复上述过程,直到子数组的大小减小到零。
  • 如果元素不存在,则在 `function` 的最后一条语句中 `return` 0
  • 在主程序部分,使用已排序的数组、搜索值调用 `function`,并根据 `function` 的 `return` 值 `cat` 输出结果。

现在,让我们看看二分查找算法的工作原理。

  1. 取一个数组 (4, 0, 3, 1, 5, 6, 2) 并搜索元素 4。
    Binary Serach Algorithm
  2. 对数组进行排序 (0, 1, 2, 3, 4, 5, 6)。我们有 0 在开头,6 在结尾,3 在中间,检查中间元素是否为 4。
    Binary Serach Algorithm
  3. 不是,而且搜索值 4 大于中间元素 3,所以现在要搜索的列表变为 (4,5,6),即右子数组。这里的中间元素是 5。然后检查中间元素是否为 5。
    Binary Serach Algorithm
  4. 不是,选择左子数组 (4)。我们找到了匹配项,所以返回 4 的索引。因此我们的搜索成功了。
    Binary Serach Algorithm

算法

步骤 1:编写一个 `function` binarySearch(),其中包含变量数组 arr 和搜索值 item

步骤 2:初始化变量 low 为 0,high 为最后一个索引。

步骤 3:启动一个 `while loop`,重复直到条件 low <= high

步骤 4:找到数组的中间索引 mid,并将中间元素与 item 进行比较,如果匹配则 `return` 中间元素的索引。

步骤 5:检查 item < arr[mid],如果是,则最后一个索引变为 high=mid-1,否则起始索引变为 low=mid+1。

步骤 6:现在以 `return` 0 结束 `function`,表示未找到匹配项。

步骤 7:初始化一个包含值的数组 arr 和要搜索的 item

步骤 8:对数组进行排序,并使用值 arritem 调用 binarySearch(),检查 `return` 值并 `cat` 输出适当的结果。

R 源代码

                                          binarySearch = function(arr,item) {
    low <- 1; high <- length(arr)
    while (low <= high){
        mid <- as.integer(round((low + high) / 2)) 
        if (abs(arr[mid] - item) ==0) {
            return(mid)
        } else if (arr[mid] < item) {
            low <- mid + 1
        } else {
            high <- mid - 1
        }
    }
    return(0)
}
arr <- c(4, 0, 3, 1, 5, 6, 2)
sorted_arr <- sort(arr)
item <- 4
cat("Array ", arr, "\nSorted array ",sorted_arr,"\nitem = ", item, "\n")
index <- binarySearch(sorted_arr, item)
if (index!=0){
    cat("Element is present at index ", index, "\n")
}else{
    cat("element not found")
}
                                      

输出

Array  4 0 3 1 5 6 2 
Sorted array  0 1 2 3 4 5 6 
item =  4 
Element is present at index  5