设A是我有3D坐标x,y,z的点,我想将它们转换为2D坐标:x,y.投影应在由给定法线定义的平面上正交.平凡的情况,其中法线实际上是其中一个轴,它很容易解决,只是简单地消除了一个坐标,但其他情况如何更容易发生?
我已经知道new[]运算符首先分配内存,然后为每个元素调用构造函数,并且delete[]运算符首先为每个元素调用析构函数,然后释放内存,因此,它们都具有O(n)时间复杂度.
但是如果我有一个类,我没有定义任何构造函数/析构函数,复杂性仍然是O(n),还是只是O(1)?
例如,如果我有两个类:
class foo
{
public:
int a;
foo()
{
a = 0;
// more stuff
}
~foo()
{
a = 1;
// some useful stuff here
}
};
class boo
{
public:
int a;
};
Run Code Online (Sandbox Code Playgroud)
我创建了两个这样的数组:
int n = 1000;
foo* pfoo = new foo[n];
boo* pboo = new boo[n];
Run Code Online (Sandbox Code Playgroud)
我很确定第一个new调用会有O(n)复杂度,但第二个调用呢?将new只分配必要的内存,就是这样,还是会调用一些默认的构造函数(我不知道,如果这样的事情居然在退出C++)每个元素?
同样的问题delete:
delete [] pfoo;
delete [] pboo;
Run Code Online (Sandbox Code Playgroud)
当我删除第二个数组时,复杂性仍然是O(n),还是只会delete以O(1)复杂度释放内存?
我有3个功能,分别来自下面的代码,运行800x800次:
while下面的每个循环之前运行正好800次iter1 == lim,因此测量持续时间为800x800x800(512百万)次.
iter1,iter2并且lim是double指针.他们指向一个足够大的矢量double.
sum是一个double局部变量.
s1并且s2是当地unsigned int的,都等于800.
首先在2.257秒内运行:
while ( iter1 < lim )
{
sum += *iter1 * *iter2;
++iter1;
iter2 += s2;
}
Run Code Online (Sandbox Code Playgroud)
第二次运行7.364秒:
while ( iter1 < lim )
{
sum += *iter1 * *iter2;
iter1 += s1;
iter2 += s2;
}
Run Code Online (Sandbox Code Playgroud)
第三次运行1.355秒:
while ( iter1 < lim )
{
sum += *iter1 * *iter2;
++iter1; …Run Code Online (Sandbox Code Playgroud)