算法的空间复杂度和时间复杂度的策略:
1.多数情况下,算法的时间复杂度更加令人关注。2.因为计算机硬件的发展速度比软件的发展速度要快很多,所以如果有必要,我们可以增加额外的空间降低时间复杂度。3.同理,也可以增加算法的耗时来降低算法的空间复杂度。
我们看一个例子:
设计一个由自然数1-1000中某些数字所组成的数组中,每个数字可能出现零次或者多次。设计一个算法,找出出现次数最多的数字?
首先来看第一种解决方法:
#include <iostream>
using namespace std;
#define DIM(a) sizeof(a)/sizeof(*a) //求一个数组的长度
int search(int a[],int len)
{
int* sp=new int[1000];
int max=0;
int value=0;
for(int i=0;i<1000;i++)
{
sp[i]=0;
}
for(int i=0;i<len;i++)
{
for(int j=0;j<1000;j++)
{
if(a[i]==(j+1))
{
sp[j]++;
if(max<sp[j])
{
max=sp[j];
value=j+1;
}
break;
}
}
}
delete[] sp;
return value;
}
int main()
{
int a[]={9,9,9,1,1,1,2,2,2,6,6,6,4,4,4,7,7,7,7,7,7,9,9,9,9,9};
cout<<"Max:"<<search(a,DIM(a))<<endl;
return 0;
}
首先第一种解决方法,时间复杂度为O(n^2),而且还有一个问题就是,第一种算法不能解决,当出现次数最多的数字有2个或者2个以上的时候,这个算法就不能解决问题了。
第二种解决方法:
#include <iostream>
using namespace std;
#define DIM(a) sizeof(a)/sizeof(*a) //求一个数组的长度
void search(int a[],int len)
{
int sp[1000]={0};
int max=0;
for(int i=0;i<len;i++)
{
sp[a[i]-1]++;
}
for(int i=0;i<1000;i++)
{
if(max<sp[i])
{
max=sp[i];
}
}
for(int i=0;i<1000;i++)
{
if(sp[i]==max)
{
cout<<"max:"<<i+1<<endl;
}
}
}
int main()
{
int a[]={9,9,9,1,1,1,2,2,2,6,6,6,4,4,4,7,7,7,7,7,7,9,9,9};
search(a,DIM(a));
return 0;
}
第二种算法:时间复杂度为O(n),并且能够很好的解决当出现最多的数字不止一个的时候的问题。