赞
踩
@开始数据结构之旅
通俗来讲,是数据的组织形式。学习数据结构,让我更快,
更优的写出好的算法,何为好的算法呢,接下来,
从时间复杂度,和空间复杂度来认识。
概括一句话是:
时间复杂度主要衡量一个算法的运行快慢,
而空间复杂度主要衡量一个算法运行所需要的额外空间。
Tips: 算法中的基本操作的 执行次数,为算法 的时间复杂度。
Tips: 是对一个算法在运行过程中 临时 占用 存储空间大小的量度 。
在时间复杂度里面只看执行次数;
o(1),代表常数次
O(N),代表最大项,执行n次,
举个例子:
N^2+2N+10--->2^N
O(N^2)
比如:
void Func1(int N) ** N^2+2N+10--->2^N** { int count = 0; for (int i = 0; i < N ; ++ i) { for (int j = 0; j < N ; ++ j) { ++count; } } for (int k = 0; k < 2 * N ; ++ k) { ++count; } int M = 10; while (M--) { ++count; }
void fun(int n) {
int i=l;
while(i<=n)
i=i*2;
}
** 在这里,这不是N,O(N)**
执行次数不到N,每次都2倍的缩短,设执行次数x
N(N个数,原本执行n次)=2^x;
所以 x=loogN
接着来,接着理解递归时间复杂度
int f ( unsigned int n ) {
if (n == 0 || n==1)
return 1;
else
return n * f(n-1);
}
递归n次,结果是n!,不用管!!
** 每次执行1次,执行 n 次**
还有二分法时间复杂度
int BinarySearch(int* a, int n, int x) { assert(a); int begin = 0; int end = n-1; // [begin, end]:begin和end是左闭右闭区间,因此有=号 while (begin <= end) { int mid = begin + ((end-begin)>>1); if (a[mid] < x) begin = mid+1; else if (a[mid] > x) end = mid-1; else return mid; } return -1; } ** 二分法里面,n/2*(n-1)=x x就是执行次数 **
long long* Fibonacci(size_t n) {
if(n==0)
return NULL;
long long * fibArray = (long long *)malloc((n+1) * sizeof(long long));
fibArray[0] = 0;
fibArray[1] = 1;
for (int i = 2; i <= n ; ++i)
{
fibArray[i] = fibArray[i - 1] + fibArray [i - 2];
}
return fibArray; }
**
malloc创建了新的空间n+1--》O(N)
**
int** fun(int n) {
int ** s = (int **)malloc(n * sizeof(int *));
while(n--)
s[n] = (int *)malloc(n * sizeof(int));
return s;
**
此处开辟的是一个二维数组,数组有n行,
每行分别有1,2,3,...n列,所以是n(n + 1)/2个元素空间,
空间复杂度为n^2
**
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。