【问题标题】:Searching the element in array with complexity better than O(n)比 O(n) 更复杂地搜索数组中的元素
【发布时间】:2018-01-13 03:42:34
【问题描述】:

我有任何数组,其中元素首先按升序排列,然后按降序排列

类似于 A[10]={1,4,6,8,3,2} ,数组中没有重复项。

如果输入是7,输出应该是,元素不存在。

时间复杂度应该比 O(n) 好

我通过线性搜索得到结果,将每个元素与找到的元素进行比较。但是因为我想要更好的解决方案然后 O(n)

我尝试找到数组元素翻转的枢轴,然后从(0 到枢轴元素)搜索,然后再次搜索(最后一个元素到枢轴元素)。

请提出建议。 对于 O(n)

 #include<iostream>
 int main()
 {
     int A[10]={1,4,6,8,3,2};
     int i,num
     cout<<"Enter the element to be searched";
     cin>>num
     for(i=0;i<10;i++)
     {
         If(A[i]==num)
        {
          cout<<"Element exist";
         break;
      }
         else
         cout<<"Element do not exist";
     }
 }

【问题讨论】:

  • 所以你尝试了一些东西。你的代码在哪里?
  • 搜索二分法算法。它在 O(logN) 中完成这项工作。
  • 您还可以构建二叉树并从内部搜索。它需要 O(logN)。二分法与二叉树的思想相同,而不仅仅是构建它。
  • 我猜你想要一个代码来做到这一点。分享你在 O(n) 中做了什么。将代码添加到问题的正文中。

标签: c++ algorithm data-structures time-complexity


【解决方案1】:

算法:

  1. 通过二分法查找 log(n) 中的最大值并保存其索引。
  2. 在 max 的两侧进行二分搜索。
  3. 如果未找到且元素不等于最大值,则它不存在。

第一步怎么做?

  • 选择数组的中间
  • 对照左边的项目(你的邻居)检查它。如果更大,则最大值位于右侧。否则,我们从递减序列开始,最大值在左侧。选择在右侧/左侧搜索的方式取决于左侧的项目是更大/更小。

编辑
以防万一:如果你选择第 n/2 个元素并且结果最大值在左侧,那么你选择第 n/4 个元素,如果最大值在它的右侧,你只继续搜索在n/4...n/2 元素范围内。

【讨论】:

  • 你应该明确如何通过二分搜索找到最大值。
  • 二分搜索是一种相当简单的算法,只要指定搜索条件(即搜索的内容)即可。
  • @YvesDaoust 立即查看。
  • @TonyTannous:重要的是你必须比较相邻的元素。 (实际上,您正在对一阶差分中的 0 执行标准搜索。)
  • @YvesDaoust 检查左边的元素是你的邻居。
猜你喜欢
  • 2011-09-08
  • 1970-01-01
  • 2015-01-15
  • 2019-04-07
  • 2014-10-23
  • 1970-01-01
  • 1970-01-01
  • 2021-08-24
  • 1970-01-01
相关资源
最近更新 更多