小编Ben*_*mer的帖子

为什么C不会从strtok设置的malloc'd char*中释放内存?

此函数将具有空格分隔值的文本文件中的值读取到2d数组中.当我运行它时,工作得很好 - 但通过Valgrind进行内存泄漏检查确认Xcode怀疑"char*splitString"从未被释放,这是它被称为的两次.我不明白这一点,考虑到我的"char*buffer"似乎被释放得很好.任何帮助都非常感谢!

int** readMatrixFile(char* inFileName, int** matrix, int sizeY, int sizeX)
{
    FILE* matrixFP;
    int ii=0, jj=0, fileValid = 1;
    char *buffer, *splitString;
    const char delim[]=" \n\r";

    matrixFP = fopen(inFileName, "r");
    if(matrixFP != NULL)
    {
        /*Check if file is the same size as specified by the command line
         *assumed valid until the file is checked*/
        splitString = malloc(100*sizeof(char)); <------where allocated
        buffer = malloc(5000*sizeof(char));
        do
        {
            fgets(buffer, 5000, matrixFP);
            jj=0;
            splitString = strtok(buffer, delim);
            while(splitString != NULL)
            {
                jj++;
                splitString …
Run Code Online (Sandbox Code Playgroud)

c arrays string malloc free

2
推荐指数
1
解决办法
316
查看次数

为什么逆Ackermann函数用于描述Kruskal算法的复杂性?

在一个用于分析算法的类中,我们为Kruskal算法提供了这个伪代码:

Kruskal的算法伪代码

然后他说明了以下不相交的森林:

m个MAKE-SET,UNION和FIND-SET操作的序列,其中n个是MAKE-SET操作,可以在不相交的森林上执行,在最坏情况下的时间O( mα)中通过秩和路径压缩进行并联(n)).

用于计算步骤2和步骤5-8的复杂性

对于连接的G:| E | ≥| V | -1; m = O(V + E),n = O(V);

所以步骤2,5-8:O((V + E)α(V))= O(Eα(V))

α(V)= O(lg V)= O(lg E); 所以我们得到O(E lg E)----- //这里α(V)如何相等?

Kruskal:步骤3,5-8和步骤4:O(E lg E)

观察:| E | <| V | 2 - > lg E = O(lg V)

所以,Kruskal的复杂性:O(E lg V)

我试图理解这个"alpha(n)"/"α(n)"函数背后的逻辑,从我所读到的看来,简单地说,Ackermann函数是指数速度快得令人难以置信的,而且逆是以对数方式非常缓慢地增长.

如果我的解释是正确的,"α(n)"代表什么?这是否意味着MAKE-SET操作最多为O(lg n)?如何/为什么使用逆阿克曼是必要的?我的印象是这个操作执行V次(对于每个顶点).在此之后,α(V)也被简化为O(lg V)= O(lg E),这是否意味着,在最大值时,α(V)可以由O(lg V)表示.

另外,为什么是| E | <| V | ^ 2 - > lg E = O(lg V) …

algorithm complexity-theory graph-theory ackermann kruskals-algorithm

1
推荐指数
1
解决办法
1695
查看次数