如何在较高和较低数字的数组中将搜索算法调整为复杂度(3n / 2) - 2?

问题描述 投票:-1回答:1

我有一个程序,它在C ++语言的n个元素数组中搜索最大和最小的数字。我想要做的是降低(3n / 2) - 2算法的复杂性,#include <iostream> using namespace std; int main(){ int arreglo[10] = {9,8,7,6,5,4,3,2,1,0}; int menor =0, mayor =0, comparaciones=0; menor = arreglo[0], mayor = arreglo[0]; for(int i=1;i<10;i++){ if(arreglo[i]>mayor){ mayor = arreglo[i]; } comparaciones++; if(arreglo[i]<menor){ menor = arreglo[i]; } comparaciones++; } cout<<"Mayor: "<<mayor<<" Menor: "<<menor<<" Comparaciones: "<<comparaciones; } 目前不能满足这种复杂性。

这种复杂性是最糟糕的情况

我的问题是如何将此算法保留为上述复杂度公式?或者我可以修改,删除和添加哪些内容以符合该条件?

谢谢。比较算法如下:

5n-2

更新:该算法具有(3n / 2) - 2的复杂度方程,我必须将其复杂性降低到Divide and Conquer

c++ time-complexity complexity-theory
1个回答
1
投票

该解决方案使用this website范例。

我根据(3n / 2) - 2得出这个答案,在那里你可以看到为什么这将采取#include <iostream> using namespace std; int* maxMin(int* values, int begin, int end) { int partialSmallest, partialLargest; int mid, max1, min1, max2, min2; //Here we store Largest/Smallest int* result = new int[2]; //When there's only one element if (begin == end) { partialSmallest = values[begin]; partialLargest = values[begin]; } else { //There is not only one element, therefore //We will split into two parts, and call the function recursively mid = (begin + end) / 2; // Solve both "sides" int* result1 = maxMin(values, begin, mid); int* result2 = maxMin(values, mid+1, end); max1 = result1[0]; min1 = result1[1]; max2 = result2[0]; min2 = result2[1]; //Combine the solutions. if (max1 < max2) partialLargest = max2; else partialLargest = max1; if (min1 < min2) partialSmallest = min1; else partialSmallest = min2; } result[0] = partialLargest; result[1] = partialSmallest; return result; } int main(){ int values[10] = {9,8,7,6,5,4,3,2,1,0}; int* finalResult = maxMin(values, 0, 9); cout << "Largest: " << finalResult[0] << " Smallest: " << finalResult[1]; } 比较的解释。

为了理解它是如何工作的,我建议使用较小的输入(例如:{3,2,1,0})获得笔和纸并遵循代码。

qazxswpoi
© www.soinside.com 2019 - 2024. All rights reserved.