Algorithm 确定数组长度的算法

Algorithm 确定数组长度的算法,algorithm,Algorithm,描述一种可以确定数组长度的算法,单位为O(logn)。Ok。尽管你的问题相当模糊,我还是会把我上面的评论作为回答 通过i=1,2^1,2^2。。。2^m,直到出现ArrayIndexOutofBounds错误 然后在2^(m-1)和2^ m之间搜索二进制文件,直到找到错误消失的边界。那是n 是O(logn) 编辑 此建议基于您作为注释发布的代码段,其中很明显允许您检测ArrayIndexOutofBounds。尽管你的问题相当模糊,我还是会把我上面的评论作为回答 通过i=1,2^1,2^2。。。

描述一种可以确定数组长度的算法,单位为O(logn)。

Ok。尽管你的问题相当模糊,我还是会把我上面的评论作为回答

通过i=1,2^1,2^2。。。2^m,直到出现ArrayIndexOutofBounds错误

然后在2^(m-1)和2^ m之间搜索二进制文件,直到找到错误消失的边界。那是n

是O(logn)

编辑


此建议基于您作为注释发布的代码段,其中很明显允许您检测ArrayIndexOutofBounds。尽管你的问题相当模糊,我还是会把我上面的评论作为回答

通过i=1,2^1,2^2。。。2^m,直到出现ArrayIndexOutofBounds错误

然后在2^(m-1)和2^ m之间搜索二进制文件,直到找到错误消失的边界。那是n

是O(logn)

编辑

此建议基于您作为注释发布的代码段,其中很明显允许您检测ArrayIndexOutofBounds

C样式的伪代码:

int lengthOfArray(p){
    int j = 1;
    try{
        while(j < Integer.MaxValue){
            p[j]; // Might need to do something more with p[i] 
                  // to test bound.
            j *= 2;
        }
    }catch(ArrayIndexOutOfBounds e){
    }
    j = searchArrayHelper(p, j/2, j);

    try{
        while(1){
            // This loop is guaranteed to run O(log n) times or less.
            p[j];
            j++;
        }
    }catch(ArrayIndexOutOfBounds e){
        j--;
    }

    return j;
}

int searchArrayHelper(p, int i, int j){
    try{
        p[j];
    } catch (ArrayIndexOutOfBounds e){
        int mid = (i + j)/2;
        return searchArrayHelper(p, i, mid);
    }
    return i;
}
int lengthOfArray(p){
int j=1;
试一试{
而(j
C样式伪代码:

int lengthOfArray(p){
    int j = 1;
    try{
        while(j < Integer.MaxValue){
            p[j]; // Might need to do something more with p[i] 
                  // to test bound.
            j *= 2;
        }
    }catch(ArrayIndexOutOfBounds e){
    }
    j = searchArrayHelper(p, j/2, j);

    try{
        while(1){
            // This loop is guaranteed to run O(log n) times or less.
            p[j];
            j++;
        }
    }catch(ArrayIndexOutOfBounds e){
        j--;
    }

    return j;
}

int searchArrayHelper(p, int i, int j){
    try{
        p[j];
    } catch (ArrayIndexOutOfBounds e){
        int mid = (i + j)/2;
        return searchArrayHelper(p, i, mid);
    }
    return i;
}
int lengthOfArray(p){
int j=1;
试一试{
而(j
你的问题太重要了,让我想做家庭作业。你可以在O(1)中找到数组的长度。我们需要更多的上下文来回答这个问题。@TheBigO:请在C中实现
int lengthOfArray(void*p)
。下面是我如何调用您的方法:
int*p=(int*)malloc(sizeof(int)*42);int length=长度farray((void*)p);printf(“%d\n”,长度)如果这太难,实现
int lengthOfArray(int*p)我将如上所述调用,而不强制转换为
void*
@Jason,我在下面添加了一个答案,给出了新的信息。请使用0,1,2^1,2^2的“算法”,。。。2^m,直到阵列索引超出边界。然后在2^(m-1)和2^ m之间搜索二进制文件。是O(logn)你的问题如此迫切,让我感觉像是在做作业。你可以在O(1)中找到数组的长度。我们需要更多的上下文来回答这个问题。@TheBigO:请在C中实现
int lengthOfArray(void*p)
。下面是我如何调用您的方法:
int*p=(int*)malloc(sizeof(int)*42);int length=长度farray((void*)p);printf(“%d\n”,长度)如果这太难,实现
int lengthOfArray(int*p)我将如上所述调用,而不强制转换为
void*
@Jason,我在下面添加了一个答案,给出了新的信息。请使用0,1,2^1,2^2的“算法”,。。。2^m,直到阵列索引超出边界。然后在2^(m-1)和2^ m之间搜索二进制文件。它是O(logn)在你的第二个函数中,你似乎返回了你发现的第一个p[j],它不会触发ArrayIndexOutOfBounds,但是你怎么确定p[j+1]会触发它,所以j是数组长度呢?@belisarius,你是对的,那里可能有一个小错误。我将编辑答案以发布一个快速修复。我做了修复,尽管它感觉像一个肮脏的黑客。如果您注意到任何其他错误,请告诉我。在第二个函数中,您似乎返回了您发现的第一个p[j],它不会触发ArrayIndexOutOfBounds,但您如何确定p[j+1]会触发它,因此j是数组长度?@belisarius,您是对的,那里可能有一个小错误。我将编辑答案以发布一个快速修复。我做了修复,尽管它感觉像一个肮脏的黑客。如果您注意到任何其他错误,请告诉我。