目录
一、定义
时间复杂度定义:算法的时间复杂度是一个函数,它定量描述了该算法的远行时间。一个算法所花费的时间与其中语句的执行次数成正比例,算法中的基本操作的执行次数,为算法的时间复杂度。
空间复杂度定义:空间复杂度也是一个数学表达式,是对一个算法在运行过程中临时占用存储空间大小的量度。
时间复杂度和空间复杂度都是用大O渐进表示法表示。
一般算法常见的复杂度如下:
二、数组轮转
1.暴力求解
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9 };
int sz = sizeof(arr) / sizeof(arr[0]);
int k = 19;
int i = 0;
int tmp = 0;
for (i = 0; i < k; i++)
{
tmp = arr[sz - 1];
int j = 0;
for (j = sz-2; j >= 0; j--)
{
memmove(arr+j+1, arr+j, sizeof(int));
}
arr[0] = tmp;
}
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
2.三段逆置
void swap(int* arr, int left, int right)
{
while (left < right)
{
int tmp = arr[left];
arr[left] = arr[right];
arr[right] = tmp;
++left;
--right;
}
}
int main()
{
int arr[] = { 1,2,3,4,5,6,7,9 };
int sz = sizeof(arr) / sizeof(arr[0]);
int k = 3;//表示逆置3次
//加上取模判断条件
if (k > sz)
{
k %= sz;
}
//调用swap函数
swap(arr, 0, sz - k - 1);// 5 4 3 2 1 6 7 9
swap(arr, sz - k, sz - 1);// 5 4 3 2 1 9 7 6
swap(arr, 0, sz - 1);//6 7 9 1 2 3 4 5
//打印
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);//6 7 9 1 2 3 4 5
}
return 0;
}
3.空间换时间
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8 };
int sz = sizeof(arr) / sizeof(arr[0]);
int* tmp = (int*)malloc(sizeof(int) * sz);
int k = 3;
memcpy(tmp, arr + sz - k, sizeof(int) * k);
memcpy(tmp + k, arr, (sz - k) * sizeof(int));
memcpy(arr, tmp, sz * sizeof(int));
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
关于时间复杂度和空间复杂度,我们要考虑最坏的情况为结果 。对于暴力求解最坏的情况要逆置n-1次,而有n个数都要进行逆置(n-1)*n等于n^2-n,所以暴力求解的时间复杂度为O(n^2),暴力求解的空间复杂度为O(1)。三段逆置的时间复杂度为O(N),空间复杂度为O(1)。空间换时间的时间复杂度和空间复杂度都是O(N)。
格局要往大的想。
时间一去不复返,
空间可以重复利用。