C++ 在未排序的数组中进行前向和后向搜索

C++ 在未排序的数组中进行前向和后向搜索

未排序的数组 - 数组是一种数据结构,由相同类型的元素集合组成。未排序的数组是一种结构,其中元素的顺序是随机的,即在插入时,元素被添加到最后,无论之前元素的顺序如何,并且由于元素定位的缺乏模式,任何搜索算法对于在这样的数组中的搜索都没有帮助。

搜索 - 在数组中搜索意味着查找数组中的特定元素,这可以是返回所需元素的位置或返回一个布尔语句,指定元素是否存在于数组中。

  • 前向搜索 - 在数组中进行前向搜索意味着从第0个索引即第一个元素开始进行线性搜索遍历。

  • 后向搜索 - 在数组中进行后向搜索意味着从(n-1)个索引即最后一个元素开始进行线性搜索遍历。

问题陈述

给定一个搜索元素x,查找x是否在以下情况下出现-

  • 一个具有相同大小元素的数组,即整数数组。

  • 一个具有不同大小元素的数组,即字符串数组。

示例1

Input: x = 4, [6, 1, 4, 10, 2]
Output: TRUE

解释 − 在给定的数组中,4在第2个索引位置上。

示例2

Input: x = “high”, [“goat”, “ice”, “hgh”]
Output: False

解释 - 在给定的数组中,“high”不存在。

解决方法

如上所述,前向搜索从第一个元素开始,后向搜索从最后一个元素开始。将这两种方法结合起来,可以将在数组中查找元素的时间减少一半,因为在同时进行数组的前半部分和后半部分检查。

为了查找数组中是否存在某个元素,将first和last定义为数组的第一个和最后一个元素。如果first或last中的任何一个是所需的元素,则返回true;否则将first增加一,last减少一,并继续直到找到该元素。如果在完整遍历时first和last相等,则表示元素未找到,返回false。

伪代码

procedure frontBack (arr[], x)
   first = 0
   last = n - 1
   while first <= last
      If arr[first] == x or arr[last] == x
         ans = true
       end if
      front = front + 1
      last = last - 1
   ans = false
end procedure

示例:C++实现

在下面的程序中,我们取一个整数数组的第一个情况。取一个首部和一个尾部变量,同时检查第一个和最后一个元素,以找到所需的元素。如果找到元素,则返回true,否则继续移动到下一个元素并重新检查。

#include <bits/stdc++.h>
using namespace std;
// Function to front back search an element in the array
bool frontBack(int arr[], int x){
   int first = 0, last = 9;

   // loop execute till the element is found or traversal completes
   while (first <= last){
      if (arr[first] == x || arr[last] == x){
         return true;
      }
      first++;  // Incrementing first
      last--;  // Decrementing last
   }
   return false;
}
int main(){
   int arr[10] = {21, 43, 10, 19, 3, 56, 91, 20, 5, 79};
   int x = 55;
   cout << "In the array : ";
   for (int i = 0; i < 10; i++){
      cout << arr[i] << " ";
   }
   cout << "\nElement " << x;
   if (frontBack(arr, x)){
      cout << " is present.";
   }
   else{
      cout << " is not present.";
   }
   return 0;
}

输出

In the array : 21 43 10 19 3 56 91 20 5 79 
Element 55 is not present.

时间复杂度 − O(n/2),因为同时从两边查找可以减少一半的时间。

空间复杂度 − O(1)

示例

在下面的程序中,我们采用字符串数组的第二种情况。通过取一个前变量和一个后变量,同时检查第一个和最后一个元素来找到所需的元素。如果找到元素,则返回true,否则继续查找下一个元素,并再次检查。

#include <bits/stdc++.h>
using namespace std;
// Function to front back search an element in the array
bool frontBack(string arr[], string x){
   int first = 0, last = 9;

   // loop execute till the element is found or traversal completes
   while (first <= last)    {
      if (arr[first] == x || arr[last] == x)        {
         return true;
      }
      first++; // Incrementing first
      last--; // Decrementing last
   }
   return false;
}
int main(){
   string arr[4] = {"hi", "high", "goat", "goa"};
   string x = "goat";
   cout << "In the array : ";
   for (int i = 0; i < 4; i++) {
      cout << arr[i] << ", ";
   }
   cout << "\nElement " << x;
   if (frontBack(arr, x)) {
      cout << " is present.";
   }
   else {
      cout << " is not present.";
   }
   return 0;
}

输出

In the array : hi, high, goat, goa, 
Element goat is present.

时间复杂度 – O(n/2),因为从两边搜索可以将时间减半。

空间复杂度 – O(1)

结论

总之,数组的前后搜索类似于常规的线性搜索,不同之处在于它同时检查两个元素,从而将时间消耗减半。因此,将无序数组中搜索的最坏时间复杂度从O(n)转换为O(n/2)。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程