1 动态分配数组
1.1 一维
定义:
int n=...;
int* a=new int[n];
回收:
delete[ ] a;
//delete后的括号不可少,否则只回收首元素
1.2 二维
定义:
int m=...,n=...;
int** a=new int*[m];
for(int i=0;i<n;i++)
{a[i]=new int[n];}
回收:
for(int i=0;i<m;i++)
{delete[ ] a[i];}
delete[ ] a;
Ps:我写c++习惯用new申请内存,c#好像是用malloc函数来动态分配内存的,不过二者有些区别,ai给的区别总结如下:
“malloc和new是用于动态内存分配的两种方法,它们之间有以下区别:
-
标准库函数 vs C++运算符:malloc和free是C标准库函数,而new和delete是C++运算符。
-
返回类型:malloc返回无类型的指针(void*),而new返回有类型的指针。
-
内存分配失败处理:malloc在内存分配失败时返回空指针,而new在内存分配失败时会抛出异常。
-
构造和析构函数的调用:new会调用对象的构造函数进行初始化,而delete会调用对象的析构函数进行清理。而malloc和free不会调用构造和析构函数。
-
动态对象的要求:由于new会调用构造和析构函数,所以它可以满足动态对象的要求,而malloc和free无法满足动态对象的要求。
2. 时间复杂度O(g(n))的定义
2.1 感觉至上【不严谨了TvT】
经常看到分析算法优劣时会给出其中一种形如O(n)、O(n^2)、O(nlogn)······的指标,这可以表示时间复杂度/空间复杂度。刚开始对这个东西只是有个模糊的概念,大概知道一般来讲,时间复杂度和空间复杂度都跟算法的先进性呈负相关,也不敢太绝对地讲越低越好,毕竟大部分情况有得就有失,这个低了,那个就高了,况且评价一个算法的优劣也不只有这两种角度。不过大体上还是这俩指标低一些的算法更优。
2.2 定义【严谨!^V^】
之后学习到了相对之前那种纯凭直觉理解更严谨的定义,反过来印证了之前的感觉大方向上是正确的。定义如下:
假设,现在我们有俩函数:f(n)和g(n)。 常数c0, 自然数N,使得当n N时有 f(n) g(n) ,则定义为f(n) O(g(n))。
2.3 拓展:(g(n))与(g(n))
(g(n)): 常数c0, 自然数N,使得当n N时有 f(n) g(n) ,则定义为f(n) (g(n))。
易得,f(n) O(g(n)) g(n) (f(n));g(n) O(f(n)) f(n) (g(n)) 。
(g(n)) : 常数c10和c20, 自然数N,使得当n N时有 c2·g(n) f(n) c2·g(n) ,则定义为f(n) (g(n))。【其实就是:f(n) O(g(n))且f(n) (g(n))。】
易得,f(n) (g(n)) g(n) (f(n)) 。
3.常见的复杂度算式