笔记1-补充一些经常忘的常识

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是用于动态内存分配的两种方法,它们之间有以下区别:

  1. 标准库函数 vs C++运算符:malloc和free是C标准库函数,而new和delete是C++运算符。

  2. 返回类型:malloc返回无类型的指针(void*),而new返回有类型的指针。

  3. 内存分配失败处理:malloc在内存分配失败时返回空指针,而new在内存分配失败时会抛出异常。

  4. 构造和析构函数的调用:new会调用对象的构造函数进行初始化,而delete会调用对象的析构函数进行清理。而malloc和free不会调用构造和析构函数。

  5. 动态对象的要求:由于new会调用构造和析构函数,所以它可以满足动态对象的要求,而malloc和free无法满足动态对象的要求。

2. 时间复杂度O(g(n))的定义

2.1 感觉至上【不严谨了TvT】

 经常看到分析算法优劣时会给出其中一种形如O(n)、O(n^2)、O(nlogn)······的指标,这可以表示时间复杂度/空间复杂度。刚开始对这个东西只是有个模糊的概念,大概知道一般来讲,时间复杂度和空间复杂度都跟算法的先进性呈负相关,也不敢太绝对地讲越低越好,毕竟大部分情况有得就有失,这个低了,那个就高了,况且评价一个算法的优劣也不只有这两种角度。不过大体上还是这俩指标低一些的算法更优。

2.2 定义【严谨!^V^】

之后学习到了相对之前那种纯凭直觉理解更严谨的定义,反过来印证了之前的感觉大方向上是正确的。定义如下:

假设,现在我们有俩函数:f(n)和g(n)。\exists 常数c>0,\exists 自然数N,使得当n \geqslant N时有 f(n) \leqslant g(n) ,则定义为f(n) = O(g(n))。


2.3 拓展:\Omega(g(n))与\theta(g(n)) 

\Omega(g(n)):\exists 常数c>0,\exists 自然数N,使得当n \geqslant N时有 f(n) \geqslant g(n) ,则定义为f(n) = \Omega(g(n))。

易得,f(n) = O(g(n)) \Leftrightarrow g(n) = \Omega(f(n));g(n) = O(f(n)) \Leftrightarrow f(n) = \Omega(g(n)) 。

\theta(g(n)) :\exists 常数c1>0和c2>0,\exists 自然数N,使得当n \geqslant N时有 c2·g(n)\leqslant f(n)\leqslant c2·g(n) ,则定义为f(n) = \theta(g(n))。【其实就是:f(n) = O(g(n))且f(n) = \Omega(g(n))。】

易得,f(n) = \theta(g(n)) \Leftrightarrow g(n) = \theta(f(n))  。


3.常见的复杂度算式

  • 9
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值