当前位置: 首页 > 知识库问答 >
问题:

分治算法计算数组中元素的外观,而不进行排序

严正初
2023-03-14

我和朋友在讨论是否可以在不排序数组的情况下,使用分治算法计算数组a[1…n]中出现的某个元素k的数量?

我们遇到了一个障碍,如果我们使用二进制搜索,一旦找到元素,它就会停止。有什么想法吗?

共有1个答案

濮阳俊明
2023-03-14

正如其中一条评论所提到的,二进制搜索用于在排序数组中查找一个元素,而在您的问题中似乎并非如此。

一个简单的分治算法将是将数组分解为更小的部分,并解决它们上的问题。例如,如果算法的输入是中的数组和valuek,您可以编写一个函数,将数组除以二并计算每个部分中出现的次数,然后将它们相加。

此函数获取给定向量中的值。最初使用left=0right=in调用此函数。size()

int NumberOfOccurances(const vector<int> &in, int k, 
                       int left, int right){
   // Base case when the size of the array is 1:
   if(right - left==1){
     return in[0] == k ? 1 : 0;
   } else {
     // Otherwise, break it into two subproblems.
     int mid = (left + right) / 2;
     return NumberOfOccurances(in, k, left, mid) +
            NumberOfOccurances(in, k, mid, right)
   }
}

除2之外,还可以除3、4或其他整数值。

 类似资料:
  • 如果数组中一半以上的元素相同,则称数组具有多数元素。是否有一种分治算法来确定数组是否具有多数元素? 我通常会执行以下操作,但它不是使用“分而治之”。我不想使用Boyer-Moore算法。

  • 我有一个问题,试图实现一个算法使用分而治之。 给定一个未排序的数组tv[]查找该数组的de v[k]元素,就好像该数组已排序,但没有对数组v排序一样。 例如,如果k=3且v={2,-1,-6,7,4},则该数组的k元素为2。 因为我无法编辑传递的数组,所以我无法想出另一种方法来对数组进行排序,而不将其保存在另一个局部变量上,或者尝试像快速排序一样分割数组,并返回v的最后一个元素的位置。 如果有帮助

  • 假设坐标(x1,y1)上的一个点支配另一个点(x2,y2)如果x1≤x2,y1≤y2; 我有一组点(x1,y1),...(xn,yn),我想找到支配对的总数。我可以通过比较所有点来使用蛮力,但这需要时间O(n2)。相反,我想使用分而治之的方法在时间O(n log n)中解决这个问题。 现在,我有以下算法: 所以y坐标的两个半部分是:{1,3,4,5,5}和{5,8,9,10,12} 我画分界线。

  • 这学期我们学习了分而治之,在分而治之中,问题被分成子问题,然后像合并排序或快速排序一样解决。 虽然我发布这个问题不是为了让你们解决我的作业,我们的教授给了我们一个任务,让我们把冒泡排序作为一种分治算法来实现,现在我坐在笔记本电脑上,几天都在挠头,想知道冒泡排序是如何分治算法的。 如果我试图将冒泡排序实现为分治,数组必须被分割,当我将数组划分为最后一个元素,然后将其合并回已排序的形式时,算法就变成了

  • 我在分而治之的算法上遇到了一点麻烦,正在寻找一些帮助。我试图编写一个名为sumArray的函数,它计算整数数组的和。 此函数必须通过将数组一分为二并对每一半执行递归调用来完成。我曾尝试使用类似的概念,当我编写递归和算法和分治算法来识别数组中的最大元素时,我使用了这些概念,但我很难将这两个想法结合起来。 下面是我为sumArray编写的代码,它编译,但没有返回正确的结果。

  • 主要内容:分治算法的利弊,分治算法的应用场景实际场景中,我们之所以觉得有些问题很难解决,主要原因是该问题涉及到大量的数据,如果只需要处理少量的数据,问题会变得非常容易解决。 举一个简单的例子,设计一个排序算法实现对 1000 个整数进行排序。对于很多刚刚接触算法的初学者来说,直接实现对 1000 个整数进行排序是非常困难的。而同样的问题,如果转换成对 2 个整数进行排序,解决起来就很容易。 分治算法中,“分治”即“分而治之”的意思。分治算法