不知道以后会不会忘了
2009年12月17日星期四
2009年12月8日星期二
关于这么一个指针传参数的问题
今天在写一个函数,就是要重新给一个指针分配一块内存。比如
void renew(int * array, int b)
{
delete [] array;
int size = 2*b;
array = new int[size];
memset(array,13,sizeof(int)*size);
}
void main()
{
int * array;
int size = 13;
array = new int [size];
memset(array,0,sizeof(int)*size);
renew(array);
delete [] array;
}
结果胡折腾了一会,企图修改数组的内容,实际上毛用都没。后来哥悟到了,具体参考这里。
不过哥哥有个比那文章稍好点的解决方法,那文章说真要用,就用int **。其实当然也可用一个指针的拷贝,这样具体代码都不用改,那么,请听题,如果修改renew函数的参数?
A) void renew( &(int * array), int b)
B) void renew( int &(*array), int b)
C) void renew( int &* array, int b)
D) void renew( int *& array, int b)
void renew(int *&array, int b)
void renew(int * array, int b)
{
delete [] array;
int size = 2*b;
array = new int[size];
memset(array,13,sizeof(int)*size);
}
void main()
{
int * array;
int size = 13;
array = new int [size];
memset(array,0,sizeof(int)*size);
renew(array);
delete [] array;
}
结果胡折腾了一会,企图修改数组的内容,实际上毛用都没。后来哥悟到了,具体参考这里。
不过哥哥有个比那文章稍好点的解决方法,那文章说真要用,就用int **。其实当然也可用一个指针的拷贝,这样具体代码都不用改,那么,请听题,如果修改renew函数的参数?
A) void renew( &(int * array), int b)
B) void renew( int &(*array), int b)
C) void renew( int &* array, int b)
D) void renew( int *& array, int b)
void renew(int *&array, int b)
2009年12月5日星期六
关于向量夹角的问题
昨天一个问题貌似没想通,太囧了,看起来貌似很简单。
就是三维空间中,给了两个向量,就它们之间的夹角。当然有内积是,然后acos是可以算出来的。不过这个角度是无视转向。两个步骤可以结局,首先是要找一个法向量;其次是假定在一个平面中,求个带正负的面积。
就是三维空间中,给了两个向量,就它们之间的夹角。当然有内积是,然后acos是可以算出来的。不过这个角度是无视转向。两个步骤可以结局,首先是要找一个法向量;其次是假定在一个平面中,求个带正负的面积。
关于一种图,不知道它有没有确切定义
在做2-SAT的时候发现的。就是在一个有向图中,不断地加边,直到找不出这样的边。这样的边uv是指对某一个点u,通过一条路径能到达v。我想不起有没有这样的定义。反正有一点可以确定,就是如果有环就是强连通分支。
2009年12月4日星期五
关于NP证明
自己先不严谨总结了一下,证明一个问题是NP难。粗俗地说,就是别SB,要BS。
首先得有一个问题B,是已知的NP难,也就是说,它的解法至少是非多项式时间的。
然后我们要证明的是一个问题S,怎么证呢?
如果我们能找一个方法把B问题变成S问题,这个变换的方法得是多项式时间的。
这样就可以证明要解决S问题,也是至少得非多项式时间的。
这里关键就是要把已知的B问题变成S问题,而不是把S问题变成B问题。
首先得有一个问题B,是已知的NP难,也就是说,它的解法至少是非多项式时间的。
然后我们要证明的是一个问题S,怎么证呢?
如果我们能找一个方法把B问题变成S问题,这个变换的方法得是多项式时间的。
这样就可以证明要解决S问题,也是至少得非多项式时间的。
这里关键就是要把已知的B问题变成S问题,而不是把S问题变成B问题。
订阅:
博文 (Atom)